【发布时间】:2017-08-30 03:15:56
【问题描述】:
我有一个捕捉到 EXCEPTION_ACCESS_VIOLATION 异常的向量异常处理程序。
Rip 和异常地址是不包含可执行代码的无效地址。
我需要找出它试图从哪里执行这个无效地址。
我检查了堆栈,但它不可靠。有时会说最后一个返回地址是调用 GetCurrentThreadId() 后返回的,但该 API 没有调用或跳转操作码,因此无法尝试从那里执行。
一个限制是我无法使用调试器单步执行应用程序。
如何找到异常之前执行的先前指令?
【问题讨论】:
-
这是什么目标? x86?
-
看起来像堆栈损坏由于某些自动局部变量的缓冲区溢出导致控制到达函数结束时出现异常。您能否运行一些验证程序,如 valgrind 或 Application Validator 来尝试在问题发生时而不是事后捕获此类问题?
-
在可疑例程的顶部/底部使用 fprintf/fflush 怎么样?当它崩溃时,您可以检查您的日志文件以查看您的位置,然后添加更多日志消息,直到您找到它为止。
-
@old_timer 它的 x64
-
您无法使用调试器单步执行应用程序代码?如果您可以在调试器中抛出应用程序并且可以很容易地触发异常,则可以在调试器中暂停应用程序,向上抛出断点,取消暂停,然后单步执行直到发生异常..
标签: c++ exception assembly exception-handling