我想在gdb中创建一个python漂亮的打印机。在我试图调试的程序中有一个隐藏的数据类型xyzHandle。我可以使用C函数从这个句柄中提取一些信息;我可以在gdb调试器中调用这个函数。例如:
xyzHandle object1 = api_get_first_object();
(gdb) print (char *)xyz_get_string(1, object1)我知道我可以创建类似于'pn‘的gdb命令并使用它;但是我想使用内置python (gdb)来创建一个漂亮的打印机,如果它看到'xyzHandle’,它将调用'xyz_get_string(1,object1)‘,然后只打印返回的字符串。这样(gdb)我就可以简单地键入'print object1‘。
我读过如何创建一个简单的gdb-python pretty_printer,但是我不知道如何调用驻留在我从python调试的程序中的函数。
这是我的xyzHandle对象的漂亮打印机示例。
# To load this into your gdb session
#
# (gdb) python execfile ("script-name")
#
import gdb.printing
class xyzHandlePrinter:
"""Print an xyzHandle object"""
def __init__(self, val):
self.val = val
def to_string(self):
return ( str( ???how-do-I-call xyz_get_str???) )
def build_pretty_printer():
pp = gdb.printing.RegexpCollectionPrettyPrinter("XYZ Library")
pp.add_printer('xyzHandle Printer', '^xyzHandle', xyzHandlePrinter)
return pp
gdb.printing.register_pretty_printer(
gdb.current_objfile(),
build_pretty_printer())发布于 2017-12-11 20:25:18
创建一个漂亮的打印机,如果它看到'xyzHandle‘,它将调用'xyz_get_string(1,object1)’,然后打印返回的字符串。
这通常是个坏主意:您漂亮的打印机将在“活动”进程上工作,但在死后(core文件)调试时会出错。如果您在纯Python中复制xyz_get_string的功能,通常情况会更好。
我不知道如何调用驻留在我从python调试的程序中的函数。
为此您可以使用gdb.parse_and_eval。
https://stackoverflow.com/questions/47756251
复制相似问题