【问题标题】:Debugging startup issues in mixed code applications调试混合代码应用程序中的启动问题
【发布时间】:2012-01-10 19:20:51
【问题描述】:

我们有一个应用程序是 C/C++/MFC 桌面应用程序,带有一些 C++/CLI 程序集,允许我们访问一些托管代码功能。应用程序在发布模式下启动时崩溃,仅显示消息

未知模块中发生了“System.TypeInitializationException”类型的未处理异常。 附加信息:'' 的类型初始化程序引发了异常。

我该如何调试这种情况?混合托管/非托管代码有哪些问题?我必须采取哪些特殊步骤才能让它们发挥出色?

【问题讨论】:

  • 转到调试->异常并检查“抛出”公共语言运行时异常。
  • 此外,当附加调试器时,请确保您使用的是混合模式调试(本机和托管)。如果您从调试器启动,则设置位于项目属性->配置属性->调试->调试器类型中。如果要附加,则有一个“附加到”和一个“选择”按钮,您可以在其中指定。顺便说一句,您使用的是 .NET 4 还是 .NET 2?
  • 问题是这个问题只在发布模式下表现出来
  • 您仍然可以使用发布模式进行调试。或者你是说它只有在你没有附加调试器时才会表现出来?

标签: c++ c++-cli unmanaged startup managed


【解决方案1】:

值得怀疑的是:

缺少非托管 DLL。您可以使用 Depends(来自 Sysinternals)并开始分析,但我一直在努力在混合模式下获得良好的结果。

制作一个具有相同依赖项的本地最小测试工具,并通过 Depends 运行它 - 您将获得有关缺失 DLL 的明确信息。

您是否在发布构建产品中使用了混淆功能? 我们使用的混淆软件在评估模式下为类型添加了一个字段。我们有固定的偏移量结构,但新字段没有得到明确的偏移量。这是一个错误,如果它在我们自己的代码中,它将在编译时被标记出来。由于混淆器正在动态修补程序集,因此 CLR 没有选择,只能在运行时加载无效类型。

【讨论】:

    【解决方案2】:

    在我看来(基于我遇到的一些麻烦)Matt Smith 的评论是最有用的答案;实际上,检查所有类型的异常的“抛出”。很多时候,问题是全局对象的构造函数崩溃。另见答案 5 在

    http://www.codeproject.com/Questions/67419/The-type-initializer-for-threw-an-exception

    它说(除其他外):

    单击 Debug--> Exceptions 并选中所有 Throw 复选框。这 将导致调试器停止所有第一次机会异常和 将帮助您在 Type Initializer 错误下找到错误 你看到了。如果它与另一个程序集有关,就像我的一样,你 可以使用 Microsoft 的 Assembly Binding Log Viewer 工具来帮助确定 问题。

    【讨论】:

      猜你喜欢
      • 2010-09-10
      • 1970-01-01
      • 1970-01-01
      • 2023-04-09
      • 2016-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多