gdb 指针上的漂亮打印?

问题描述 投票:0回答:0

我特别希望

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
linux gdb pretty-print
© www.soinside.com 2019 - 2024. All rights reserved.