9.windbg-!sym、.reload、!chksym

!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





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值