c-在GDB中达到某个断点时如何执行特定操作?

我正在寻找一种在gdb中遇到特定断点时采取某些措施的方法。

基本上我的程序中有一些memleak。 当malloc和free函数命中时,我需要进入函数(步骤)并收集一些基本信息,例如addr和size(基本上在此打印值)。 完成后,恢复我的程序。

我们有什么好办法吗?

Thangaraj asked 2020-01-12T22:28:39Z
3个解决方案
58 votes

例如,这是当x为正数时,可以使用断点命令在foo的入口处打印x的值的方法。

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

如果您在命令列表中指定的第一个命令是silent,则不会打印有关在断点处停止的常规消息。 对于要打印特定消息然后继续的断点,这可能是理想的。 如果其余命令均未打印任何内容,则看不到已达到断点的迹象。 只有在断点命令列表的开头,silent才有意义。

一个断点命令应用程序是为了补偿一个错误,因此您可以测试另一个错误。 在错误的代码行之后放置一个断点,为它提供一个条件,以检测出发生了错误的情况,并为它提供命令以将正确的值分配给需要它们的任何变量。 以continue命令结束,以便您的程序不会停止,并以silent命令开始,以便不产生任何输出。 这是一个例子:

break 403
commands
silent
set x = y + 4
cont
end
Fredrik Pihl answered 2020-01-12T22:29:16Z
48 votes

为了阐明Fredrik的答案,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) 
Ben answered 2020-01-12T22:29:37Z
7 votes

commands(动态dprintf

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

对于特定的打印情况,这是最方便的解决方案:

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

它也可能比2699965626579479420160更快,因为它可以编译和注入代码,而不是将控制权交还给GDB以解释任意命令字符串。 TODO我不知道这是否真的完成了。 dprintfcommands:dprintf与Break + Command + 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 16.04,GDB 8.2中测试。

translate from https://stackoverflow.com:/questions/6517423/how-to-do-an-specific-action-when-a-certain-breakpoint-is-hit-in-gdb