我特别希望
struct MyType*
打印特定值而不是显示十六进制指针。我的所有数据都显示为指针,这让我感到悲伤。在下面的测试中,我希望 byptr
显示字符串而不是地址。
我尝试使用通配符来使打印机超载。它可以工作,但不适用于指针。这是我的测试设置。我用来测试我的
.gdbinit
文件的行:
gdb -batch -ex 'file a.out' -ex 'b main.c:6' -ex 'r' -ex 'info args'
这是我的来源
main.c
typedef struct Test {
int a, b, c;
} Test;
int test(Test byval, Test*byptr) {
return 0;
}
int main() {
Test a;
return test(a, &a);
}
这是
.gdbinit
(您可能需要将其放入 ~/.gdbinit
或有一行写着 set auto-load safe-path /some/path
):
python
my = gdb.printing.RegexpCollectionPrettyPrinter("my")
class TestPrinter:
def __init__ (self, val):
self.val = val
def to_string(self):
return "Found in printer"
def display_hint (self):
return 'string'
my.add_printer('TestPrinter', '.*', TestPrinter)
gdb.printing.register_pretty_printer(gdb.current_objfile(), my)
end
-编辑-
我使用这个答案所说的内容尝试了下面的.gdbinit https://stackoverflow.com/a/67221418/22266410
gdb 打印出开始和结束,但从不打印 my_pp_func。我不确定出了什么问题。我正在使用 gcc 和 gdb 13.1
python
print("Start")
my = gdb.printing.RegexpCollectionPrettyPrinter("my")
class TestPrinter:
def __init__ (self, val):
self.val = val
def to_string(self):
return "Found in printer"
def display_hint (self):
return 'string'
my.add_printer('TestPrinter', '.*', TestPrinter)
class MyClassPointerPrinter:
def __init__(self, val):
self.ptr = val
self.name = str(val.dereference()["name"])
self.val = val.dereference()["value"]
def to_string(self):
return f"Pointer to MyClass(name={self.name}, value={self.val})"
def my_pp_func(val):
print("my_pp_func")
if str(val.type) == "ns::MyClass *":
return MyClassPointerPrinter(val)
gdb.pretty_printers.append(my_pp_func)
print("End")
end