gpt4 book ai didi

c - 如何单步执行 gdb 中的 longjmp

转载 作者:行者123 更新时间:2023-12-02 08:17:42 27 4
gpt4 key购买 nike

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

最佳答案

值得注意的是,gdb 的行为是系统相关的。

在 Linux 上,nextlongjmpthrow 上的工作方式与您预期的大致相同:如果非本地跳转的目标是在当前帧或以上,执行将在那里停止。

这是在 longjmpthrow 的实现中使用调试 Hook 实现的。对于 throw,这是通过辅助函数(旧方法)和所谓的 SystemTap 探针(又名“sdt 探针”)完成的。对于 longjmp,这仅通过 glibc 中的 sdt 探测完成。

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

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

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

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

关于c - 如何单步执行 gdb 中的 longjmp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40408553/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com