windbg入门之旅:(1)常见的windbg命令

1 .logopen logfile.log

该命令的作用是创建一个windbg的日志文件,从该文件创建开始直到.logclose调用,所有debug的过程都会log到logfile.log文件中。这对于调试过程的回忆和追踪是有用处的。

2 bp module!functionname(或者内存地址)

该命令的作用是创建在指定的地方插入一个断点。当程序运行到断点时,会产生中断等待用户处理(这个过程叫做中断命中breakpoint hit)。程序中可以加入多个中断。当我们在动态调试程序的时候,该命令较为常用,但是对于静态的dump文件不需要。

3 bl

该命令的作用是列出所有断电信息。

0:000> bp mydebug!CallFast
0:000> bl
 0 e 00401430     0001 (0001)  0:**** mydebug!CallFast


4 ln 某个地址
(该地址可以是register的值,module!function等只要是能够表示内存地址的均可)

该命令的作用是列出与该指定地址附近的函数(list nearest function)

ln 00401430
D:\study\mydebug\mydebug.cpp(48)
(00401430)   mydebug!CallFast   |  (004014f0)   mydebug!MyFunction

 

5 dd 内存地址 (可选参数Lx表示显示的长度,缺省长度为8)

该命令的作用以每4个字节为一个单元快,显示从指定内存地址开始的内容。缺省情况下会显示连续32块内存地址,即32*4个字节内的内容。当然,显示太多没有意义的内存内容只会干扰我们,因此我们也可使指定所要显示的单元块的个数,如

dd esp L4 表示显示从esp指定地址开始的4个单元块,即连续16个字节的内容

dd esp
0012fe04  0012feb8 00000000 7ffdd000 cccccccc
0012fe14  cccccccc cccccccc cccccccc cccccccc
0012fe24  cccccccc cccccccc cccccccc cccccccc
0012fe34  cccccccc cccccccc cccccccc cccccccc
0012fe44  cccccccc cccccccc cccccccc 00000000
0012fe54  00000000 00000004 004310d8 0012feb8
0012fe64  00401402 00000006 0012ff18 00000000
0012fe74  7ffdd000 cccccccc cccccccc cccccccc

0:000> dd esp L4
0012fe04  0012feb8 00000000 7ffdd000 cccccccc

这个命令较为常用常用


6 db 内存地址 (Lx 缺省长度为8)

该命令的作用和dd非常相似,不过db显示的内存单元块大小为一个Byte,并且和dd显示的方向正好相反(高-低)。该命令相比dd,其好处是它会在右边显示出其相应的ASCII码,这在查看某个内存中的字符串时尤为有用。

db 00431124
00431124  52 65 73 75 6c 74 20 6f-66 20 74 68 65 20 64 69  Result of the di
00431134  76 69 73 69 6f 6e 20 6f-66 20 25 64 20 62 79 20  vision of %d by
00431144  25 64 20 69 73 20 3a 25-64 00 00 00 00 00 00 00  %d is :%d.......
00431154  00 00 00 00 69 33 38 36-5c 63 68 6b 65 73 70 2e  ....i386\chkesp.
00431164  63 00 00 00 00 00 00 00-54 68 65 20 76 61 6c 75  c.......The valu
00431174  65 20 6f 66 20 45 53 50-20 77 61 73 20 6e 6f 74  e of ESP was not
00431184  20 70 72 6f 70 65 72 6c-79 20 73 61 76 65 64 20   properly saved
00431194  61 63 72 6f 73 73 20 61-20 66 75 6e 63 74 69 6f  across a functio

该命令显示了从内存00431124处开始连续16*8的内容,最右边显示的是其对应的ASCII码的值。


7 da 内存地址

该命令是显示指定内存地址的字符串的值,而不会象dd,db那样显示连续8个单元块的内容,而是遇到结束符即结束,因此在查看指定内存中的字符串时尤为有用

0:000> da 00431124
00431124  "Result of the division of %d by "
00431144  "%d is :%d"
该命令只显示了00431124开始的字符串的值,然后自动终止。而用db的话效果如上所示。


8 k, kb, kv,kn

k命令的作用是显示出所有call stack中的内容。kb外加显示用来传输参数的前3个双字节(double word)的地址。

kv则在kb基础上外加显示其调用规则(calling convention)。

kn:在kb的基础上最左边另外显示call stack frames的frame number,。从而可以通过.frame命令选择相应的call stack frame进行调试,例如dv可以查看当前call stack frame的传入参数值和函数体中临时变量的值。

如下所示:

0:000> k
  *** Stack trace for last set context - .thread/.cxr resets it
