Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从托管代码中捕获的本机异常中获取本机stacktrace_C#_C++_Exception_Interop_Stack Trace - Fatal编程技术网

C# 如何从托管代码中捕获的本机异常中获取本机stacktrace

C# 如何从托管代码中捕获的本机异常中获取本机stacktrace,c#,c++,exception,interop,stack-trace,C#,C++,Exception,Interop,Stack Trace,我有一些托管代码,可以调用一些本机DLL中的方法(我有相应的符号文件)。 有时,该本机方法会抛出我在托管代码中捕获的异常。但是,当我从捕获的异常打印stacktrace时,我只看到托管代码(最后一帧是对本机代码的调用..但它没有看到本机代码中的stacktrack) 如何获得本机调用堆栈? *调试代码时,我能够进入本机代码,看到实际的调用堆栈。获取本机堆栈跟踪非常困难。当它通过.NET/本机转换层时,本机堆栈跟踪已经丢失 因此,您需要在本机代码中捕获它,这也是相当困难的。看一看John Robb

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

如何获得本机调用堆栈?

*调试代码时,我能够进入本机代码,看到实际的调用堆栈。

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


因此,您需要在本机代码中捕获它,这也是相当困难的。看一看John Robbins关于正确的本机堆栈跟踪的工作;我能找到的他的SUPERASSERT的最新公开版本来自。

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

另一种可能是使用stackwalker。它是免费的,可在以下位置获得:
如果知道顶级本机调用,可以使用_try/_catch将其包装,并使用stackwalker将堆栈转储到日志文件中。您可能还可以捕获异常,使用stackwalker获取调用堆栈,将调用堆栈添加到异常中(作为字符串),然后将异常重新发送到.NET代码中。NET代码可以将调用堆栈从异常中清除。

-1翻译为“我不知道如何做,所以我要写一些我不知道的行话,然后随机谷歌搜索链接”非常有用。事实上,我已经做到了(从非托管代码可靠地捕获了本机堆栈跟踪)。在SUPERASSERT编写之前。拿着天哪,我对“困难”这个词感到惊讶。“困难”通常翻译为,难以研究,或难以维护。因为说代码很难是没有多大意义的。我会发现这不需要太多的维护,所以我假设之前。