Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.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
.net StackTrace中的托管/本机转换在哪里?_.net_Stack Trace - Fatal编程技术网

.net StackTrace中的托管/本机转换在哪里?

.net StackTrace中的托管/本机转换在哪里?,.net,stack-trace,.net,Stack Trace,在.NET应用程序中,可以从异常对象获取堆栈跟踪。我在堆栈跟踪中寻找托管到本机的转换(以及其他方向)。VisualStudio调试器可以显示这些特殊帧,但在代码中,我看到了其他内容。有些帧没有托管IL偏移量(来自GetILOffset()方法),但具有Visual Studio看不到的模块和方法名称。它们来自哪里?我如何解释它们 下面的屏幕截图显示了我的应用程序中此类堆栈跟踪的示例。高亮显示的黄色是Visual Studio指示本机方法的方法。元数据标记“+number”是托管IL代码偏移量。如

在.NET应用程序中,可以从
异常
对象获取堆栈跟踪。我在堆栈跟踪中寻找托管到本机的转换(以及其他方向)。VisualStudio调试器可以显示这些特殊帧,但在代码中,我看到了其他内容。有些帧没有托管IL偏移量(来自
GetILOffset()
方法),但具有Visual Studio看不到的模块和方法名称。它们来自哪里?我如何解释它们

下面的屏幕截图显示了我的应用程序中此类堆栈跟踪的示例。高亮显示的黄色是Visual Studio指示本机方法的方法。元数据标记“+number”是托管IL代码偏移量。如果没有,我怀疑这是本机方法

这是Visual Studio为同一地点显示的内容:


您将看到堆栈跟踪的两个不同视图,否则无法使它们相同。干扰视图的是本机代码堆栈帧,可靠地遍历本机代码帧需要调试信息,这种信息需要PDB文件,只有本机调试器才有机会

俯视图由StackTrace对象生成。它完全跳过本机堆栈帧。您突出显示的实际上是C#方法,它们具有
extern
属性。分别用于
[DllImport]
声明(pinvoke)和
[MethodImpl(methodimpoptions.InternalCall)]
(位于CLR内部且抖动知道的代码)。它们没有IL,因此需要从GetILOffset()获取0。然而,这并不意味着0是一个可靠的指示,您必须找到该属性才能过滤它们

调试器的调用堆栈窗口有意隐藏这些方法。调试器无法显示任何对他们有意义的内容,也无法在“自动和局部变量”窗口中显示任何内容。您必须启用非托管调试才能查看更多信息


调试器视图中的[transition]注释是从抖动元数据生成的,抖动元数据是仅通过调试器接口可用的信息,StackTrace类不考虑这些信息。从托管堆栈帧之间的链接生成的元数据,GC需要这些元数据来可靠地遍历堆栈帧,而不存在误入非托管堆栈帧和将本机指针值错误解释为对象引用的风险。否则,从托管代码到本机代码的转换就意味着这样,成本是维护这些链接。它非常便宜。

DispatchMessage的
方法是
[DllImport]extern
。有趣的是,它在堆栈跟踪中连续出现了两次。外部方法能否以托管方式调用自身?还是堆栈跟踪错误?对于我的诊断案例,可能已经足够知道框架中的方法是否是外部的。虽然我希望有一个简单的
IsExtern
属性,但是应该可以帮助我。。。