【发布时间】:2018-05-30 00:30:51
【问题描述】:
我有一个复杂的 C++/CLI 应用程序,其中包含许多模块(几十个),其中一些管理一些非托管。最近我们从 Visual Studio 2013 切换到 Visual Studio 2015。它可以在某些计算机上运行,但不能在其他计算机上运行。
当程序不工作时,它甚至在 main 的第一行之前就崩溃了。它在 _onexit 中报告访问冲突异常。当忽略一些异常和断言时,我看到 <Module> 抛出了 TypeInitializationException 。
问题是 - 我不知道是哪一个。我可以在“输出”窗口中看到何时加载 DLL。最后一个要加载的 DLL 是 System.dll - 我的 bug 肯定不存在。所以我需要一种方法来跟踪托管 DLL 中的静态变量初始化,以便找出哪个 DLL 有问题,然后我可以追踪有问题的初始化。
我该怎么做?
【问题讨论】:
-
少关注“什么模块?”这个问题。以及更多关于“什么类型没有加载?”的问题。
TypeInitializationException的详细信息中应包含 that information。您还应该有一个堆栈跟踪。 -
可能你有一个静态类或静态成员在主条目上失败。它可以是记录器或单例对象。等等。
-
@BenVoigt,不幸的是调试器没有捕捉到异常,因为它发生在 GPF 之后,所以我真的不能说它是“未知的” “ 模块。我怀疑它是
<Module>,它是一个包含所有模块全局变量和函数的 C++/CLI 类型。所以我需要跟踪初始化。 -
@Y.Doktur 当然这是问题所在,我只是不知道代码中几乎数百个静态变量中的哪一个。并且通过禁用每个搜索它(即使以二进制搜索方式)将需要数周时间。
-
这敲响了警钟,我必须查看堆栈跟踪才能确定它。 VS2015 中的 CRT 重写存在静态初始化顺序惨败问题。最常见的是在以 System::Windows::Forms 为目标的 C++/CLI 应用程序中触发,它是模块初始化程序。生存指南is here,@pianoslum 发现的黑客(覆盖入口点)可能是您想要的。
标签: visual-studio debugging c++-cli