ChildEBP RetAddr 
0012fe60 00401402 mydebug!CallFast+0x60 [D:\study\mydebug\mydebug.cpp @ 58]
0012feb8 00401393 mydebug!CallwithStd+0x42 [D:\study\mydebug\mydebug.cpp @ 44]
0012ff18 0040130a mydebug!CallWithCDecl+0x43 [D:\study\mydebug\mydebug.cpp @ 37]
0012ff80 00401969 mydebug!main+0x9a [D:\study\mydebug\mydebug.cpp @ 28]
0012ffc0 77e6f23b mydebug!mainCRTStartup+0xe9 [crt0.c @ 206]
0012fff0 00000000 kernel32!BaseProcessStart+0x23
0:000> kb
  *** Stack trace for last set context - .thread/.cxr resets it
ChildEBP RetAddr  Args to Child             
0012fe60 00401402 00000006 0012ff18 00000000 mydebug!CallFast+0x60 [D:\study\mydebug\mydebug.cpp @ 58]
0012feb8 00401393 004310d8 00000004 00000006 mydebug!CallwithStd+0x42 [D:\study\mydebug\mydebug.cpp @ 44]
0012ff18 0040130a 0043101c 00000004 00000006 mydebug!CallWithCDecl+0x43 [D:\study\mydebug\mydebug.cpp @ 37]
0012ff80 00401969 00000001 00440e90 00440dc0 mydebug!main+0x9a [D:\study\mydebug\mydebug.cpp @ 28]
0012ffc0 77e6f23b 00000000 00000000 7ffdd000 mydebug!mainCRTStartup+0xe9 [crt0.c @ 206]
0012fff0 00000000 00401880 00000000 78746341 kernel32!BaseProcessStart+0x23
0:000> kv
  *** Stack trace for last set context - .thread/.cxr resets it
ChildEBP RetAddr  Args to Child             
0012fe60 00401402 00000006 0012ff18 00000000 mydebug!CallFast+0x60 [D:\study\mydebug\mydebug.cpp @ 58]
0012feb8 00401393 004310d8 00000004 00000006 mydebug!CallwithStd+0x42 [D:\study\mydebug\mydebug.cpp @ 44]
0012ff18 0040130a 0043101c 00000004 00000006 mydebug!CallWithCDecl+0x43 [D:\study\mydebug\mydebug.cpp @ 37]
0012ff80 00401969 00000001 00440e90 00440dc0 mydebug!main+0x9a [D:\study\mydebug\mydebug.cpp @ 28]
0012ffc0 77e6f23b 00000000 00000000 7ffdd000 mydebug!mainCRTStartup+0xe9 [crt0.c @ 206]
0012fff0 00000000 00401880 00000000 78746341 kernel32!BaseProcessStart+0x23 (FPO: [Non-Fpo])
 kn
 # ChildEBP RetAddr 
00 0012fe60 00401402 mydebug!CallFast+0x60 [D:\study\mydebug\mydebug.cpp @ 58]
01 0012feb8 00401393 mydebug!CallwithStd+0x42 [D:\study\mydebug\mydebug.cpp @ 44]
02 0012ff18 0040130a mydebug!CallWithCDecl+0x43 [D:\study\mydebug\mydebug.cpp @ 37]
03 0012ff80 00401969 mydebug!main+0x9a [D:\study\mydebug\mydebug.cpp @ 28]
04 0012ffc0 77e6f23b mydebug!mainCRTStartup+0xe9 [crt0.c @ 206]
05 0012fff0 00000000 kernel32!BaseProcessStart+0x23

//左边显示的即为call stack frame number

运行.frame frameno ,如.frame 0 即可选择相应的call stack frame,然后 dv即可查看stack中的参数值

.sympath + sympath

这个命令应该是第一个进行说明。当我们开始分析某个dump文件时,须首先载入其symbol(一般后缀为.pdb,.dbd),这时需要指定其symbol路径,然后重新倒入。命令如下:

.sympath + c:\mydump\

.reload

如果只要显示其symbol search 路径, .sympath即可。

如何给windbg设置自动加载symbols文件路径?

我们可以通过添加一个environment variable: _NT_SYMBOL_PATH来设置symbols文件的path. 这样当windbg每次启动之后,在需要加载symbols文件的时候,会自动根据_NT_SYMBOL_PATH指定的path进行查找。

例如: _NT_SYMBOL_PATH: SRVV*c:\localsymbols*\\symbolserver\publicsymbol

10 r

该命令的作用是显示各register的值。


 

posted on 2008-11-13 15:33  飞天舞者  阅读(2763)  评论(0编辑  收藏  举报

导航

For more information about me, feel free email to me winston.he@hotmail.com