在WinDBG中设置断点的命令
命令
==========
~0 bp 02sample!KBTest::Fibonacci_stdcall "r esp"
在零号线程上的KBTest类的Fibonacci_stdcall函数上设置断点, 并且在触发断点时执行"r esp"命令.
bl
列出所有已经设置了的断点
bc *
清除所有断点
bp 02sample!KBTest::Fibonacci_stdcall “r esp;g”
在所有线程上设置断点, 并且在触发断点时执行"resp;g"两条命令.
bm 02sample!*kbtest*
命令bm可以在参数中指定一个符号模式, 这样在所有与这个符号匹配的地址上都将设置一个断点. 上面的命令使用bm在KBTest的所有方法上设置断点.
bu ole32!CoInitializeEx
Windows操作系统会在必要时加载动态链接库, 而我们经常需要在一个还没有被加载的模块上设置断点. 命令bu可以用来设置一个延迟断点, 只有当这个断点所在的模块被加载时, 延迟断点才能成为一个真正的断点. 上面的命令将在DCOM的初始化函数中设置一个延迟断点.
内存访问断点
============
内存访问断点的名令为ba, 即Break on Access.
用户态的命令语法:
[~Thread] ba[ID] Access Size [Options] [Address [Passes]] ["CommandString"]
举例:
ba w4 gGlobal+0
上面命令设置了一个断点, 使处理器监视从gGlobal起始地址开始的4个字的内的写入操作, 一旦发现有试图修改这个地址的操作, 立即进入断点.
条件断点
=============
在每个断点上都可以设置一个命令, 每当调试目标处罚这个断点时, 调试器都会执行这个命令. 通过这个功能我们可以创建非常有用的条件断点.
我们经常会遇到某个函数只有在某种条件下才会发生故障, 因此我们希望程序在函数某条件下发生故障时才停下来, 以进行进一步的分析. 这可以通过有条件地执行g命令来实现. 如果函数执行后没有检测到错误条件的话, 就继续执行. 否则就停下来.
bp 02sample!KBTest::Fibonacci_stdcall “gu; .if(eax!=1) {g}”
上面的命令中, 我们配置了一个断点, 断在KBTest类的Fibonacci_stdcall函数开始的时候, 然后立即执行命令gu(即Go Up, 目标会开始执行直到当前函数结束), 函数执行结束后检测函数的返回值(eax), 如果不是1, 则继续执行(g), 否则, 进入断点.
参考资料
===========
<<AWD>>