9.windbg-!sym、.reload

来源:互联网 发布:淘宝模版在线制作 编辑:程序博客网 时间:2024/05/29 15:51

!sym

!sym 扩展控制显示详细的符号加载和符号提示。

0:001> !sym!sym <noisy/quiet - prompts/prompts off> - quiet mode - symbol prompts on


0:001> !sym noisy  ///< 激活详细符号加载noisy mode - symbol prompts on0:001> !sym quiet ///< 禁止详细符号加载quiet mode - symbol prompts on

0:001> !sym prompts ///< 当SymSrv接收到认证请求时,允许弹出对话框quiet mode - symbol prompts on0: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 foundDBGHELP: ntdll - public symbols           C:\WINDOWS\symbols\dll\ntdll.pdb

好吧,我们发现没有立即显示加载符号

0:001> lm m gdi32     ///< deferred状态start    end        module name77200000 77290000   GDI32      (deferred)             0:001> .reload /f gdi32.dll      ///<f 强制调试器立即加载符号,注意是gdi32.dll不是gdi32SYMSRV:  c:\mysymbol\wgdi32.pdb\6E2E9DA4A20241F7B6BB0F1B89FD7A522\wgdi32.pdb not foundSYMSRV:  wgdi32.pdb from http://msdl.microsoft.com/download/symbols: 216845 bytes - copied         DBGHELP: c:\mysymbol\wgdi32.pdb\6E2E9DA4A20241F7B6BB0F1B89FD7A522\wgdi32.pdb already cachedDBGHELP: GDI32 - public symbols           c:\mysymbol\wgdi32.pdb\6E2E9DA4A20241F7B6BB0F1B89FD7A522\wgdi32.pdb0:001> lm m gdi32 ///<加载成功start    end        module name77200000 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 /fReloading current modules.DBGHELP: C:\WINDOWS\symbols\calc.pdb - file not foundDBGHELP: calc - public symbols           C:\WINDOWS\symbols\exe\calc.pdb.DBGHELP: C:\WINDOWS\symbols\safemon.pdb - file not foundDBGHELP: C:\WINDOWS\symbols\dll\safemon.pdb - file not foundDBGHELP: C:\WINDOWS\symbols\symbols\dll\safemon.pdb - file not foundSYMSRV:  C:\MyLocalSymbols\safemon.pdb\84C1B55127174ACAA421A85A983FA63B1\safemon.pdb not foundSYMSRV:  http://msdl.microsoft.com/download/symbols/safemon.pdb/84C1B55127174ACAA421A85A983FA63B1/safemon.pdb not foundDBGHELP: C:\Program Files\360\360Safe\safemon\safemon.pdb - file not foundDBGHELP: 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 foundDBGHELP: AcGenral - public symbols           C:\WINDOWS\symbols\DLL\AcGenral.pdbDBGHELP: comctl32 - public symbols           C:\MyLocalSymbols\MicrosoftWindowsCommon-Controls-6.0.2600.6028-comctl32.pdb\E882C2C890724D598449E20A4FE6F07C1\MicrosoftWindowsCommon-Controls-6.0.2600.6028-comctl32.pdb.............................................0:001> lmstart    end        module name01000000 0101f000   calc       (pdb symbols)          C:\WINDOWS\symbols\exe\calc.pdb10000000 100b0000   safemon    (export symbols)       C:\Program Files\360\360Safe\safemon\safemon.dll..................................77fc0000 77fd1000   Secur32    (pdb symbols)          C:\MyLocalSymbols\secur32.pdb\7867B3F28B5C41CE847895E3FC013DC52\secur32.pdb7c800000 7c91e000   kernel32   (pdb symbols)          C:\MyLocalSymbols\kernel32.pdb\072FF0EB54D24DFAAE9D13885486EE092\kernel32.pdb7c920000 7c9b3000   ntdll      (pdb symbols)          C:\WINDOWS\symbols\dll\ntdll.pdb7d590000 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.dllkd> .reload /u hal</nobr>

如果在进行用户模式调试,并且希望加载一个不在目标程序模块列表中的模块,必须像下面的例子一样使用/s选项。

<nobr>0:000> lm m dmmainstart    end        module name0f5f0000 0f6ac000   DmMain     (export symbols)       I:\GameDL\Tools\PPSeedTool\build\Debug\DmMain.dll0:000> .reload /u DmMainUnloaded DmMain0:000> lm m dmmainstart    end        module name0: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 symbols0:000> lm m dmmainstart    end        module name0f5f0000 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> lmstart    end        module name00400000 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 = 0x0000000000cf8814 maincode_org!g_szMessage = 0x00000000 ""00cfb504 maincode_org!g_pSetWindowPos = 0x0000000
此方式也可强制加载其他的pdb,比如有时你需要用到某个pdb的某个结构体时