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

Can GDB set a breakpoint on a sequence of function calls?

我想在崩溃发生前检查一些全局变量。该问题仅在某个堆栈跟踪上重现,并且在最内层函数(或堆栈中的任何其他函数)上设置断点不会让我足够接近。

只有栈顶有这样的东西才能达到break的结果吗?

#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 中记录该应用程序。

您可以在 $_caller_is convenience function 中使用条件断点。像这样:

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