什么是这个CopyPDBs函数(来自clr.dll)呢?

时间:2015-07-29 14:52:55

标签: c# .net dll clr internal

使用Process Explorer分析运行IIS的生产环境中的ASP.NET MVC应用程序时,我注意到CopyPDBs对此C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll函数的大量调用:

Process Explorer CopyPDBs

所有这些都具有完全相同的堆栈跟踪:

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

1 个答案:

答案 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:

  1. 工具&gt;选项&gt;调试&gt;符号。勾选“微软符号” 服务器“复选框并选择缓存目录。
  2. 项目&gt;属性&gt;调试&gt;勾选“启用本机代码调试”选项。
  3. 按F5,您将看到下载符号的调试器。需要一段时间,它只发生一次。
  4. 告诉Process Explorer您使用选项&gt;选择的缓存目录。配置符号。