在线笔记
全部博文(596)
分类:
2015-01-04 15:18:57
原文地址:WinDbg 设置断点 作者:zwei-wuwen
这两种设断点语法是等价的。
bp,bu,bm 的区别:
使用下面一些方法来控制或显示断点:
每个断点都有一个关联的10进制数字称为 。该数字在各种命令中用于指定断点。
当在WinDbg 或中使用鼠标设置断点时,调试器创建的是bu断点。
如果想启动新调试目标并在实际的程序即将开始执行的时候中断下来,就不要使用-g选项。应该让初始断点被触发。当调试器激活之后,在main或winmai函数上设置断点并使用 命令。之后所有初始化过程都会运行并且程序在main函数即将执行时停止。
关于内核模式的自动断点的更多信息,查看。
断点支持几种地址语法,包括虚拟地址、函数偏移和源码行号。例如,可以使用下面的方法之一来设置断点:
0:000> bp 0040108c
0:000> bp main+5c
0:000> bp `source.c:31`
关于这些语法的更多信息,查看, ,以及各个命令的主题。
在内核模式下,最多可以使用32个断点。在用户模式下,可以使用任意数量的断点。
数据断点的数量由目标处理器架构决定。
如果要在MyClass类的MyMethod方法上设置断点,可以使用两种不同语法:
0:000> bp MyClass::MyMethod
0:000> bp MyClass__MyMethod
0:000> bp @@( MyClass::MyMethod )
如果要使用更复杂一些的断点命令,应该使用MASM表达式语法。表达式语法的更多信息,查看。
每个用户模式应用程序在虚拟内存0x00000000 到0x7FFFFFFF 的地址称为用户空间。
当WinDbg或CDB在小于0x80000000的地址上下断时,断点是在单个进程的指定的用户空间的地址设置。用户模式调试时,当前进程决定了虚拟地址的意义。更多信息,查看。
在内核模式,可以使用bp、 bu、 ba 命令和Breakpoints 对话框在用户空间设置断点。必须首先使用.process /i (或在一些内核空间的函数上的指定进程的断点)来将目标切换成当前,并使用该进程上下文来指定拥有目标地址空间的用户模式进程。
用户模式的断点总是和设置该断点时进程上下文为激活状态的进程关联起来。如果有用户模式调试器在调试该进程,而还有一个内核模式调试器在调试进程运行的机器,即使断点由内核调试器设置,它中断时也是进入用户模式调试器。这时可以从内核模式调试器中断系统,或使用 命令来将控制权交给内核调试器。
注意 如果目标机运行在Microsoft Windows NT 4.0上,则不能使用内核调试器在用户空间中设置断点。
如果在某个表达式中想引用某个断点的地址,可以使用一个$bpNumber 语法的,Number是断点ID。关于该语法的更多信息,查看。
当使用内存地址或符号加偏移的方式设置断点时,一定不能将断点设置到一条指令的中间。
例如,有下面一段汇编代码。
770000f1 5e pop esi
770000f2 5b pop ebx
770000f3 c9 leave
770000f4 c21000 ret 0x10
770000f7 837ddc00 cmp dword ptr [ebp-0x24],0x0
前三条指令只有1个字节长。但是第四条指令有3字节长。(包含在0x770000F4,0x770000F5, 和0x770000F6三个地址的字节)如果要在该指令上使用bp、bu或 ba设置断点,则必须将地址指定为0x770000F4 。
如果使用ba命令在0x770000F5 地址设置了断点,处理器将在该位置设置断点。但是 该断点永远不会被触发,因为处理器认为0x770000F4 才是这条指令的实际地址。
如果使用bp 或bu命令在 0x770000F5 设置断点,调试器在这个位置会写入断点。但是由于调试器使用如下方法设置断点,它可能造成目标运行错误:
当在0x770000F5设置断点时,调试器保存它的值并写入断点指令。但是当程序运行时到达0x770000F4 时,会将它视为一条多字节指令的第一个字节。处理器将0x770000F4、0x770000F5可能还有后面的一些字节当作一条指令。这会产生各种非正常的行为。
因此,当使用bp、bu或ba 命令设置断点时,要确定断点在合适的地址上。如果使用WinDbg图形界面来添加断点就不用在意这样的情况,因为它会自动选择正确的地址。
可以在断点中包含一条命令用于在断点触发时自动执行。
也可以包含一条用于执行的命令字符串。但是,其中任何恢复程序执行的命令(例如g和t)都会终止命令列表的执行。
例如下面的命令在MyFunction+0x47中断,写入一个dump文件并恢复执行。
0:000> bu MyFunction+0x47 ".dump c:\mydump.dmp; g"
注意 如果正在从内核调试器控制用户模式调试器,不要在命令字符串中使用 。串口的速度可能跟不上该命令,并且不能再中断到CDB中。关于这种情况的更多信息,查看。
@!"
0:000> bu @!"ExecutableName!std::pair
这个例子中,ExecutableName 是一个可执行文件的名字。
这种转义语法在C++中比C中更加有用(例如重载的操作符),因为C函数名中不会存在空格(或特殊字符)。但是,该语法在托管代码中也同样重要,因为.NET Framwork中非常多的使用重载。
可以设置仅在特定条件下被触发的断点。关于这类断点的更多信息,查看。
断点命令:
1.ba。break on acess. The ba command sets a .
2.bc.(Breakpoint Clear)
The bc command permanently removes previously set breakpoints from the system.
3.bd (Breakpoint Disable)
The bd command disables, but does not delete, previously set breakpoints.
4.be (Breakpoint Enable)
The be command restores one or more breakpoints that were previously disabled.
The bl command lists information about existing breakpoints.