1,
.reload
k 当前调用堆栈。
u 当前正在执行的代码。
2,
~ 查看被调试进程中的线程信息
每一行是一个线程的信息。第一行中,0 表示这个进程的编号;1ff4.1038 是 16 进制数
字,前者是当前进程的进程 ID,后者是线程 ID;后面的信息是线程状态和 Teb 地址。第二
行的线程编号前有一个点号“.”,表示这是当前线程,也就是刚才使用 u 和 k 命令查看到的
线程。
0:046>,冒号前的数字表示当前的进程号,同时调试多个进程
时,每个进程都会被指派一个进程号;冒号后的 000 表示线程号。
进行内核调试时,如果是单处理器系统,提示符是 kd>的形式;如果
是多处理器系统,则是 0: kd>的形式,前面的 0 表示处理器号。
3,
~threadIDs 切换到指定threadID线程。
4,
软断点
bp: 可以直接对某个代码地址设置断点。
0:000> bp TestModule!main
在TestModule内的main函数设置断点。同直接F9。
bl 查看已经存在的断点,bd禁用断点,de重启断点,bc删除断点。
0:000> bl
0 e 00401030 [C:\Users\NetRoc\Desktop\TestDebug1\T estDebug1.cpp @ 23]
1 e 0040105d [C:\Users\NetRoc\Desktop\TestDebug1\T estDebug1.cpp @ 27]
如上面命令输出中的第二行,1 表示断点 ID。当禁用、重新启或删除断点,或者其他命令来操作这个断点时,都需要用到这个 ID;
第二个“e”表示断点是启用的,如果是“d”则表示当前被禁用,如果带“u”则说明是后面将要介绍的未定断点;第三列的 0040105d 是该断点的地址;
后面的内容是断点所在的源文件和行号。
对于还没有加载到内存中的模块,比如在调用了 LoadLibrary 之后才加载的DLL。如果使用 bp 来对这个模块中的函数设置断点,会找不到符号,这时就会被调试器自动转变成用 bu 命令来设置的未定断点。
bu 可以对还不能识别的符号设置断点,当系统中有新模块加载进来时,调试器会对未定断点再次进行识别,如果找到了匹配的符号则会设置它。
对于bu的断点上面断点ID后面的e显示是eu,表示启用的未定断点。
5,
硬断点 ba:
ba 访问断点可以在某个内存地址处的数据被读取、写入或者执行的时候中断下来。
首先用.restart 命令重新启动调试目标。
对局部变量 x 有赋值操作 x *= 10 。
输入 ba w4 @@C++(&x)命令。“&i”表示变量 i 的地址,“w”表示写入操作,“4”表示只处理&x地址处 4 字节的写入操作。F5 运行,程序被成功中断下来 Breakpoint 1 hit。
WinDbg 的数据断点是通过 CPU 硬件断点实现的。而 DRx 寄存器所设置的内存访问断
点属于陷阱(Trap)而不是错误(Fault),CPU 对陷阱的处理是执行完该条指令后触发异常。因
此 WinDbg 只能在之后的一条指令处断下来。
Windows 调试工具支持两种语法的表达式:MASM 语法和 C++语法。如果没有特别指
明的话,默认是使用 MASM 表达式语法。一般来说,MASM 语法的表达式用来表示地址比
较方便,而 C++表达式用来表示结构或者类成员比较方便。可以通过@@C++(…)或者
@@masm(…)来包含表达式以明确指明所使用的语法。当使用 MASM 语法时,可以用双冒
号(::)或者双下划线(__)来表示类成员;但是使用 C++语法时则只能使用双冒号。
6,
d :查看内存
db :按byte查看内存
dd : 按DWORD查看内存
dv :查看当前作用域下局部变量的类型和值
? x : ?表达式求值命令常常用来查看符号所代表的值。 ? x 命令,它可以显示符号 x 对应的值,即局部变量 x的地址。
r :查看或者修改寄存器和伪寄存器
windbg基本命令