我有一个向量异常处理程序,它捕获了EXCEPTION_ACCESS_VIOLATION异常。
Rip和exception地址是一个无效的地址,不包含可执行代码。
我需要找出它试图执行此无效地址的位置。
我检查了堆栈,这是不可靠的。有时候说最后一个返回地址是从调用GetCurrentThreadId()返回的,但是该API没有调用或跳转操作码,因此它无法尝试从那里执行。
一个限制是我无法使用调试器逐步完成应用程序。
如何找到之前在异常之前执行的指令?
答案 0 :(得分:1)
看起来你正在做错误的假设。访问违规可能基本上由三个原因发生。您要么尝试从无效地址读取数据,将数据写入无效地址,要么从无效地址读取指令。
在前两种情况下,指令指针有效,并指向具有内存操作数的指令。但你的情况显然是第三种,因为知识产权无效。
现在的问题是,IP是如何被破坏的?它几乎肯定是一个糟糕的跳跃或分支指令。但为什么那是第一个有问题的指令呢?您经常执行的字节不是要解释为指令。然后它也清楚堆栈是如何被破坏的。任何这些字节都可能是PUSH或POP指令。
x86没有真实的执行指令历史记录&#34 ;;你得到的最接近的是L1缓存内容。而那是不现实的。