【问题标题】:Exception in a release build only仅发布版本中的异常
【发布时间】:2019-01-03 03:58:40
【问题描述】:

我正在研究一个包含 40 多个项目的大型解决方案。对解决方案的一些更改使发布版本不稳定 - 它引发 Access violation reading location 异常(但在调试下一切正常)。经过大量调查后,我定位了这个问题,但这并没有让我知道如何解决它。

我将sample project 上传到了 github。它包含重现问题所需的最少数据量。它由 3 个项目组成:App - 可执行文件,TestLibTestLib.Data - 静态库。

TestLib.Data:

// stdafx.h
#pragma once
#include "targetver.h"
#include <afxwin.h>

//--------------------

// SomeData.h
#pragma once
class CSomeData
{
public:
    CSomeData();
    CSomeData(const CSomeData &cSomeData);
private:
    GUID m_Guid;
};

//--------------------

// SomeData.cpp
#include "stdafx.h"
#include "SomeData.h"

CSomeData::CSomeData() {}
CSomeData::CSomeData(const CSomeData &cSomeData) {}

测试库:

// stdafx.h
#pragma once
#include <WinSDKVer.h>
#include "targetver.h"
#include <afxwin.h>

//--------------------

// SomeClass.h
#pragma once
#include <map>
#include "..\TestLib.Data\SomeData.h"

class CSomeClass
{
public:
    CSomeClass();
    void doWork();
    std::map<int, CSomeData> m_map;
};

//--------------------

// SomeClass.cpp
#include "stdafx.h"
#include "CSomeClass.h"

CSomeClass::CSomeClass() {}

void CSomeClass::doWork()
{
    for (std::pair<int, CSomeData> p : m_map)
    {
    }
}

应用

它确实包含 MFC 多文档应用程序的自动生成代码。唯一添加到 MyApp 类实现的内容是:

#include "..\TestLib\CSomeClass.h"

//...

BOOL MyApp::InitInstance() 
{
     //...

    CSomeClass sc;
    sc.doWork();

    return TRUE;
}

所有项目都使用Visual Studio 2013 - Windows XP (v120_xp) 平台工具集。

Release|x86 下运行以Access violation 异常结束。

谁能解释一下这里出了什么问题?

编辑

异常和调用堆栈:

编辑 2

解决问题的方法:

  • CSomeClass::doWork() 中删除for 循环
  • CSomeData类中移除复制构造函数
  • stdafx.h 中删除#include &lt;afxwin.h&gt; TestLib.Data
  • 移除 /clr 支持

这两个我都不能用作解决方案。问题是 - 为什么这样的更改会阻止异常?

【问题讨论】:

  • 您应该将用于重现问题的代码包含在问题本身中,而不是提供指向某处的链接(尽管在线编译器的附加链接会很好)。您显然在某处有 UB 或其他一些编程错误。您现在发布的代码似乎没问题,只是最好将for (std::pair&lt;int, CSomeData&gt; p : m_map) 重新设置为for (std::pair&lt;int, CSomeData&gt; &amp; p : m_map),这样它就不会复制任何内容。
  • 异常在哪里引发?失败时的调用堆栈是什么?附加调试器以找出答案。如有必要,请参阅How to: Debug Optimized Code
  • 如果这确实是异常的位置,那么这意味着pThread 为空。这意味着您的应用程序未能正确初始化。你甚至没有达到复制东西的地步;在那之前很久就失败了。
  • GitHub 上的项目在禁用 CLR 支持后运行良好。因此,要么是 CLR 意外启用的配置问题,要么是问题本身的代码和来自 github 的代码都没有重现所述问题。
  • 您应该删除它们。如果您需要与 C# 互操作,则需要将使用 CLR 的代码提取到单独的二进制文件中。

标签: c++ exception visual-studio-2013 mfc release


【解决方案1】:

这实际上不是答案,而是我最终得到的解决方案。

即使我更愿意摆脱 clr 支持(正如 cmets 中的人所建议的那样) - 我无法将其用作我原始项目的解决方案。原始项目包含大量托管类型,替换所有这些用法将需要大量工作时间。

我开始寻找另一种解决方案:从stdafx.h 中删除#include &lt;afxwin.h&gt;。最终我发现用#include &lt;afx.h&gt; 替换它可以修复崩溃。而且它仍然让我可以使用管理类型和 MFC 类。

我对这种行为没有任何解释,但我希望这个解决方案可能对某人有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    • 2019-01-18
    • 1970-01-01
    相关资源
    最近更新 更多