【问题标题】:How to obtain the native stacktrace from native exceptions caught in managed code如何从托管代码中捕获的本机异常中获取本机堆栈跟踪
【发布时间】:2010-05-17 15:35:19
【问题描述】:

我有一些托管代码调用一些本机 DLL 中的方法(我有适当的符号文件)。
有时,该本地方法会引发我在托管代码中捕获的异常。但是,当我从捕获的异常中打印堆栈跟踪时,我只看到托管代码(最后一帧是对本机代码的调用......但它看不到本机代码中的堆栈跟踪)。

我怎样才能获得本机调用堆栈?
*当我调试代码时,我可以单步执行本机代码,并查看实际的调用堆栈。

【问题讨论】:

    标签: c# c++ exception interop stack-trace


    【解决方案1】:

    获取本机堆栈跟踪非常困难。当它通过 .NET/本机翻译层时,本机堆栈跟踪已经丢失。

    因此,您需要在仍使用本机代码时捕获它,这也相当困难。看看 John Robbins 为正确的本机堆栈跟踪所做的工作;我能找到的他的 SUPERASSERT 的最新公开版本来自 MSJ, Feb 1999。

    【讨论】:

    • -1 翻译为,“我不知道怎么做,所以我会写一些我不知道的行话,然后随机谷歌搜索链接”真的很有帮助。
    • 实际上,我已经做到了(可靠地捕获了本机堆栈跟踪 - 来自非托管代码)。在编写 SUPERASSERT 之前也是如此。拿着它。 :P
    • 对不起,我对“困难”这个词挑了挑眉。 “难”通常翻译为难以研究或难以维护。因为说代码很难并没有多大意义。我发现这不需要太多维护,所以我假设了之前的情况。
    【解决方案2】:

    这不像在捕获异常时显示本机调用堆栈那样巧妙,但如果您试图在用户的计算机上追踪特定问题并且用户相当精明,您可以让他们在数据库。抛出原生异常并可以查看调用堆栈时会中断。

    另一种可能是使用stackwalker。它是免费的,可在此处获得: http://www.codeproject.com/KB/threads/StackWalker.aspx 如果您知道顶级本机调用,则可以用 __try/__catch 包装它并使用 stackwalker 将堆栈转储到日志文件。大概您还可以捕获异常,使用 stackwalker 获取调用堆栈,将调用堆栈添加到异常(作为字符串),然后将异常重新抛出到您的 .NET 代码。然后,.NET 代码可以将调用堆栈从您的异常中取出。

    【讨论】:

      猜你喜欢
      • 2010-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多