我在c ++应用程序中看到了访问冲突错误。在发生违规并使用!analyze时将windbg附加到进程,我发现访问冲突是由于尝试执行不可执行的地址。我知道正在执行的地址导致了这个问题。什么可能导致这个错误?代码中可能出现的错误会导致这种情况发生吗?我该如何有效地调试它?
答案 0 :(得分:2)
C ++中出现此错误的两个常见原因是:1)使用未初始化/已删除对象的虚函数和2)使用未初始化的函数指针。无论哪种情况,您都可以有效地分支到随机地址。由于大多数内存未标记为可执行文件,因此可能会被“尝试执行非可执行地址”
停止答案 1 :(得分:1)
这不是代码中的错误。这意味着您正在尝试执行非代码意味着属于.data存储的内存,例如变量声明或除代码之外的任何内容。这可能是由于指针无效引起的。
答案 2 :(得分:1)
数据执行保护在此处描述:http://msdn.microsoft.com/en-us/library/aa366553(v=vs.85).aspx。获取此错误的可能方法是覆盖堆栈上的函数返回地址。因此,您需要检查在此访问冲突之前执行的代码。
答案 3 :(得分:0)
调试这个没有灵丹妙药。正如其他人所说,不知何故运行了一个不可执行的地址。
您的目标是找出无效地址的来源。最好的办法是从错误线程的堆栈跟踪开始。从那里你可以看到这是一个vtable指针,一个指向回调函数的指针,还是其他东西。它应该为您提供足够的信息,以便知道代码的位置。
如果你能弄清楚该值是如何传递的,你应该能够设置一些断点并跟随该值,直到它变为无效。二进制搜索是根本原因问题的一种很好的系统方法。