可以注册蟒蛇很prointer:https://sourceware.org/gdb/onlinedocs/gdb/Writing-a-Pretty_002dPrinter.html,并用它来获得这样的:
(gdb) p *[email protected]
$1 = {10, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
(gdb)
这是例子蟒蛇漂亮打印机:
>cat my_printer.py
class projection_printer:
def __init__(self, val):
self.val = val
def to_string(self):
return str(self.val['size'])
import gdb.printing
def build_pretty_printer():
pp = gdb.printing.RegexpCollectionPrettyPrinter("")
pp.add_printer('projection', '^projection$', projection_printer)
return pp
gdb.printing.register_pretty_printer(gdb.current_objfile(), build_pretty_printer())
这是一个测试程序:
>cat main.cpp
#include <stdlib.h>
typedef struct angle
{
int a;
} angle_t;
typedef struct projection {
angle_t angle;
int size;
} projection_t;
int main()
{
projection_t *projections;
projections = (projection_t *)malloc(sizeof(projection_t)*10);
projections[0].size = 10;
projections[0].angle.a = 20;
return 0;
}
而这是gdb会话:
>gdb -q -x my_printer.py a.out
Reading symbols from /home/a.out...done.
(gdb) start
Temporary breakpoint 1 at 0x4005ac: file main.cpp, line 18.
Starting program: /home/a.out
Temporary breakpoint 1, main() at main.cpp:18
18 projections = (projection_t *)malloc(sizeof(projection_t)*10);
(gdb) n
19 projections[0].size = 10;
(gdb)
20 projections[0].angle.a = 20;
(gdb)
22 return 0;
(gdb) p *[email protected]
$1 = {10, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
(gdb)
-1你拒绝了两个非常好的答案,建议在gdb中使用python或几个指令作为不方便,然后修改你的C代码?你应该澄清你的“容易”的定义,这样读者不会浪费时间去帮助你。 – 2014-01-21 12:02:57
这些答案为我解决问题提供了很好的信息,正如我在评论中强调的那样。这绝对不是浪费时间,也不应该被视为被拒绝,因为我确信它可以帮助其他知道Python的用户。 是的,我认为在C代码中添加一些指令并使用“调用”函数是一个很好的选择,因为它可能对每个人都有帮助。 – denaitre