如何在没有转储的情况下获取单个 DLL 的符号?
How do I get the symbols for a single DLL without having a dump?
我有一个 DLL 或 EXE 文件,我想为其获取符号(PDB 文件),即从符号服务器下载。
注意:DLL 不是故障转储的模块,因此无法打开转储并执行 .symfix
和 .reload
。
我试过了
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中类似:
- 选择
File | Open Crash Dump ...
或按Ctrl+D
- 用于文件名过滤,而不是
Crash Dump Files
select All files
选择您感兴趣的 DLL 或 EXE。 WinDbg 将例如说
Loading Dump File [C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll]
虽然它不是真正的转储文件
- 发出典型命令
.symfix
和 .reload
。如果符号服务器上存在符号,将下载它们。
看看你是什么 "debugging",你会发现它是 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.pdb06A2AA257A45FDAC5776EDDC7BBA542\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
...
我有一个 DLL 或 EXE 文件,我想为其获取符号(PDB 文件),即从符号服务器下载。
注意:DLL 不是故障转储的模块,因此无法打开转储并执行 .symfix
和 .reload
。
我试过了
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中类似:
- 选择
File | Open Crash Dump ...
或按Ctrl+D - 用于文件名过滤,而不是
Crash Dump Files
selectAll files
选择您感兴趣的 DLL 或 EXE。 WinDbg 将例如说
Loading Dump File [C:\Windows\Microsoft.NET\Framework64\v4.0.30319\clr.dll]
虽然它不是真正的转储文件
- 发出典型命令
.symfix
和.reload
。如果符号服务器上存在符号,将下载它们。
看看你是什么 "debugging",你会发现它是 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.pdb06A2AA257A45FDAC5776EDDC7BBA542\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
...