【问题标题】:Tracing all DLL loading and initializations in C++/CLI跟踪 C++/CLI 中的所有 DLL 加载和初始化
【发布时间】: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


【解决方案1】:

好吧,我觉得有点愚蠢,但在加载类型加载异常时出现问题,我使用了fuslogvw

我认为它应该为您提供 dll 绑定的顺序,从而为您提供第一印象。

【讨论】:

    猜你喜欢
    • 2011-07-04
    • 2010-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-27
    • 2014-08-21
    • 2020-10-26
    • 2012-05-12
    相关资源
    最近更新 更多