GDB:使用涉及前一帧变量的条件设置复杂断点

rah*_*til 3 gdb

是否可以设置一个复杂的断点,该断点的条件涉及检查传递给外部函数(框架)的参数。

例如。

  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
Run Code Online (Sandbox Code Playgroud)

这里我想在 sample.cpp:356 上设置一个断点,它在函数 process-frame#3 中,如果 _process 或 frame #1 在击中断点时有 sn == 31824

所以实际上断点在函数 _process 但我想暂停函数进程中的执行

提前致谢

And*_*rew 5

我不知道是否可以创建引用外部框架的条件断点,但您可以使用断点命令来实现类似的结果。

下面是一个 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
Run Code Online (Sandbox Code Playgroud)

现在每次gdb遇到断点它都会自动向上移动一帧,检查sn如果值不正确并继续。这不会比条件断点慢任何(或多),唯一真正的缺点是每次遇到断点时它都会打印出一行,即使 gdb 然后继续。

silent命令列表减少了一些,当一个断点时所产生的正常输出,这可以拆下来获得更详细的体验。