如果函数参数大于某个值,我想设置一个断点。下面的虚拟代码:
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
但它不知道大小是什么,因为它是我猜的参数。如果参数等于某个数字,我将如何中断。打破对此函数的所有调用都不是一个选项,因为它在多线程环境中被调用了十亿次。
答案 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
脚本中添加一些自定义通知。