我想在函数参数上设置断点,如果它大于某个值。以下虚拟代码:
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
但它不知道大小是什么,因为它是我猜的参数。如果参数等于某个数字,我将如何破坏。打破对此函数的所有调用都不是一个选项,因为它在多线程环境中被调用了十亿次。
假设 x86-64调用约定 在GNU / Linux平台上你可以检查 %rdi
(64位)直接注册以检查函数的第一个参数:
b calc if $rdi == 852479
这可以让你打破功能 calc
即使您没有加载调试符号(因此没有代码列表,即通过 list calc
)。
请注意,如果函数内联,此方法将失败 优化编译器。
来自 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
如果 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
但是,脚本。