GDB可以在一系列函数调用中设置断点吗?

7
我希望在崩溃发生之前检查一些全局变量。该问题只会在特定的堆栈跟踪上复现,设置断点在最内层函数(或堆栈的任何其他函数)上将无法使我接近足够的位置。
我能否仅在堆栈顶部包含类似以下内容时实现中断结果?
#0 __GI_connect
#1 curl_connect
#2 get_file
#3 init_assets

仅仅做着

b init_assets
c
b get_file
c
...

由于 init_assets 被调用多次且不是每次都调用 curl,因此 gdb 将在使用 curl 的无关代码处中断。

稍后的编辑:另一种方法是:

b inner_func
ignore 1 10000
r
# app crashes
info b

Breakpoint 1 has been hit 10 times.

然后您需要移除断点,再添加回去并只忽略9次。当您再次运行应用程序时,gdb将在第10次停止——即inner_func崩溃时。

如果执行有太多变化,您还可以在Mozilla的rr中记录应用程序。

1个回答

15

您可以使用带有$_caller_is便捷函数的条件断点。 就像这样:

(gdb) break connect
Breakpoint 1 at 0x7ffff7ee6820
(gdb) cond 1 $_caller_is("curl_connect") && $_caller_is("get_file", 2) && $_caller_is("init_assets", 3)

哇!_caller_is 很方便。此问题的先前答案:https://dev59.com/jW435IYBdhLWcg3wlBCC#5372742 - Employed Russian
在没有调试符号的情况下,是否可以使用 $_caller_is,例如将其与堆栈帧地址进行匹配? - Llamageddon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接