GDB条件中断函数参数

时间:2014-11-12 16:45:07

标签: c 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

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

3 个答案:

答案 0 :(得分:5)

假设GNU / Linux平台上有x86-64 calling conventions,你可以直接检查%rdi(64位)寄存器来检查函数的第一个参数:

b calc if $rdi == 852479

即使您没有加载调试符号(因此没有代码列表,即calc),这也允许您在函数list calc上中断。

请注意,如果函数由optimizing compiler内联,则此方法将失败。

答案 1 :(得分:4)

来自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

答案 2 :(得分:3)

如果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,但是即使commands脚本跳过了断点,gdb也会打印该消息,如果经常遇到断点,这将是不可取的。

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