5

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

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

开始。我创建了一个带有按钮的小对话框应用程序。在该按钮的处理函数中放置一个断点。按钮处理函数如下所示:

void CTestProjectDlg::OnBnClickedButton1()
{
    int i;

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

}

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

它让我可以选择中断或继续。如果我继续,它只是再次击中它,而不是“第一次机会”。是的,我在 Debug->Exceptions dlg 中检查了该异常。

如果我中断,调用堆栈只会显示断点所在的行。如果我再次F10 .. 我再次遇到异常,现在调用堆栈在 _AfxDispatchCmdMsg() 函数中显示我,而我原来的 OnBnClickedButton1() 不再在调用堆栈中。

我把断点放在哪里并不重要。

如果我不按 F10,而是继续按 F5,则它可以正常工作。

现在..如果我构建一个发布版本并在调试模式下运行:我打断点,所有的指针,变量值看起来都很正常。F10,这些变成垃圾。this 指针现在为零。m_csHello 现在是

但是,在 Release 模式下,没有捕获到异常,并且一切运行良好。“hello World”字符串按原样显示在对话框中。

我已经询问过 IT 部门在过去一两天内是否在我的盒子上安装了一些补丁。这不是在 2 天前发生的。

你怎么看?VS2008是否损坏?

谢谢。

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

最后,我将项目放在了过去 2-3 周没有更新的另一台机器上。它可以在那里找到,并且安装了这些相同的 VS 更新。

为了这篇文章的目的,我还更改了正在逐步执行的代码。.. 这是一个简单的整数赋值,不涉及 MFC。

目前我正在重新安装VS2008。

4

5 回答 5

7

VS2008 SP1,Win7x64,32位调试代码也有同样的问题。如果我关闭该选项,问题就会消失

工具 -> 选项 -> 调试 -> 本机 -> 启用 RPC 调试。

以下条目可能与此相关: 调试命令(步入/进入)导致未处理的异常

于 2011-06-14T09:39:16.680 回答
1

您说相同的项目在具有相同版本的 Visual Studio 的不同机器上编译和运行得很好。代码看起来不错,是的,听起来 VS 2008 已损坏,需要重新安装。

于 2010-05-06T17:52:45.710 回答
1

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

Windows 更新日志显示午餐时间我的机器上有一个 Windows 更新。问题仅在午餐时间后才开始出现 - 没有项目更改!

该死的你和你那破坏开发环境的愚蠢的自动更新m$!!!你们都丢脸!

于 2010-06-18T14:13:28.217 回答
0

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

至于您在发布中的调试,请不要担心 this 值看起来像它为空。由于优化过程,调试器很可能不是但很难准确地判断您在代码中的位置。

于 2010-05-06T07:54:29.990 回答
0

明智的做法是(反直觉地)删除所有断点等。重建您的项目(不是增量构建)。重要的是要从头开始,抓住异常,并获得一个干净的调用堆栈,并确保构建是准确的源文件。您还应该禁用预编译的标头等。

于 2010-05-06T18:01:44.023 回答