【发布时间】:2011-04-28 03:57:20
【问题描述】:
我刚刚花了一些时间来寻找一个归结为以下内容的错误。代码错误地覆盖了堆栈,我认为它覆盖了函数调用的返回地址。返回后,程序将崩溃,堆栈将被破坏。在 valgrind 中运行程序会返回如下错误:
vex x86->IR: unhandled instruction bytes: 0xEA 0x3 0x0 0x0
==9222== valgrind: Unrecognised instruction at address 0x4e925a8.
我认为这是因为返回跳转到了一个随机位置,其中包含无效的 x86 操作码。 (虽然我有点怀疑这个地址 0x4e925a8 恰好在一个可执行页面中。我想如果不是这种情况,valgrind 会抛出一个不同的错误。)
我确定问题出在堆栈覆盖类型上,并且我已经修复了它。现在我正在尝试思考如何更有效地捕捉到这样的错误。显然,如果我在堆栈上重写 data,valgrind 不会警告我,但它可能会在有人在堆栈上写入返回地址时捕获。原则上,它可以检测到“推送 EIP”之类的事情何时发生(因此它可以标记返回地址在堆栈上的位置)。
我想知道是否有人知道 Valgrind 或其他任何东西是否可以做到这一点?如果没有,您能否评论有关有效调试此类错误的其他建议。
【问题讨论】:
-
我建议您针对 valgrind 提交愿望清单错误。
-
返回地址不是
push指令推送的,而是call指令隐式推送的。这样更容易检测到它的位置。 -
@Jan Hudec,这将是 Valgrind 中的一个简洁功能,不是吗?是的,
call推送返回地址是正确的,我这样写只是为了完全清楚。