windbg的常用命令

来源:互联网 发布:mac 壁纸 编辑:程序博客网 时间:2024/05/15 23:45

打开源代码关闭后如何重新打开

刚发现,原来源代码窗口默认不打开,而在你设置断点并命中后自动打开。所以,如果你手动关闭源码窗口,一般情况系不需要手动重新打开。
而且你重新打开也只能通过File->OpenSourceFile去打开一个和当前被调试进程运行点不关联的代码。所以可以想办法让程序再次命中断点来触发弹出源代码窗口。

如何让源代码窗口显示行号

windbg好像不提供在源码窗口显示行号,源代码显示行号估计在开发环境中比较重要,定位到编译链接错误。而在调试器里,可能意义不大。源码窗口是在命中断点的时候显示,而且当前执行是高亮的。当然windbg也能显示光标所在行的行号,统一在调试窗口右下角的状态栏显示。

如何在命令提示符窗口显示行号

l+或者l-是单独的命令用来控制。后面可以加参数,用来控制代码行选项。+表示打开某个选项,-标识关闭。
l+l:在命令提示符窗口中显示当前执行的源代码文件名和行号:
比如d:\practise\main.cpp(23)+0x1
l+s:在命令提示符窗口中显示当前执行的源代码行:
25: ans = bar(5,6,7,8,9);
l+t:设置源码调试模式还是汇编码调试模式,比如单行执行的时候是源码单行还是汇编码单行。
l+* 或者l-*打开或者关闭所有选项。

断点如何保存到工作空间

重启调试会话后,之前用bp设置的断点需要重新设置,不会被保存。这是由bp命令不支持断点保存到工作空间导致。可以换用bu命令。
这样无论是.restart 之后,还是直接退出windbg后重启,都能自动加载之前在工作空间中设置的断点。

查看栈信息

k系列命令返回当前现成的栈帧。
k 是最常用的命令,显示栈帧基地址指针,返回地址,以及函数名。
这常常不够,因为debug时常常需要看参数。
kp显示每个函数的所有参数,包括参数类型,参数名,以及值。但是这个参数需要完整符号信息的支持。这一点很重要,通常无法满足,发布版软件不会携带这个。所以常常看不到需要的信息。

查看加载的模块

查看当前进程加载的模块是也是非常重要的手段,用 lm
00200000 0022a000 practise C (private pdb symbols) d:\practise\Debug\practise.pdb
58440000 58563000 MSVCR90D (deferred)
75160000 751ab000 KERNELBASE (deferred)
76050000 76124000 kernel32 (export symbols) C:\Windows\system32\kernel32.dll
77150000 77291000 ntdll (export symbols) C:\Windows\SYSTEM32\ntdll.dll

调试时,一般情况下需要pdb文件,而如果我们调试的是系统自带的工具软件,比如notepad,本身是不带pdb文件的。但是对应的系统dll却可以自动下载,比如ntdll.dll可以下载对应版本的pdb文件。用lm查看可以发现:
7c920000 7c9b6000 ntdll (export symbols) C:\WINDOWS\system32\ntdll.dll

显示符号

用x命令
如x practise!*显示practise模块下的所有符号。注意 x是必需要加参数的。符号的显示需要pdb文件,否则没法通过符号点位到具体的二进制代码行。尽管release版本可执行文件,也加载pdb,但比debug版本的pdb文件小得多,很多符号已经被优化掉,所以对调试有一定的影响。

查看汇编代码

用u命令,注意可以用 u foo l20,l表示显示的汇编代码行数,十六进制。

0 0
原创粉丝点击