繁体   English   中英

GDB中遇到某个断点如何做具体动作?

[英]How to do an specific action when a certain breakpoint is hit in GDB?

我正在寻找一种在 gdb 中遇到特定断点时执行某些操作的方法。

基本上我的程序中有一些内存泄漏。 当 malloc 和免费 function 命中时,我需要进入 function(步骤)并收集一些基本信息,如地址和大小(基本上打印那里的值)。 完成后恢复我的程序。

我们有什么好的方法来做到这一点吗?

例如,这里是如何使用断点命令在 x 为正时打印 foo 入口处的 x 值。

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

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

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

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

为了澄清 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) 

dprintf (动态printf

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

这是打印事物的特定情况下最方便的解决方案:

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

它也可能比commands更快,因为它可以编译和注入代码,而不是将控制权交还给 GDB 来解释任意命令字符串,这非常慢。 TODO 我不知道这是否真的完成了。 dprintf vs commandsdprintf vs break + commands + continue 有什么区别?

详细示例:

主要.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

Output:

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 中测试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM