虽然我没有时间学习所有的 gdb/python 漂亮打印理论,但我找到了一种在 gdb 中重用我的 C 打印机的简单方法。
将结构“struct_name_1”和“struct_name_2”链接到 C 函数“struct_printer_1_c_func”和“struct_printer_2_c_func”的示例:
1) 创建一个文件 struct_printers.py
class Pstruct (gdb.Function):
"""Returns a string describing a struct...
"""
def __init__ (self):
super (Pstruct, self).__init__ ("pstruct")
def invoke (self, name):
expr_type = name.dereference().type.tag
expr_string = name.__str__()
expr_address = expr_string.split(" ")[0]
if (cmp(expr_type, "struct_name_1") == 0):
return gdb.parse_and_eval("struct_printer_1_c_func("+ expr_address +")")
elif (cmp(expr_type, "struct_name_2") == 0):
return gdb.parse_and_eval("struct_printer_2_c_func("+ expr_address +")")
else:
print "[No struct printer for this type]"
return gdb.parse_and_eval(expr_address)
Pstruct ()
2)将此添加到您的 .gdbinit :
source struct_printers.py
define pstruct
p $pstruct($arg0)
end
然后,当您在 gdb 中指向要检查的结构的指针前面时,调用 pstruct 而不是 print。
可能丑陋且可扩展性差,但对于我需要的东西来说足够好(但是我很高兴有人知道使用 python 漂亮打印的东西来做到这一点的正确方法)。