如何在gdb中单步执行longjmp

wil*_*_e8 2 c gdb setjmp

我正在尝试修复其他人编写的代码中的错误,并且我试图在 gdb 中逐步了解发生了什么。但是我点击的其中一行是对 longjmp() 的调用,在该行点击“next”后,gdb 会继续正常执行,而不是中断正在执行的下一个源代码行。如果我在 longjmp() 行上尝试“step”,则会发生类似的继续。是否有任何 gdb 命令可以用来在 longjmp() 之后执行的下一个源代码行中断?

Tom*_*mey 5

值得注意的是,gdb 的行为是依赖于系统的。

在 Linux 上,nexta longjmpor 的throw工作方式与您预期的大致相同:如果非本地跳转的目标位于或高于当前帧,则执行将在那里停止。

这是在longjmp和 的实现中使用调试钩子实现的throw。因为throw这是通过辅助函数(旧方法)和所谓的 SystemTap 探针(又名“sdt 探针”)完成的。因为longjmp这只能通过 glibc 中的 sdt 探针完成。

为此,必须将探针支持编译到相关库中。您可以使用readelf -n. 至少 Fedora 正确地做到了这一点。

理论上可以longjmp在 gdb 中实现对其他平台的支持。然而,这可能是不平凡的。

您可以尝试解码jmp_buf,如其他评论中所述。但是请注意,在某些系统(例如 Linux)上jmp_buf,出于安全原因,对 中的目标 PC 进行了编码。所以你必须弄清楚如何解码它。

解决此问题的另一种方法是简单地单步longjmp执行。在那里设置一个断点,比如break longjmp; 用于disassemble查看装配体;然后si直到您逐步执行将执行转移到目标的指令。