GDB宏维护对象的计数器

时间:2015-03-05 12:15:08

标签: python gdb

我需要维护在gdb脚本中迭代对象列表时看到的每种类型对象的计数器并最后打印它。

因为gdb不支持字典(键,值对)

例如,在python中,

    counts = {}
    //get opcode
    if not opcode in counts:
           counts[opcode] = 1
    else:
          counts[opcode] += 1

我怎么能在gdb宏中做到这一点?

2 个答案:

答案 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