Debugging 如何在没有转储的情况下获取单个DLL的符号?

Debugging 如何在没有转储的情况下获取单个DLL的符号?,debugging,windbg,debug-symbols,crash-dumps,Debugging,Windbg,Debug Symbols,Crash Dumps,我有一个单独的DLL或EXE文件,我想获取它的符号(PDB文件),即从符号服务器下载 注意:DLL不是属于崩溃转储的模块,因此无法打开转储并执行.symfix和重新加载 我试过了 symchk /os /if "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll" /su "SRV*e:\debug\symbols*http://msdl.microsoft.com/download/symbols" 但它只是说 SYMCHK: FA

我有一个单独的DLL或EXE文件,我想获取它的符号(PDB文件),即从符号服务器下载

注意:DLL不是属于崩溃转储的模块,因此无法打开转储并执行
.symfix
重新加载

我试过了

symchk /os /if "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll"
/su "SRV*e:\debug\symbols*http://msdl.microsoft.com/download/symbols"
但它只是说

SYMCHK: FAILED files = 0
SYMCHK: PASSED + IGNORED files = 1

“我的符号”文件夹中没有符号。

您使用了
/if
,听起来似乎有道理,但实际上转储文件需要
/id

symchk /os /id "C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll" 
/su "SRV*e:\debug\symbols*http://msdl.microsoft.com/download/symbols"

SYMCHK: FAILED files = 0
SYMCHK: PASSED + IGNORED files = 1
输出相同,但符号文件夹现在包含PDB


在WinDbg中类似:

  • 选择
    文件|打开崩溃转储…
    或按Ctrl+D
  • 对于文件名筛选器,选择
    All Files
  • 选择您感兴趣的DLL或EXE。WinDbg将例如说

    Loading Dump File [C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll]
    
    虽然它不是一个真正的转储文件

  • 发出典型命令
    .symfix
    .reload
    。如果符号服务器上存在符号,则将下载这些符号
查看您正在“调试”的内容,您将看到它是DLL:

0:000> |
.  0    id: f0f0f0f0    examine name: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll

0:000> ||
.  0 Image file: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll

0:000> lm
start             end                 module name
00000001`80000000 00000001`80988000   clr        (pdb symbols)          e:\debug\symbols\clr.pdb\5706A2AA257A45FDAC5776EDDC7BBA542\clr.pdb
还有一些其他命令可以工作:

0:000>  x clr!*
00000001`80123e28 clr!SafeHandle::Init (<no parameter info>)
00000001`808f5e80 clr!HillClimbingLogSize = <no type information>
00000001`80064af0 clr!IsTimerSpecialThread (<no parameter info>)
...

0:000> u clr!SafeHandle::Init
clr!SafeHandle::Init:
00000001`80123e28 4883ec28        sub     rsp,28h
00000001`80123e2c 488b059d4b7c00  mov     rax,qword ptr [clr!g_Mscorlib+0x10 (00000001`808e89d0)]
00000001`80123e33 488b80e0070000  mov     rax,qword ptr [rax+7E0h]
00000001`80123e3a 4885c0          test    rax,rax
...
0:000>x clr*
00000001`80123e28 clr!SafeHandle::Init()
00000001`808f5e80 clr!HillClimbingLogSize=
00000001`80064af0 clr!IsTimerSpecialThread()
...
0:000>u clr!SafeHandle::Init
clr!安全句柄::初始化:
0000000 1`80123e28 4883ec28子rsp,28小时
00000001`80123e2c 488b059d4b7c00 mov rax,qword ptr[clr!g_Mscorlib+0x10(00000001`808e89d0)]
0000000 1`80123e33 488b80e0070000移动rax,qword ptr[rax+7E0h]
0000000 1`80123e3a 4885c0测试rax,rax
...