【问题标题】:VS2008 C++ MFC Access Violation ONLY when stepping through debug modeVS2008 C++ MFC 访问冲突仅在单步调试模式时
【发布时间】:2010-05-05 23:23:35
【问题描述】:

这太疯狂了。它开始在我的主项目中发生,所以我创建了一个小的示例全新项目来重现它,果然.. 它不会发生在我创建的只是一个 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。

【问题讨论】:

  • 您是否将控件(例如 IDC_BUTTON1)链接为 ON_BN_CLICKED(IDC2_BUTTON1, OnBnClcikedCutton1)?这可能是个问题。
  • 是的。如果我理解你的问题,这就是它到达断点的方式。
  • 在您的代码中,您必须在开始时将对话框的控制链接到相关函数:BEGIN_MESSAGE_MAP(CTestProjectDlg, CDialog) ... ON_BN_CLICKED(IDC2_BUTTON1, OnBnClcikedCutton1) “ON_BN_CLICKED”的 cpp 代码?有吗?
  • 是的,它是:BEGIN_MESSAGE_MAP(CTestProjectDlg, CDialog) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() //}}AFX_MSG_MAP ON_BN_CLICKED(IDC_BUTTON1, &CTestProjectDlg::OnBnClickedButton1) ON_BN_CLICKED(IDC_BB END_MESSAGE_MAP() 顺便说一句。我尝试为 x64 平台构建/调试,并且能够在不发生这种情况的情况下逐步完成它。只有当我为 Win32 构建时。

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


【解决方案1】:

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

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

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

【讨论】:

  • 我刚买了一台新机器,x64,并且从很久以前的旧代码向我提交了一个讨厌的错误,我在一年前修复了几个错误。编译它,得到看起来很吓人的异常,我认为它们与错误有关。花了整个上午才意识到,不,它只发生在我尝试调试时,并且只有在我在某处放置断点时才会发生。你的修复工作完美:我的理智恢复了! (我仍然要修复那个错误,但我很高兴这不是随机位置的访问冲突,不应该引发访问冲突......)
  • 感谢您的回答,我刚遇到这个问题并在这里搜索,这立即为我解决了它(使用 Visual Studio 2010)。
  • 我认为这就是答案;它现在为我解决了 5 台机器上的问题。它将解释为什么重新安装也能正常工作 - 默认情况下此选项未启用。
  • VC6,Windows 10 x64 调试我自己的 ATL/COM DLL,打开“即时调试”让我可以关闭“OLE RPC 调试”——谢天谢地!
【解决方案2】:

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

【讨论】:

  • 感谢您确认我的怀疑。卸载了名称中带有 VS2008 的所有内容。然后重新安装。问题消失了。现在重新安装 SP1。希望我知道是什么原因造成的。 2周没有这台电脑了。恐怕 IT 团队可能已经为我“修补”了这个问题。不知道要避免什么以防止它再次发生..
【解决方案3】:

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

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

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    • 可能是这样..但是没有变量!!这是VS2008生成的单功能对话框应用。我唯一添加的是按钮处理程序。仅当单步执行下一行代码时才会发生该错误。不这样做,不会产生异常。
    【解决方案5】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多