windbg调试-----断点设置

≯℡__Kan透↙ 提交于 2019-11-30 10:18:56

    几个基本概念:

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

    
char rgBuf1[100];
    
char rgBuf2[100];

    memset(rgBuf1, 
0xCCsizeof(rgBuf1));
    memset(rgBuf2, 
0xCCsizeof(rgBuf2));

    rgBuf1[
42= 0xFF;
}

   比较rgBuf1和rgBuf2内存内容可以使用如下命令:
       
0:000> c rgBuf1 (rgBuf1+100) 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++可以对模块中的某个类的函数设置断点:
 
       例如:
       bpSet 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:设置有条件断点
   例如:
   bp Address ".if (Condition) {OptionalCommands} .else {gc}"
    
 
 1使用寄存器做条件判断:
     例如: 
 注意有符号寄存器的扩展:
   例如:
 
 :000> bp mydriver!myFunction "j @eax = 0xc0004321  '';'gc'" 
  这样设置的断点在用户空间是不会工作的,因为 设置断点的0xc0004321的最高位为1,此时会被当作有符号数来处理成0xFFFFFFFF`C0004321
需改为以下模式
0:000> bp mydriver!myFunction "j (@eax & 0x0`ffffffff) = 0x0`c0004321  '';'gc'" 

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设置的是一样的
 例如:
  
 0:000> bm dbgtest!*main*
 
100413530 @!"dbgtest!wmain"
 
200411810 @!"dbgtest!__tmainCRTStartup"
 
3: 004117f0 @!"dbgtest!wmainCRTStartup"
 使用bp和bm /a的风险:
  当wndbg在设置软件断点在代码段的时候,windbg将程序指令替换为断点指令,但是当断点设置在数据段的时候,将会将程序数据替换为断点指令,从而导致数据被修改,因此在设置断点在数据段的时候,推荐使用 ba(ba (Break on Access).)指令
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!