当使用 Process Explorer 在运行 IIS 的生产环境中分析 ASP.NET MVC 应用程序时,我注意到有很多对此的调用CopyPDBs
函数来自C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
:
它们都具有完全相同的堆栈跟踪:
ntdll.dll!ZwWaitForSingleObject+0xa
KERNELBASE.dll!WaitForSingleObjectEx+0x98
clr.dll!GetMetaDataInternalInterface+0x3064a
clr.dll!GetMetaDataInternalInterface+0x30732
clr.dll!GetMetaDataInternalInterface+0x306e5
clr.dll!CopyPDBs+0x44a2
KERNEL32.DLL!BaseThreadInitThunk+0x22
ntdll.dll!RtlUserThreadStart+0x34
我的问题是:这是什么CopyPDBs
函数从clr.dll
究竟在做什么?
我已经搜索了很多,但仍然找不到此功能的任何解释和/或文档。
注意:这个问题在某种程度上与我之前在 ServerFault 中提出的问题有关:https://serverfault.com/questions/684554/high-cpu-usage-of-iis-process-w3wp-exe-because-of-many-slow-clr-dllcopypdbs https://serverfault.com/questions/684554/high-cpu-usage-of-iis-process-w3wp-exe-because-of-many-slow-clr-dllcopypdbs
它什么也没做。 Process Explorer 无法访问 clr.dll 的 PDB 文件,因此它对代码的了解不够。当您查看已知符号的指令偏移量时,总是非常明显,+0x44a2
已经过了 CopyPDBs() 函数很久很久了。您从 clr.dll 中看到的所有符号都是垃圾。 ntdll.dll 中的符号很好,请注意小偏移量。
如果没有为 DLL 中的内部函数提供符号的 PDB 文件,调试器只能依赖导出的函数。 Clr.dll 没有很多。
帮助 Process Explorer 显示更好的堆栈跟踪是这篇博文 http://blogs.msdn.com/b/vijaysk/archive/2009/04/02/getting-better-stack-traces-in-process-monitor-process-explorer.aspx.
Windbg 不是唯一的方法,您还可以使用 Visual Studio 来完成:
- 工具 > 选项 > 调试 > 符号。勾选“微软符号
服务器”复选框并选择缓存目录。
- 项目>属性>调试>勾选“启用本机代码调试”选项。
- 按 F5,您将看到调试器下载符号。需要一段时间,它只发生一次。
- 告诉 Process Explorer 您通过选项 > 配置符号选择的缓存目录。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)