!sym
!sym 扩展控制显示详细的符号加载和符号提示。
0:001> !sym
!sym <noisy/quiet - prompts/prompts off> - quiet mode - symbol prompts on
0:001> !sym noisy ///< 激活详细符号加载
noisy mode - symbol prompts on
0:001> !sym quiet ///< 禁止详细符号加载
quiet mode - symbol prompts on
0:001> !sym prompts ///< 当SymSrv接收到认证请求时,允许弹出对话框
quiet mode - symbol prompts on
0:001> !sym prompts off ///< <span style="font-family: Arial, Helvetica, sans-serif;">当SymSrv接收到认证请求时,禁止弹出对话框</span>
quiet mode - symbol prompts off
都那么聪明,一个是noisy-quiet,一个是prompts off-prompt on,掌握了
.reload
.reload 命令删除指定模块的所有符号信息,并且按需要重新加载这些符号。某些情况下,该命令也会重新加载或卸载模块本身。
0:001> .reload /d ntdll.dll///< d 重新加载调试器模块列表中的所有模块
Reloading current modules
................................
DBGHELP: C:\WINDOWS\symbols\ntdll.pdb - file not found
DBGHELP: ntdll - public symbols
C:\WINDOWS\symbols\dll\ntdll.pdb
好吧,我们发现没有立即显示加载符号
0:001> lm m gdi32 ///< deferred状态
start end module name
77200000 77290000 GDI32 (deferred)
0:001> .reload /f gdi32.dll ///<f 强制调试器立即加载符号,注意是gdi32.dll不是gdi32
SYMSRV: c:\mysymbol\wgdi32.pdb\6E2E9DA4A20241F7B6BB0F1B89FD7A522\wgdi32.pdb not found
SYMSRV: wgdi32.pdb from http://msdl.microsoft.com/download/symbols: 216845 bytes - copied
DBGHELP: c:\mysymbol\wgdi32.pdb\6E2E9DA4A20241F7B6BB0F1B89FD7A522\wgdi32.pdb already cached
DBGHELP: GDI32 - public symbols
c:\mysymbol\wgdi32.pdb\6E2E9DA4A20241F7B6BB0F1B89FD7A522\wgdi32.pdb
0:001> lm m gdi32 ///<加载成功
start end module name
77200000 77290000 GDI32 (pdb symbols) c:\mysymbol\wgdi32.pdb\6E2E9DA4A20241F7B6BB0F1B89FD7A522\wgdi32.pdb
我们发现,第一次lm查询时GDI32(deferred),调用.reload /f加载后,再次lm,我们可以看到GDI32 (pdb symbols),OK,那我们也猜到了,如.reload /f不带模块,那么是不是会重新加载所有的symbols:
0:001> .reload /f
Reloading current modules
.
DBGHELP: C:\WINDOWS\symbols\calc.pdb - file not found
DBGHELP: calc - public symbols
C:\WINDOWS\symbols\exe\calc.pdb
.
DBGHELP: C:\WINDOWS\symbols\safemon.pdb - file not found
DBGHELP: C:\WINDOWS\symbols\dll\safemon.pdb - file not found
DBGHELP: C:\WINDOWS\symbols\symbols\dll\safemon.pdb - file not found
SYMSRV: C:\MyLocalSymbols\safemon.pdb\84C1B55127174ACAA421A85A983FA63B1\safemon.pdb not found
SYMSRV: http://msdl.microsoft.com/download/symbols/safemon.pdb/84C1B55127174ACAA421A85A983FA63B1/safemon.pdb not found
DBGHELP: C:\Program Files\360\360Safe\safemon\safemon.pdb - file not found
DBGHELP: E:\repos\safemon_8_1_1\Release\safemon.pdb - file not found
*** ERROR: Symbol file could not be found. Defaulted to export symbols for C:\Program Files\360\360Safe\safemon\safemon.dll -
DBGHELP: safemon - export symbols
.
DBGHELP: C:\WINDOWS\symbols\AcGenral.pdb - file not found
DBGHELP: AcGenral - public symbols
C:\WINDOWS\symbols\DLL\AcGenral.pdb
DBGHELP: comctl32 - public symbols
C:\MyLocalSymbols\MicrosoftWindowsCommon-Controls-6.0.2600.6028-comctl32.pdb\E882C2C890724D598449E20A4FE6F07C1\MicrosoftWindowsCommon-Controls-6.0.2600.6028-comctl32.pdb
.
............................................
0:001> lm
start end module name
01000000 0101f000 calc (pdb symbols) C:\WINDOWS\symbols\exe\calc.pdb
10000000 100b0000 safemon (export symbols) C:\Program Files\360\360Safe\safemon\safemon.dll
..................................
77fc0000 77fd1000 Secur32 (pdb symbols) C:\MyLocalSymbols\secur32.pdb\7867B3F28B5C41CE847895E3FC013DC52\secur32.pdb
7c800000 7c91e000 kernel32 (pdb symbols) C:\MyLocalSymbols\kernel32.pdb\072FF0EB54D24DFAAE9D13885486EE092\kernel32.pdb
7c920000 7c9b3000 ntdll (pdb symbols) C:\WINDOWS\symbols\dll\ntdll.pdb
7d590000 7dd84000 SHELL32 (pdb symbols) C:\MyLocalSymbols\shell32.pdb\DF59C75CA10B4BF89B447BB924C4292C2\shell32.pdb
果然如此!
/i 忽略 .pdb文件版本不匹配的情况。(如果没有包含该参数,调试器不会加载不匹配的符号文件。) 使用 /i时,即使没有明确指定,也会使用 /f。 /l 列出模块但是不重加载它们的符号。(内核模式下,使用该参数的输出和 !drivers 扩展命令一样。) /n 仅重加载内核符号。该参数不会重加载任何用户模式符号。(只能在内核模式调试时使用该选项。) /o 强制覆盖符号服务器的下游存储(downstream store)中的缓存文件。使用该标志时,还需要包含 /f。默认情况下,下游存储中的文件永远不会被覆盖。由于符号服务器对每个版本的二进制文件的符号使用不同的名字,除非确认下游存储被破坏了,否则不需要使用该选项。
/s 重新加载系统的模块映像列表中所有模块。(省略所有参数时,在内核模式下这是默认行为。) 如果在用户模式调试时使用名字来单独加载某个系统模块,则必须包含 /s。 /u 卸载指定模块和它的所有符号。调试器卸载任何名字匹配 Module 的模块,不管它的全路径是什么。映像名也会被搜索。更多信息,查看下面的注释节。 /unl 基于已卸载模块列表中的映像信息重新加载符号。 /user 仅重加载用户模式符号。(只能在内核模式调试时使用该选项。) /v 打开详细显示。 /w 将 Module 当作一个字面上的字符串。这样可以避免调试器展开通配符。reload /u 命令进行更广泛的搜索。调试器首先尝试使用Module 匹配精确的模块名,不管路径是什么。如果找不到匹配项,Module 被当作已加载的映像名。例如,如果HAL在内存中的名字为halacpi.dll,下面两个命令都可以卸载它的符号。
<nobr>kd> .reload /u halacpi.dll
kd> .reload /u hal</nobr>
如果在进行用户模式调试,并且希望加载一个不在目标程序模块列表中的模块,必须像下面的例子一样使用/s选项。
<nobr>0:000> lm m dmmain
start end module name
0f5f0000 0f6ac000 DmMain (export symbols) I:\GameDL\Tools\PPSeedTool\build\Debug\DmMain.dll
0:000> .reload /u DmMain
Unloaded DmMain
0:000> lm m dmmain
start end module name
0:000> .reload /s /f DmMain.dll
*** ERROR: Symbol file could not be found. Defaulted to export symbols for I:\GameDL\Tools\PPSeedTool\build\Debug\DmMain.dll -
DBGHELP: DmMain - export symbols
0:000> lm m dmmain
start end module name
0f5f0000 0f6ac000 DmMain (export symbols) I:\GameDL\Tools\PPSeedTool\build\Debug\DmMain.dll</nobr>
如果一个dll被内嵌于exe中,默认只会加载exe的pdb,.reload提供了强制加载的方式
1..sympath+ 增加pdb路径文件夹
2..reload /i 模块名=基地址,大小 /i忽略.pdb文件版本不匹配的情况。(如果没有包含该参数,调试器不会加载不匹配的符号文件
实例如下:
0:001> lm
start end module name
00400000 00ad0000 test011 (deferred)
02810000 02b7a000 SOGOUWB (deferred)
其实在ad0000后附带了个内嵌的maincode_org.dll
设置pdb路径操作:如果下述方式不行,就加到file->symbol file path中,记得不要有中文路径
0:001> .symfix+ E:\项目SVN
加载
0:001> .reload /i maincode_org=00AD0000,0024E000
*** WARNING: Unable to verify timestamp for maincode_org
0:001> x maincode_org!*
00ceb628 maincode_org!g_timeGetTime = 0x00000000
00cf8814 maincode_org!g_szMessage = 0x00000000 ""
00cfb504 maincode_org!g_pSetWindowPos = 0x0000000
此方式也可强制加载其他的pdb,比如有时你需要用到某个pdb的某个结构体时
!chksym
!chksym 扩展测试一个符号文件对某个模块的有效性。
语法
!chksym Module [Symbol]
实例如下:
可使用地址
0:000> !chksym 01000000
02sample.exe
Timestamp: 472187DC
SizeOfImage: 6000
pdb: 02sample.pdb
pdb sig: B3332E53-EDAB-4CF8-9111-7344EAFA46D8
age: 1
Loaded pdb is e:\fuxi\windbg\windowsadv\symstore.pri\02sample.pdb\B3332E53EDAB4CF891117344EAFA46D81\02sample.pdb
02sample.pdb
pdb sig: B3332E53-EDAB-4CF8-9111-7344EAFA46D8
age: 1
MATCH: 02sample.pdb and 02sample.exe
也可使用文件名
0:000> !chksym 02sample.exe
02sample.exe
Timestamp: 472187DC
SizeOfImage: 6000
pdb: 02sample.pdb
pdb sig: B3332E53-EDAB-4CF8-9111-7344EAFA46D8
age: 1
Loaded pdb is e:\fuxi\windbg\windowsadv\symstore.pri\02sample.pdb\B3332E53EDAB4CF891117344EAFA46D81\02sample.pdb
02sample.pdb
pdb sig: B3332E53-EDAB-4CF8-9111-7344EAFA46D8
age: 1
MATCH: 02sample.pdb and 02sample.exe