• Windbg调试


    Windbg中文帮助手册:http://www.dbgtech.net/windbghelp/

    执行程序:

      g (F5):   运行程序

      p(F10):    单步步过执行

         t  (F11/F8):  单步步入执行

    断点处理:

      bl  显示断点状态
      bp 断点下在固定地址
      bu 断点下在符号上
      ba 断点下在内存上(当内存被操作时触发)
      be disable掉断点
      bc Breakpoints 清除断点

      其他的断点操作包括:显示断点列表、禁止或恢复断点、删除断点等。

      bd:禁止断点,d代表Disable。如bd 1,禁止断点1。断点被禁止后将不起作用,但亦未删除。

      be:恢复断点,e代表Enable。恢复被禁止的断点。如be 1恢复1号断点。

      bc:清除断点,如:bc 1,清除断点1;bc *,清除全部断点。

      br:序号管理,r代表ReNumber,即重新排序。如:br 2 0,将2号断点重设为0号断点。

    内存处理:

    !address  [地址]:查看指定地址处的内存属性。

    !address :查看所有内存区域的属性。  

    d* (Display Memory) 命令显示指定内存或范围的内容。

    e* (Enter Values) 命令在指定内存地址写入数据。

    d[类型]  [地址范围]

      d代表Display,类型包括:字符、字符串、双字等。具体来说,d*命令共有这几种:d、 da、db、dc、dd、dD、df、dp、dq、du、dw、dW、dyb、dyd、ds、dS。解释如下:  
      db 以byte查看地址
      dd 以4字节查看
      dq 以8字节查看
      da 以字符串查看

    e 【地址】【数据】

      e{b|d|D|f|p|q|wAddress [Values
      e{a|u|za|zuAddress "String" 
      e Address [Values]

    注释

    该命令存在以下这些形式。edeD 命令的第二个字符区分大小写。见下表:

    命令输入
    e 输入数据的格式和前一次e* 命令一样。(如果上一次的e*命令是eaezaeuezu,则最后一个参数是String并且不能省略。)
    ea ASCII 字符串(不以NULL结尾)。
    eb 字节值。
    ed 双字值(4字节)。
    eD 双精度浮点数(8字节)。
    ef 单精度浮点数(4字节)。
    ep 指针大小的值。该命令根据目标机的处理器架构是32位还是64位,可能分别等于edeq
    eq 4字值(8字节)。
    eu Unicode字符串(非NULL结尾)。
    ew 字值(2字节)。
    eza NULL结尾的ASCII字符串。
    ezu NULL结尾的Unicode字符串。

    其他的内存处理命令:

    寄存器查看

      r  :显示所有寄存器的值

      r 【寄存器】 :显示某一个寄存器的值

      默认每执行一步代码就会显示寄存器的值,在指令后面加r时候是指不显示寄存器的值:

        pr            执行一行源码,并将寄存器切换为不显示

    查看调用堆栈:

      使用下面一些方法显示调用堆栈:

      k (Display Stack Backtrace) 命令是基本的堆栈追踪命令。该命令显示栈帧的基指针、返回地址和函数名。如果有源码行号信息,k命令还会显示源码模块和行号。

      kb (Display Stack Backtrace) 命令和k命令一样显示堆栈,并且显示传递给函数的前三个参数。

      kp (Display Stack Backtrace) 命令和kb命令一样显示堆栈,并且显示传递给函数的完整参数列表。

      kv (Display Stack Backtrace) 命令和kb一样显示堆栈,并且再显示帧指针省略信息(FPO)。在基于x86的处理器上,该命令还显示调用约定的信息。在基于Itanium的处理器上,该命令显示非易失性寄存器。

      kd (Display Stack Backtrace) 命令显示原始堆栈信息,不按照任何格式。

    汇编模式的调试:

      反汇编指令:

    个人常用: 

    查看堆命令:

      !heap

      !heap -a

      !heap也有一些很好用的命令

      !heap -stat 显示进程中所有堆的信息,通过这个命令可以找到堆喷分配内存块所属的堆

      !heap -a HEAP_HANDLE 显示指定句柄的堆的情况

      !heap -stat -h HEAP_HANDLE 可以看到堆中块的分布情况

      !heap -flt s size 显示所有指定大小的块

      !heap -p -a 堆分配记录

    r 查看地址和寄存器
    k 查看栈空间
    u 查看指令
    lmi 查看加载的模块
    ln 查看当前地址所在符号
    s -a 搜索字符串
    s -d 搜dword
    s -

    g -> go 继续执行

    F10 (p) 逐过程单步

    F8   继续单步跟入

    F5   (g)继续执行

    F9

    !address 扩展命令可以显示指定的内存地址的信息

    dv  命令可以查看当前作用域下局部变量的类型和值

    .reload命令重新加载模块的符号信息

    kv 可以查看函数异常的函数调用栈 

    kn 命令查看栈贞的编号 

    uf 命令反汇编

    dv 命令显示当前作用域的所有局部变量的名字和值。

    .hh 用来在Windbg中打开帮助文档,比如使用.hh k则帮助文档会打开到索引k命令处。

    poi 操作符是WinDBG中可以被用来对指针进行解引用。类似C语言中对指针的操作符*

    .attach 0n4220 // 4220为十进制pid,使用该命令附加调试时,必须先存在一个调试会话

    .detach // 分离调试

    .restart // 重启并调试

    .kill // 强制结束当前调试

    q // 退出windbg

      掌握有这些基本的调试指令,基本上可以调试一般的程序了,如果需要使用更多的功能需要查看windbg的帮助文档来提升调试。后面我也会在调试和使用的过程中加以总结和完善。

    1、poi指令:Poi操作符在WinDBG中可以被用来对指针进行解引用. 类似C语言中对指针的操作符*. 

    例如:0×00123456   中存放的是:0×00420000

       0×00420000  中存放的是:1234

       dd poi(0×00123456) 显示的就是1234

    2、 查看多个地址数据:dd 起始地址 目标地址:

      dd 7ffd5000    7ffd5000 +128

     3、ba Access Size [地址]  Access 是访问的方式, 比如 e (执行), r (读/写), w (写)

        Size 是监控访问的位置的大小,以字节为单位。 值为 1、2或4,还可以是 8(64位机)。

      比如要对内存0x0483DFE进行写操作的时候下断点,可以用命令 ba w4 0x0483DFE。

  • 相关阅读:
    JVM致命错误日志(hs_err_pid.log)分析
    JVM调优-命令大全(jps jstat jmap jhat jstack jinfo
    GC日志分析详解
    简单的学习,实现,领域事件,事件存储,事件溯源
    学习DDD的初步尝试,从最基础的开始,业务介绍,划分限界上下文 ,建立模型
    .Net Core + DDD基础分层 + 项目基本框架 + 个人总结
    第三节:使用Log4net和过滤器记录异常信息,返回异常给前端
    从一层到多层架构的学习笔记
    学习服务之间的调用,三个方法的演化
    .Net Core3.0 WEB API 中使用FluentValidation验证,实现批量注入
  • 原文地址:https://www.cnblogs.com/Yable/p/8633511.html
Copyright © 2020-2023  润新知