!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 命令删除指定模块的所有符号信息,并且按需要重新加载这些符号。某些情况下,该命令也会重新加载或卸载模块本身。
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
果然如此!
由于符号服务器对每个版本的二进制文件的符号使用不同的名字,除非确认下游存储被破坏了,否则不需要使用该选项。
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的某个结构体时