仅在单步执行调试模式时,VS2008 C ++ MFC访问冲突

时间:2010-05-05 23:23:36

标签: visual-studio-2008 mfc debugging access-violation

这很疯狂。它开始在我的主项目中发生,所以我创建了一个小样本全新的项目来重现它,当然......在我创建的只是Win32控制台应用程序的示例项目中不会发生。

我在Win7x64上运行它,如果这很重要的话。 VS2008 SP1。

到此为止。我用按钮创建一个小对话框应用程序。在该按钮的处理函数中放置一个断点。按钮处理函数如下所示:

void CTestProjectDlg::OnBnClickedButton1()
{
    int i;

    i = 2;  // < breakpoint here
    i = 3;

}

单击按钮,点击断点。 F10步骤和繁荣:“TestProject.exe中0x0398f77b的第一次机会异常:0xC0000005:访问冲突。”

它让我可以选择Break或Continue。如果我继续,它只会再击中它,而不是“第一次机会”。是的我在Debug-&gt; Exceptions dlg。

中检查了该异常

如果我中断,调用堆栈只显示断点所在的行。如果我再次使用F10 ..我再次得到异常,只是现在callstack在_AfxDispatchCmdMsg()函数中显示我,并且我原来的OnBnClickedButton1()不再出现​​在callstack中。

断点的位置无关紧要。

如果不是F10,我只是继续使用F5,它可以正常工作。

现在..如果我构建一个Release版本并在调试模式下运行:我点击了断点,所有指针,变量值看起来都正常。 F10,这些转向垃圾。此指针现在为零。 m_csHello现在是

但是,在发布模式下,未捕获异常,并且一切正常。 “hello World string会在对话框中显示出来。

我已经进行了调查,看看IT部门是否在最后一两天内在我的包装盒上安装了一些补丁。这种情况在2天前没有发生。

你怎么看? VS2008是否已损坏?

感谢。

编辑:附加信息。如果我构建/调试x64平台,则不会发生这种情况。仅限Win32。
我还看了一下VS2008的所有修补程序/安全更新。他们是

最后,我将项目放在过去2-3周内未更新的其他计算机上。它可以在那里找到,并且安装了这些相同的VS更新。

为了这篇文章的目的,我还修改了正在替换的代码。 ..这是一个简单的整数赋值,不涉及MFC。

目前我正在重新安装VS2008。

5 个答案:

答案 0 :(得分:7)

与VS2008 SP1,Win7x64,32位调试代码有同样的问题。如果我关闭选项

,问题就会消失

工具 - &gt;选项 - &gt;调试 - &gt;原生 - &gt;启用RPC调试。

以下条目可能与此相关: Debugging commands (step over/into) cause unhandled exceptions

答案 1 :(得分:1)

你说同一个项目在使用相同版本的Visual Studio的不同机器上编译并运行得很好。代码看起来很好,所以是的,听起来VS 2008已经损坏,需要重新安装。

答案 2 :(得分:1)

我在Win7x64,VS2008 SP1开发平台上也遇到了同样的问题。我的代码是c ++,WTL,ATL,DirectShow和其他各种库。

Windows更新日志显示我的机器在午餐时间有一个Windows更新。这个问题才在午餐时间开始 - 没有项目变更!

该死的你和你的愚蠢的自动更新打破了开发环境m $ !!!你们都感到羞耻!

答案 3 :(得分:0)

如果它在Release中工作但没有调试,那么我认为你在某个地方有一个未初始化的变量。在调试中它会自动设置为0xcdcdcdcd(或其子部分,具体取决于变量大小),这会导致你在Release中失败,你已经拥有了内存中的任何值,也许这个值可以防止它破坏...通常是未初始化的像这样的变量用作循环绑定,在调试中,您通过内存写入并覆盖可能导致失败的重要事项。在发布中,值恰好可以,但情况可能并非总是如此。

至于你在发布时的调试,不要担心这个值看起来像是null。它很可能不是,但由于优化过程,调试器很难确切地告诉你代码的位置。

答案 4 :(得分:0)

聪明的事情是(反直觉地)查看所有断点等等。重建项目(不是增量构建)。重要的是从一个干净的平板开始,获取异常,并获得一个干净的调用堆栈,并确保构建是准确的源文件。您还应该禁用预编译的标题等。