当特定的断点在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
命令,而是两个单独的命令: break
和commands
。 它看起来像这样:
(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。