如何从托管代码中捕获的本机异常中获取本机堆栈跟踪

时间:2010-05-17 15:35:19

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

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

我如何获得原生的callstack?
*当我调试代码时,我可以进入本机代码,并查看实际调用堆栈。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

当您捕获异常时,这并不像显示本机调用堆栈那样灵活,但如果您尝试在用户计算机上追踪特定问题并且用户相当精明,您可以让他们在下运行您的应用程序WinDbg的。抛出本机异常并且可以查看调用堆栈时它会中断。

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