C# 这个CopyPDBs函数(来自clr.dll)在做什么?

C# 这个CopyPDBs函数(来自clr.dll)在做什么?,c#,.net,dll,clr,internal,C#,.net,Dll,Clr,Internal,在运行IIS的生产环境中使用Process Explorer分析ASP.NET MVC应用程序时,我注意到有许多调用来自C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll的CopyPDBs函数: 它们都具有完全相同的堆栈跟踪: ntdll.dll!ZwWaitForSingleObject+0xa KERNELBASE.dll!WaitForSingleObjectEx+0x98 clr.dll!GetMetaDataInternal

在运行IIS的生产环境中使用Process Explorer分析ASP.NET MVC应用程序时,我注意到有许多调用来自
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll
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
我的问题是:clr.dll中的
CopyPDBs
函数到底在做什么?

我已经搜索了很多,但是仍然找不到这个函数的任何解释和/或文档


注意:这个问题与我之前在ServerFault中提出的一个问题有关:

它没有做任何事情。Process Explorer无权访问clr.dll的PDB文件,因此对代码了解不够。当您查看与已知符号的指令偏移量时,
+0x44a2
很长很长,远远超过CopyPDBs()函数。从clr.dll中看到的所有符号都是垃圾。ntdll.dll中的符号很好,请注意较小的偏移量

如果没有为DLL中的内部函数提供符号的PDB文件,调试器只能依赖导出的函数。Clr.dll中没有很多

帮助Process Explorer显示更好的堆栈跟踪是本文的主题

Windbg不是唯一的方法,您还可以使用Visual Studio:

  • 工具>选项>调试>符号。勾选“Microsoft符号” “服务器”复选框并选择缓存目录
  • 项目>属性>调试>勾选“启用本机代码调试”选项
  • 按F5,您将看到调试器正在下载符号。需要一段时间,它只发生一次
  • 使用选项>配置符号向Process Explorer说明您选择的缓存目录
  • 另一篇文章涉及: