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

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

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

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

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

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

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