【问题标题】:How can I catch a C# AppCrash because of a native C++ DLL fail由于本机 C++ DLL 失败,我如何捕获 C# AppCrash
【发布时间】:2013-02-08 00:52:09
【问题描述】:

我有一个从原生 c++(比如 XYZ.dll)创建的 DLL。我在 C++ .NET 的包装器中链接到该 DLL。在我的最高级别 C# 代码中使用了这个包装器的一个对象。

我的问题是:有时我的 DLL 中的一个函数会崩溃,而我的最高级别 C# 代码会因 AppCrash 而崩溃;崩溃模块:XYZ.dll。我试图弄清楚它在哪里使我的本机 C++ 代码崩溃,但事实证明这是徒劳的。我想知道是否有办法让我在我的 C# 代码中捕捉到这个崩溃并继续前进。

【问题讨论】:

  • 据我所知,你无法抓住它。即使您将其反汇编为 IL 并修改 IL 表示。
  • 在调试非托管代码时,通常最好回到久经考验的旧技术,如日志记录。您不会从非托管“崩溃”中获得托管异常,因此您能做的最好的事情就是隔离导致崩溃的原因并避免这样做。即使它被证明是您无法控制的第三方代码中的错误,您至少可以找到合适的解决方法。
  • 这不是真的。你可以在 c# 中使用 SEH。 limbioliong.wordpress.com/2011/10/13/…

标签: c# c++ .net try-catch crash


【解决方案1】:

我认为这不是您正在寻找的答案,但至少它有助于解决问题。查看 AppDomain.UnhandledException... 您应该能够捕获并记录堆栈跟踪。

【讨论】:

    【解决方案2】:

    这是您在 Visual Studio 中调试的东西吗?如果没有,请考虑安装 Windows 调试器并在 cdb.exe 下运行您的应用程序。确保您的非托管组件具有符号 (.pdb)。如果您在调试器(即 Visual Studio 或 cdb/windbg)下运行您的应用程序并且可以重现崩溃,那么您应该能够获得堆栈跟踪。既然你暗示你拥有非托管库,我可以假设你有资源吗?如果您在 VS 中,请确保禁用 Debug Just My Code 设置。如果您在 windbg 中,那么一旦您遇到第一次机会异常,崩溃点应该会显示您的堆栈跟踪。

    【讨论】:

      【解决方案3】:

      您绝对可以“赶上”这次崩溃。

      在您的 C++ .NET Wrapper/Handler 中,将所有调用封装到第 3 方 DLL 中,使用 C++ try/catch 块封装所有调用。这很可能会奏效。

      如果没有,请切换到使用 Windows 结构化异常处理。这将捕获本机 Win32 异常并杀死它们。您可以在 here 上找到 Win32 文档。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-10
        • 2011-06-23
        相关资源
        最近更新 更多