2010-05-17 55 views
5

我有一些托管代码调用某个本地DLL(我有适当的符号文件)内的方法。
有时候,本地方法抛出一个异常,我在我的托管代码中发现了这个异常。但是,当我从我捕获的异常打印堆栈跟踪时,我只看到托管代码(最后一帧是对本机代码的调用,但它没有在本机代码中看到堆栈轨道)。如何从托管代码中捕获的本机异常获取本机堆栈跟踪

我该如何获得本机调用堆栈?
*当我调试代码时,我能够进入本机代码,并查看真正的调用堆栈。

回答

1

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

所以,你需要捕获它仍然在本地代码,这也是很困难的。看看John Robbins为正确的本地堆栈跟踪所做的工作;他能找到的SUPERASSERT的最新公开版本是从MSJ, Feb 1999

+1

-1翻译为“我不知道该怎么做,所以我要写关于我不知道的行话,然后随机的谷歌搜索链接”真正有用。 – 2011-10-24 18:26:15

+0

实际上,我已经完成了它(可靠地捕获了本机堆栈跟踪 - 来自非托管代码)。 SUPERASSERT也被写入之前。拿着它。 :P – 2011-10-24 18:42:57

+0

对不起,我对“困难”一词提出了疑问。 “困难”通常意味着难以研究或难以维护。因为说代码很困难没有多大意义。我会发现这不需要太多的维护,所以我假设之前。 – 2011-10-25 14:37:37

1

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

另一种可能性是使用stackwalker。它是免费的,可在此处获得: http://www.codeproject.com/KB/threads/StackWalker.aspx 如果您知道顶级本地调用,则可以使用__try/__ catch将其包装并使用stackwalker将堆栈转储到日志文件。想必你也可以捕捉到异常,使用stackwalker获取调用堆栈,将callstack添加到异常(作为字符串),然后将异常重新引发到.NET代码中。 .NET代码可以让你的例外中的callstack。

相关问题