c# - 关于 CLR 的 native 调用堆栈到底是什么?

标签 c# clr

浏览一些我遇到的论坛this answer其中回答者将以下内容称为 native 调用堆栈

00000000`0014ea10 00000642`7f67d4a2 0x642`80150142
00000000`0014ea90 00000642`7f5108f5 mscorwks!CallDescrWorker+0x82 
00000000`0014eae0 00000642`7f522ff6 mscorwks!CallDescrWorkerWithHandler+0xe5
00000000`0014eb80 00000642`7f49a94b mscorwks!MethodDesc::CallDescr+0x306 
00000000`0014edb0 00000642`7f474ae4 mscorwks!ClassLoader::RunMain+0x23f
00000000`0014f010 00000642`7f5efb1a mscorwks!Assembly::ExecuteMainMethod+0xbc 
00000000`0014f300 00000642`7f467d97 mscorwks!SystemDomain::ExecuteMainMethod+0x492
00000000`0014f8d0 00000642`7f482c24 mscorwks!ExecuteEXE+0x47

关于 CLR 的 native 调用堆栈究竟是什么(这里我们正在查看调用 Main 方法的 CLR,我认为)以及出于教育目的,我如何在本地计算机上查看和理解所述 native 调用堆栈?

最佳答案

是的,这些是用 C++ 编写的非托管函数。用于编写 CLR 的语言。

与托管代码使用堆栈的方式相比,非托管代码使用堆栈的方式没有根本区别。唯一的区别是您需要非托管调试器才能真正查看堆栈跟踪中的非托管函数。托管调试器只是在堆栈跟踪中报告 [Managed to Native Transition] 并隐藏非托管函数。

这是高效的,您通常对非托管代码根本不感兴趣,并且很可能缺少使跟踪准确所需的 PDB。对于 CLR,这需要启用 Microsoft 符号服务器。托管堆栈跟踪始终是准确的,CLR 严格保证堆栈遍历可以正常工作,因为垃圾收集器和 CAS 需要执行堆栈遍历才能完成工作。由于 C++ 代码生成器中的优化,非托管堆栈跟踪更加困难,例如,帧指针遗漏优化对于堆栈遍历是非常致命的。

你当然可以看到两者。项目 + 属性,调试选项卡,勾选“启用 native 代码调试”选项。

关于c# - 关于 CLR 的 native 调用堆栈到底是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21204309/

相关文章:

c# - 如何创建简单的 C# 全双工 TCP/IP 流套接字连接?

c# - 如何在 .net 中找到当前线程的最大堆栈大小?

.net - .NET CLR 如何处理空类型的内存开销?

.net - VB.NET 可选参数如何工作 'Under the hood' ?它们是否符合 CLS?

c# - 获取 CLR ID

c# - 当不在一组引号内时匹配正则表达式模式(文本跨越多行)

c# - 如何在没有 WMI 的情况下知道两个分区是否在一个物理硬盘中?

c# - 用于 Windows 窗体应用程序 ListView 项(小图标 View )的最佳图标大小是多少

c# - .net CLR相关问题

.net - .NET Framework、CLR 和 Visual Studio 版本号如何相互关联?