问题 GDB条件中断函数参数


我想在函数参数上设置断点,如果它大于某个值。以下虚拟代码:

int main(void)
{
    uint64_t num = 123456;
    uint64_t x   = 847534;

    uint64_t other = (num*x) - (x/num);

    .... other stuff here (multithreaded stuff)

    calc(other);
}

void calc(uint64_t size)
{
    ...do some stuff with size
}

我试图通过以下方式设置断点:

(gdb) b calc if size == 852479

但它不知道大小是什么,因为它是我猜的参数。如果参数等于某个数字,我将如何破坏。打破对此函数的所有调用都不是一个选项,因为它在多线程环境中被调用了十亿次。


11398
2017-11-12 16:45


起源

可能重复 当char * x指向一个值等于“hello”的字符串时,如何在gdb中设置条件断点? - Ricky Mutschlechner
您是否尝试在功能代码的第一行设置断点? - Leeor
@RickyMutschlechner我已经看过那个1并且它不是重复的,因为在代码x的情况下(有问题的变量)被gdb认为是可用的,因为它是在函数之外声明的变量。在我的例子中,这个变量是函数的参数。我成功地能够打破在函数外部声明的变量,但不能通过条件中断来破坏参数 - Nick.D
@ Nick.D,我的意思是有条件的休息 - Leeor
那个条件断点命令对我来说很好(gcc 4.8.2,CentOS 7上的gdb 7.6.1-51.el7)。我在启动gdb后立即键入它,而不运行目标。你看到这个问题的gcc / gdb版本和操作系统是什么? - Mark Plotnick


答案:


假设 x86-64调用约定 在GNU / Linux平台上你可以检查 %rdi (64位)直接注册以检查函数的第一个参数:

b calc if $rdi == 852479

这可以让你打破功能 calc 即使您没有加载调试符号(因此没有代码列表,即通过 list calc)。

请注意,如果函数内联,此方法将失败 优化编译器


5
2017-11-12 17:07





来自 gdb 提示:

break "file.c":100 if (size=852479)

要么

break "file.c":100 if (size>852479)

在这里我假设你想要第100行的条件断点,你的src文件是 file.c

即如果你想打破电话线 calc,那就是第100行 - 适当修改(你也必须替换 size 同 other 在这种情况下)

如果你用了一行没有。这是该报的第一个陈述之一 calc 功能然后你会坚持 size


3
2017-11-12 16:50



我遇到的问题是gdb在启动程序之前不知道“大小”可能是因为它是一个参数名而不是在函数外声明的变量。我现在正在尝试的一件事是在函数上设置一个断点,运行程序,现在gdb知道size变量,现在我正在对该变量进行条件中断。下面的示例(gdb)break file.c:calc(gdb)运行断点1,calc(size = 48)在file.c:67 in file.c(gdb)b如果size = 852479 //这是实际大小的地方由gdb(gdb)c识别 - Nick.D
是gdb意识到什么 之前 启动程序? 'other'是在调用calc之前声明并实例化的变量 - 因此你应该没有问题在它上面设置条件断点(也许我仍然误解这里的问题?) - bph


如果 break foo if arg1 == 14 由于某种原因不起作用(我遇到了一些函数/二进制文件,它没有),你可以尝试用它替换它 commands

commands 允许您设置一些gdb命令,每次命中断点时都会运行这些命令。要实现所需的效果 - 条件断点 - 您可以执行以下操作:

(gdb) b foo
Breakpoint 1 at 0x400633: file test.c, line 6.
(gdb) commands 1
Type commands for breakpoint(s) 1, one per line.
End with a line saying just "end".
>silent
>if arg1 != 14
 >cont
 >end
>end

只有在执行时,执行才会在断点处停止 arg1 == 14

唯一的缺点是 silent 抑制典型的“断点击中”消息。你可以删除 silent,但是即使跳过断点,gdb也会打印该消息 commands 脚本,如果断点经常被击中,这是不可取的。

您可以在里面添加一些自定义通知 command 但是,脚本。


3
2017-09-23 09:56