使用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
的{{1}}函数到底在做什么?
我经常搜索,但仍无法找到此功能的任何说明和/或文档。
注意:此问题与我之前提出的问题有关,在ServerFault中提出问题:https://serverfault.com/questions/684554/high-cpu-usage-of-iis-process-w3wp-exe-because-of-many-slow-clr-dllcopypdbs
答案 0 :(得分:13)
它没有做任何事情。 Process Explorer无权访问clr.dll的PDB文件,因此它对代码知之甚少。当您查看已知符号的指令偏移量时,{I <{1}}总是非常明显,很长,超过CopyPDBs()函数。你从clr.dll看到的所有符号都是垃圾。来自ntdll.dll的符号很好,请注意小偏移。
如果没有为DLL中的内部函数提供符号的PDB文件,调试器只能依赖导出的函数。 Clr.dll没有很多。
帮助Process Explorer显示更好的堆栈跟踪是this blog post的主题。
Windbg不是唯一的方法,您也可以使用Visual Studio: