crash - 应用程序关闭时 CLI DLL 中无法解释的崩溃

标签 crash singleton c++-cli

我有一个加载到 C# 应用程序中的 CLI DLL(混合纯 C++ 和托管代码,VS2005)。一切正常,但当 C# 应用程序关闭时(单击主窗体标题栏中的小“X”按钮)应用程序崩溃并显示一条消息,告诉我“未知软件异常”(0xC0020001) 发生在地址 07C812AEB。消息的标题是“.NET BroadcastEventWindow.2.0 ......”

无法找到原因,因为 Visual Studio 调试器不会在崩溃位置停止。

当我将应用程序加载到 OllyDebug 时,它告诉我崩溃可能发生在 mscorwks.dll 的深处。

我使用纯 C++ 类和混合类,它们全部由 #pragma managed#pragma unmanaged 分隔。

可能是什么原因?

最佳答案

好的。最后,我减少了 DLL 中的代码,直到不再发生任何崩溃。我最终有几个空的类,我找到了罪魁祸首。

我发现的东西太奇怪了,没有任何逻辑,我不得不在这里发布我的结果。

在其中一个纯 C++ 类(不包含任何托管代码)中,我在头文件中使用了一个单例:

inline static CMyClass& Instance()
{
    static CMyClass i_Inst;
    return i_Inst;
};

当应用程序退出导致崩溃时,这里出现任何错误。

当我删除单例并将类实例化为 CPP 文件中的全局变量时,如:

CMyClass gi_Instance;

崩溃消失了!

我看不出我的 Singleton 有什么问题。我想这是一个 Visual Studio 错误。

注意: 我也在纯 C++ DLL 中使用具有相同 Singleton 的相同类并且没有问题。只有在 CLI 项目中编译时才会出现此问题。

注意 2: 当我将 OutputDebugString(L"Destructor CMyClass"); 放入 CMyClass 的析构函数中时,只要我在 Trace 中就永远不会看到该消息使用单例。使用全局变量可以正确调用析构函数。

关于crash - 应用程序关闭时 CLI DLL 中无法解释的崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28815209/

相关文章:

java - 单例 null 的实例

c# - C++/CLI 中的安全转换 - 相当于 C#'s "as"?

c++ - 使用 GetOpenFileName 仅从路径中获取文件名

ios - Flutter Firebase Analytics应用在启动时崩溃

iphone - iOS - 全局异常处理程序

css - 如何理解这个崩溃报告? SIGSEGV

uitableview - iPhone iOS 4 核心数据 - 程序收到信号 : “EXC_BAD_ACCESS”

c++ - C++ 编译器会自动将我的函数设置为静态函数吗?

java - GUICE @Singleton 中正确的范围处理与默认范围

c++ - 如何从另一个类调用静态方法?