C++ 无法跟踪访问冲突0xC00000FD

C++ 无法跟踪访问冲突0xC00000FD,c++,stack-overflow,C++,Stack Overflow,使用VS2008的Im和我的MFC应用程序在设置断点或运行到游标时开始崩溃。我有很多这样的错误:- First-chance exception at 0x78a5727c (mfc90ud.dll) in MyApp.exe: 0xC0000005: Access violation reading location 0xfffffffc. First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violati

使用VS2008的Im和我的MFC应用程序在设置断点或运行到游标时开始崩溃。我有很多这样的错误:-

First-chance exception at 0x78a5727c (mfc90ud.dll) in MyApp.exe: 0xC0000005: Access violation reading location 0xfffffffc.
First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000.
First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000.
First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000.
First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000.
First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000.
First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000.
First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000.
First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000.
First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000.
First-chance exception at 0x00000000 in MyApp.exe: 0xC0000005: Access violation reading location 0x00000000.
调用堆栈也不多了,它只列出NT.dll中的代码

>   00000000()  
    ntdll.dll!7c9032a8()    
    [Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll] 
    ntdll.dll!7c90327a()    
    ntdll.dll!7c92aa0f()    
    ntdll.dll!7c90e48a()    
    ntdll.dll!7c9032a8()    
我无法使用断点或单步执行代码来发现问题。如果在VS中使用F5运行,则应用程序“似乎”正常运行


跟踪此问题的最佳方法是什么?

问题标题的堆栈溢出在哪里?访问冲突通常表示无效的指针取消引用


使用您的修订历史记录查找第一个版本,在该版本中开始出现问题,然后批判性地分析在该版本中修改的代码内部和周围发生的所有指针内容。

Visual Studio有一个选项,可以在某个地方打破第一次机会异常(不记得它到底在哪里,可能是调试子菜单中的一个异常菜单项?)您想打开它并在调用堆栈出现时查看它们


还有一个打开Microsoft Symbol Server的选项,它会自动下载堆栈中任何系统dll的匹配符号。(对不起,也不记得这是如何设置的).

我将使用我的心理调试技能,告诉您您正在覆盖堆栈上的缓冲区-具体地说,您正在将太多的零写入一个不够大的缓冲区中

你已经有了堆栈崩溃的典型症状——你碰到的第一个AV是试图访问零减去几个字节——显然是堆栈指针到参数或局部变量的偏移量(我永远记不清哪些在堆栈指针上方,哪些在下方)然后有一堆行指示指令指针已设置为零,这种情况经常发生,因为堆栈帧中的函数返回地址已被零值覆盖-因为您重写了基于堆栈的缓冲区并损坏了堆栈上的所有其他重要内容从当前函数中,它在堆栈中查看它认为它来自哪里,看到零,然后跳到那里。哇

由于堆栈被破坏,您可能不会发现堆栈跟踪太有用;堆栈框架可能会因此而损坏。

web上有一些“模板”,有些人使用这些模板制作Windows程序 而不是在
WndProc()

我们得到这个:

case WM_CLOSE:
    DestroyWindow(hwnd);
    break;
case WM_DESTROY:
    PostQuitMessage(SUCCESS);
    break;
如果
SUCCESS
为0,
DestroyWindow()
将获取一个生成异常的空指针
当窗口关闭时。

您是否尝试在VS中启用所有异常?仍然无法捕获它?是的,但在执行此操作后,我得到了另一个异常,我在调用初始domodal后立即跟踪到了该异常。我的应用程序基于向导。如果启用所有异常,则会得到发布的原始问题。右键单击堆栈帧并加载ntdll的符号。不会解决任何问题,但更多信息不会有什么坏处。这只是你的VS副本有问题吗?尝试在WinDBG()下运行它,看看断点是否在那里工作。如果是这样,你就会知道这是VS问题(也许卸载/重新安装会解决它)。在VS studio中加载符号现在获得>00000000()ntdll.dll!ExecuteHandler2@20()+0x26字节ntdll.dll!ExecuteHandler@20()+0x24字节ntdll.dll_KiUserExceptionDispatcher@8()+0xe字节,堆栈跟踪中没有其他内容。现在安装windbg。标题中的输入错误应该是访问冲突。我可以这样做并想到这一点,但在这个阶段,应用程序已经花了很多个月的时间。我希望有一个更快的方法,但如果不够公平。如果它花了很多个月的时间,你正在使用一些源代码管理系统,对吗?如果不是,现在就开始做。说真的。是的。我从一开始就在使用TortoiseSVN。它在调试|异常| Win32异常下。对于空指针解引用,上面的异常看起来非常熟悉。
case WM_CLOSE:
    DestroyWindow(hwnd);
    break;
case WM_DESTROY:
    PostQuitMessage(SUCCESS);
    break;