几个基本概念:
1:windbg中的符号和语句命令
;
命令分隔符
{} 表达式块
$$ 命令中的注释,已 “;”代表注释结束
.catch 当程序错误的时候,防止程序终止
.if .do .while .break .for .else 和C语言中的关键字类似
几个命令:
c命令:比较内存
例如:
考虑如下程序











比较rgBuf1和rgBuf2内存内容可以使用如下命令:

或者
0
:
000
>
c rgBuf1 L
100
rgBuf2

线程控制命令:

断点设置命令:

变量显示命令:

调试分析命令:

用户空间:
用户空间即用户模式的应用程序运行的空间,他的虚拟地址由0x00000000 到0x7FFFFFFF
设置断点只是针对某个线程空间,所以如果需要队某个线程使用bp 虚拟内存地址形式的断点的话,需要使用.process [process Number]切换到线程空间
设置断点:
断点中可以设置的地址的形式:
1: 虚拟内存地址
虚拟内存地址的区域设置
设置内存地址的区域可以使用一对地址:
例如:
0x00001000 0x00001007
如果对象的大小为
1size
它等同于
0x00001000 L8
一般的对象的大小都是
4bytes
,所以一般为
0x00001000 L2
2: 函数偏移量
3: 源代码+行数 :`[[Module!]Filename][:LineNumber]`
4: 对C++可以对模块中的某个类的函数设置断点:
例如:
bp:Set Breakpoint
基本语法:
1:无条件设置断点:
bp Address
0
:
000
>
bp 0040108c
0
:
000
>
bp main
+
5c
0
:
000
>
bp `source.c:
31
`
0
:
000
>
bp MyClass::MyMethod
0
:
000
>
bp MyClass__MyMethod
0
:
000
>
bp @@( MyClass::MyMethod )







2:设置有条件断点
例如:

1
:使用寄存器做条件判断:
例如:
注意有符号寄存器的扩展:
例如:

这样设置的断点在用户空间是不会工作的,因为 设置断点的0xc0004321的最高位为1,此时会被当作有符号数来处理成0xFFFFFFFF`C0004321
需改为以下模式


bu: Set Unresolved Breakpoint
bp 和bu的区别:
1:bp是立即生效,且马上被转化为内存中的某个地址,如果调式模块被改变,bp指向的地址不会变,而bu只是和symbol文件相关联,模块改变的时候,指向的symbol的offset或者plus是不变的
2: bp指定的断点在模块unload之后从bl列表中删除,而bu的断点是永远存在的。
3:在windbg的可视源码或者可视的反汇编代码中所设的断点都是bu模块的断点
bm
:Set Symbol Breakpoint
使用bm设置断点支持正则表达式的模式匹配,所以可以使用他来设置多个断点
如果正则表达式被匹配的话,他的效果将和bu设置的是一样的
例如:





当wndbg在设置软件断点在代码段的时候,windbg将程序指令替换为断点指令,但是当断点设置在数据段的时候,将会将程序数据替换为断点指令,从而导致数据被修改,因此在设置断点在数据段的时候,推荐使用 ba(
ba (Break on Access).)指令