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)
我想在崩溃发生前检查一些全局变量。该问题仅在某个堆栈跟踪上重现,并且在最内层函数(或堆栈中的任何其他函数)上设置断点不会让我足够接近。
只有栈顶有这样的东西才能达到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)