gpt4 book ai didi

c - GDB 损坏的堆栈帧 - 如何调试?

转载 作者:太空狗 更新时间:2023-10-29 16:14:40 27 4
gpt4 key购买 nike

我有以下堆栈跟踪。是否可以从中找出对调试有用的东西?

Program received signal SIGSEGV, Segmentation fault.
0x00000002 in ?? ()
(gdb) bt
#0 0x00000002 in ?? ()
#1 0x00000001 in ?? ()
#2 0xbffff284 in ?? ()
Backtrace stopped: previous frame inner to this frame (corrupt stack?)
(gdb)

当我们遇到 Segmentation fault 并且堆栈跟踪不是那么有用时,从哪里开始查看代码?

注意:如果我发布代码,SO 专家会给我答案。我想从 SO 那里获得指导并自己找到答案,所以我不会在这里发布代码。抱歉。

最佳答案

那些伪造的地址(0x00000002 等)实际上是 PC 值,而不是 SP 值。现在,当你得到这种带有伪造(非常小)PC 地址的 SEGV 时,99% 的情况是由于通过伪造的函数指针调用。请注意,C++ 中的虚拟调用是通过函数指针实现的,因此虚拟调用的任何问题都可能以相同的方式表现出来。

间接调用指令只是将调用后的 PC 压入堆栈,然后将 PC 设置为目标值(在这种情况下是伪造的),因此如果这发生了什么,您可以轻松地通过手动将 PC 从堆栈中弹出来撤消它。在 32 位 x86 代码中,您只需执行以下操作:

(gdb) set $pc = *(void **)$esp
(gdb) set $esp = $esp + 4

你需要 64 位 x86 代码

(gdb) set $pc = *(void **)$rsp
(gdb) set $rsp = $rsp + 8

然后,您应该能够执行 bt 并找出代码的真正位置。

另外 1% 的时间,错误将是由于覆盖堆栈,通常是溢出存储在堆栈中的数组。在这种情况下,您可以使用 valgrind 等工具更清楚地了解情况。

关于c - GDB 损坏的堆栈帧 - 如何调试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9809810/

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