是否可以设置一个复杂断点,该断点的条件包括检查传递给外部函数(frame)的参数。
例如
1 #0 sample::_processMessage (this=0xa5c8c0, data=0x7fffe5ae31db "\027w\270߸\023\032\212\v", line=0x7fffe4799db8 "224.4.2.197:60200", should_process=true) a sample.cpp:426
2 #1 0x00007ffff682f05d in sample::_process (this=0xa5c8c0, should_process=true, line=0x7fffe4799db8 "224.4.2.197:60200", data=0x7fffe5ae31db "\027w\270߸\023\032\212\v", sn=31824) a sample.cpp:390
3 #2 0x00007ffff6836744 in sample::drain (this=0xa5c8c0, force=true) at sample.cpp:2284
4 #3 0x00007ffff682ed81 in sample::process (this=0xa5c8c0, mdData=0x7fffe67914e0) at sample.cpp:354
这里我想在sample.cpp:356上设置一个断点,它在函数process-frame#3中打开, 如果在遇到断点时_process或#1帧具有sn == 31824
所以实际断点是在函数_process,但我想在函数过程中暂停执行
提前致谢
答案 0 :(得分:4)
我不知道是否可以创建引用外部框架的条件断点,但您可以使用断点命令来实现类似的结果。
以下是gdb会话的示例:
(gdb) break some-location
(gdb) commands
Type commands for breakpoint(s) 1, one per line.
End with a line saying just "end".
>silent
>up
>if (sn != 31824)
>continue
>end
>end
现在每次gdb
点击断点时,它都会自动向上移动一帧,检查sn
并在值不正确时继续。这不会比条件断点慢任何(或者更多),并且唯一真正的缺点是每次遇到断点时它都会打印出一行,即使gdb然后继续。
命令列表中的silent
会减少在遇到断点时产生的一些正常输出,可以删除它以获得更详细的体验。