我需要维护在gdb脚本中迭代对象列表时看到的每种类型对象的计数器并最后打印它。
因为gdb不支持字典(键,值对)
例如,在python中,
counts = {}
//get opcode
if not opcode in counts:
counts[opcode] = 1
else:
counts[opcode] += 1
我怎么能在gdb宏中做到这一点?
答案 0 :(得分:0)
这在某种程度上取决于opcode
是什么。
这个名字表明你正在寻找翻译或类似的东西。如果是这样,并且如果可能的值范围很小,那么只需使用gdb CLI就可以轻松完成;事实上,我之前已经做到了这一点。
基本上你只需要分配一个数组并使用操作码作为索引。类似的东西:
(gdb) set var counts = (int *) malloc (MAX * sizeof (int))
(gdb) call memset (counts, 0, MAX * sizeof (int))
(gdb) break somewhere
(gdb) commands
> silent
> set var counts[opcode] = counts[opcode] + 1
> cont
> end
这种方法适用于基本的事情。它有一个隐藏的问题,即断点命令中的cont
会干扰在命令行输入的next
。也就是说,如果您next
通过代码,并且断点被点击,next
的行为就像您键入cont
一样。这可以使用Python API修复。
如果opcode
的范围更大,那么您有几个选择。一种选择是找到一种方法将大范围压缩到更小并使用上述方法。另一种选择是简单地在Python中编写脚本,然后使用Python的关联数组。
答案 1 :(得分:0)
如今,您可以使用Python编写GDB脚本。您可以使用Python词典轻松存储对象计数。作为一个最基本的例子:
user@host $ gdb ./a.out
[...]
$ break main
Breakpoint 1 at 0x100000b60
$ commands
> python
>t = {}
>>$ break *main+0x2a
Breakpoint 3 at 0x100000b86
$ commands
>python
>t[0] = 1
>>gdb$ run
[...]
Breakpoint 3, 0x0000000100000b86 in main ()
$ python
> print(t)
>{0: 1}
有关API的完整列表,请参阅manual。