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

本文介绍了Windbg调试工具中关于断点设置的基本概念和操作,包括如何使用正则表达式定位模块,设置不同类型的访问断点,以及理解和运用汇编和C/C++知识来辅助调试。通过实例解析,帮助读者掌握高效调试技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    几个基本概念:

    
 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++可以对模块中的某个类的函数设置断点:
 
       例如:
       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:设置有条件断点
   例如:
   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 *
 
1 00413530  @ ! " dbgtest!wmain "
 
2 00411810  @ ! " dbgtest!__tmainCRTStartup "
 
3 : 004117f0 @ ! " dbgtest!wmainCRTStartup "
  使用bp 和bm /a 的风险:
  当wndbg在设置软件断点在代码段的时候,windbg将程序指令替换为断点指令,但是当断点设置在数据段的时候,将会将程序数据替换为断点指令,从而导致数据被修改,因此在设置断点在数据段的时候,推荐使用 ba( ba (Break on Access).)指令
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值