当特定的断点在gdb中命中时执行特定的操作

我正在寻找一种方式来做一些特定的中断点在gdb中的行动。

基本上我有一些memleak在我的程序。 当malloc和free函数命中时,我需要进入函数(step)并且收集一些基本的信息,比如addr和size(基本上是打印那里的值)。 一旦完成恢复我的程序。

我们有什么好办法做到这一点?

例如,下面是当x是正数时,如何使用断点命令在inputfoo时输出x的值。

break foo if x>0 commands silent printf "x is %d\n",x cont end 

如果在命令列表中指定的第一个命令是silent ,则不会打印有关在断点处停止的常用消息。 对于打印特定消息然后继续的断点,这可能是可取的。 如果其余命令都没有打印任何内容,则不会看到已达到断点的符号。 只有在断点命令列表的开始处,沉默才有意义。

一个断点命令的应用是补偿一个错误,所以你可以testing另一个错误。 在错误的代码行之后放置一个断点,给它一个条件来检测错误已经完成的情况,并且给它命令分配正确的值给任何需要它们的variables。 以continue命令结束,以便程序不停止,并使用silent命令开始,以便不产生任何输出。 这里是一个例子:

 break 403 commands silent set x = y + 4 cont end 

澄清弗雷德里克的答案, commands (或只是command ,似乎)自动知道你只是设置一个断点。 也就是说,Fredrik所显示的不是一个多行break命令,而是两个单独的命令: breakcommands 。 它看起来像这样:

 (gdb) break 989 Breakpoint 23 at 0x7fffe2761dac: file foo.cpp, line 989. (gdb) command Type commands for breakpoint(s) 23, one per line. End with a line saying just "end". >silent >print result >end (gdb) c Continuing. $79 = {elems = {0, 0}} (gdb) 

dprintf (dynamicprintf

https://sourceware.org/gdb/onlinedocs/gdb/Dynamic-Printf.html

这是印刷物品的特殊情况的最方便的解决scheme:

 dprintf <line>, "%u\n", variable 

它也可能比commands更快,因为它可以编译和注入代码,而不是将控制权交给GDB来解释任意命令string。 TODO我不知道这是否实际完成。 dprintf vs commands : dprintf和break +命令+ continue有什么区别?

详细例子:

main.c

 #include <inttypes.h> #include <stdint.h> #include <stdio.h> #include <stdlib.h> int main(void) { uint32_t i; uint32_t r = 0; for (i = 0; i < 10; ++i) { r += i*i + 13*r*i + 17; /* LINE 10. */ } printf("%" PRIu32 "\n", r); return EXIT_SUCCESS; } 

然后:

 gcc -ggdb3 -O0 -std=c99 -o main main.c gdb -batch -nh -q -ex 'dprintf 10, "%u %u\n", i, r' -ex 'run' ./main 

输出:

 Dprintf 1 at 0x400545: file main.c, line 10. 0 0 1 17 2 256 3 6933 4 277346 5 14699371 6 970158528 7 3628079733 8 3070853710 9 317092431 3057168588 [Inferior 1 (process 14305) exited normally] 

在Ubuntu 14.04testing。