• windbg学习进阶之——dump分析常用命令收集


    #重要说明

    (1) windbg命令分为标准命令,元命令和扩展命令

         标准命令提供最基本的调试功能,不区分大小写。如:bp  g  dt  dv  k等

         元命令提供标准命令没有提供的功能,也内建在调试引擎中,以.开头。如.sympath  .reload等

         扩展命令用于扩展某一方面的调试功能,实现在动态加载的扩展模块中,以!开头。如!analyze等

    (2) 进入调试状态时,直接回车可重复执行上一条命令;按上下方向键可以浏览和选择以前输入过的命令

    (3) 神奇的Tab键,进行命令补全;ESC清除当前命令输入框中的文本

    (4) 使用;作为分隔符,可以在同一行输入多条命令

    (5) 上图红色框中的“0:000”。【0为当前调试会话的进程号;000为调试会话的线程号

    (6) 当命令提示符显示*BUSY*时,即使命令输入框可以输入命令,但输入的命令不会立即被执行,要等windbg空闲时才能执行。

         可使用Ctrl + Break来终止一个长时间未完成的命令

    #进程与线程

    | // 列出调试进程

    |* // 列出调试进程

    |N // 参看序数为N的调试进程

    |Ns // 切换序数为N的进程为当前调试进程

    ~ // 列出线程

    ~* // 所有线程

    ~* k // 所有线程堆栈信息

    ~* r // 所有线程寄存器信息

    ~. // 查看当前线程

    ~# // 查看导致当前事件或异常的线程

    ~N // 查看序数为N的线程

    ~~[n] // 查看线程ID为n的线程

    ~Ns // 切换序数为N的线程为当前调试线程

    ~N f // 冻结序数为N的线程

    ~N u // 解冻序数为N的线程

    ~N n // Suspend序数为N的线程

    ~N m // Resume序数为N的线程

    #调用堆栈

    k // 显示当前调用堆栈

    kn // 带栈编号显示当前调用堆栈

    kb // 打印出前3个函数参数的当前调用堆栈

    kb 5 // 只显示最上的5层调用堆栈

    .frame // 显示当前栈帧

    .frame n // 设置编号n的栈帧为当前栈帧

    .frame /r n // 设置编号n的栈帧为当前栈帧 并显示寄存器变量

    !uniqstack // 显示所有线程的调用堆栈

    #启动调试

    windbg "notepad.exe" arguments // 使用windbg启动调试notepad.exe

    windbg -p 4200 // 将windbg附加到一个正在运行的pid为4200的进程上

    windbg -pn "notepad.exe" // 将windbg附加到一个正在运行的名为notepad.exe的进程上

    windbg –z "c:mydumpfile.dmp" // 调试mydumpfile.dmp文件

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

    .detach // 分离调试

    .restart // 重启并调试

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

    q // 退出windbg

    #获取帮助

    ? // 打印出所有标准命令

    .help // 打印出所有元命令

    .hh // 打开windbg的chm帮助文件

    command /? // 打印命令command具体参数用法

    #注释符

    * // 注释整行

    $$ // 注释(遇到分号结束)

    #配置调试环境

    .sympath // 查看当前符号查找路径

    .sympath c:symbols // 将符号查找路径设为:c:symbols

    .sympath+ c:symbols // 将c:symbols添加到符号查找路径集合中

    .symfix // 将符号查找路径设为:SRV*WinDbg安装目录Sym*http://msdl.microsoft.com/download/symbols

    .symfix f:symbols // 将符号查找路径设为:SRV*f:symbols*http://msdl.microsoft.com/download/symbols

    .symfix+ f:symbols // 将SRV*f:symbols*http://msdl.microsoft.com/download/symbols添加到符号查找路径集合中

    .srcpath // 查看当前源文件查找路径

    .srcpath f:src // 将源文件查找路径设为:f:src

    .srcpath+ f:src // 将f:src添加到源文件查找路径集合中

    .exepath // 查看可执行文件查找路径

    .exepath f:in // 将可执行文件查找路径设为:f:in

    .exepath+ f:in // 将f:in添加到可执行文件查找路径集合中

    #符号加载与查看

    除了使用ld和.reload命令直接加载符号文件,某些使用符号的命令也可以触发调试器来加载符号,如:栈回溯命令(k*)和反汇编命令(u)等。

    值得说明的是,windbg缺省使用的是懒惰式符号加载策略,当它收到模块加载事件时,它通常是不会加载符号的,符号状态显示为deferred(延迟加载)。

    .symopt // 显示当前所有符号选项

    .symopt+ flags // 添加符号选项

    .symopt- flags // 删除符号选项

    ld * // 为所有模块加载符号

    ld kernel32 // 加载kernel32.dll的符号

    .reload // 为所有模块加载符号信息

    .reload /f /v // f:强制立即模式  v:详细模式

    .reload /f @"c:windowsSystem32verifier.dll" // 为指定模块加载符号信息

    x *! // 列出所有模块对应的符号信息

    lm // 列出所有模块对应的符号信息

    x ConsoleTest!* // 列出ConsoleTest模块中的所有符号

    x ConsoleTest!add* // 列出ConsoleTest模块中的所有add开头的符号

    x /t /v ConsoleTest!* // 带数据类型、符号类型和大小信息,列出ConsoleTest模块中的所有符号

    x kernel32!*LoadLib* // 列出kernel32模块中所有含LoadLib字样的符号

    u  // 反编译

    #断点

    bl // 列出所有断点

    bc * // 清除所有断点

    bc 1 // 清除1号断点

    bc 1 2 5 // 清除1号、2号、5号断点

    be *  // 启用所有断点

    be 1 // 启用1号断点

    be 1 2 5 // 启用1号、2号、5号断点

    bd * // 禁用所有断点

    bd 1 // 禁用1号断点

    bd 1 2 5 // 禁用1号、2号、5号断点

    bp 7c801b00 // 在7c801b00地址处放置一个断点

    bp `ConsoleTest.cpp:36` // 在ConsoleTest.cpp的36行处放置一个断点

    bp main // 在main函数的起始处放置一个断点

    bp CSecondLoader::CSecondLoader // 在CSecondLoader的构造函数处放置一个断点

    bp `ConsoleTest.cpp:40` "j (poi(MyVar)>5) ''; 'g'" // 条件断点 MyVar>5,执行空语句(;),断住  否则继续执行

    bp `ConsoleTest.cpp:40` "j @eax = 0xa3 ''; 'g'" // 条件断点 寄存器eax的值为0xa3时断住

    bu // 保存断点,其用法和bp一样

    bm add_* // 匹配add_开头的函数,并在这些函数起始处都打上断点

    ba w4 0483dfe0 // 当对0483dfe0地址写操作时停下

    // ba [r|w|e] [Size] Addr      [r=read/write, w=write, e=execute], Size=[1|2|4 bytes]

    #调试执行控制

    g // Go(F5)

    gH // 执行gH命令强制让调试器返回已经处理了这个异常。【Go with Exception Handled】

    // 系统收到这个回复后会停止分发异常(因为调试器声称已经处理了异常),恢复调试目标继续执行,

         //  但由于异常条件仍在,所以还会产生异常,于是再次分发,WinDBG再次中断到命令模式。

    gN // 【Go with Exception Not Handled】

         // 执行gN命令强制让调试器返回没有处理了这个异常,那么系统会进一步分发该异常,

    // 如果没有其他调试器也不处理,最后系统会弹出程序终止对话框。

    gu // 执行到当前函数完成时停下 【Go Up】

    p   // 单步执行(F10)  【Step】

    p 2 // 2为步进数目

    pc // 执行到下一个函数调用处停下 【Step to  Next Call】

    pa 7c801b0b // 执行到7c801b0b地址处停下  【Step to Adress】

    t // Step into(F11) 【Trace】

    tc // 执行到下一个进入点处停下 【Trace to Next Call】

    ta 7c801b12 // 执行到7c801b12地址处停下 【Trace to Adress】

    # 查看变量

    dt nRet // 查看变量nRet的类型与值

    dv // 显示当前函数内所有局部变量,函数参数

    dv n* // 显示当前函数内n开头的所有局部变量,函数参数

    dv /t /i /V /a|/n|/z

    /*****************************************

    更加详细地显示当前函数内所有局部变量,函数参数信息
    i = type (local, global, parameter)
    t = data type
    V = memory address or register location
    -----------------------
    a = sort by Addr, n = sort by name, z = sort by size

    *****************************************/

    #寄存器

    r // 显示所有寄存器信息

    r eax, edx // 显示eax,edx寄存器信息

    r eax=5, edx=6 // 对寄存器eax赋值为5,edx赋值为6

    #内存

    da /c 5 7c801e02 // 从7c801e02内存处开始,显示5个ascii字符

    /*****************************************

    d[a| u| b| w| W| d| c| q| f| D] [/c 列数] [地址]

    a = ascii chars
    u = Unicode chars
    b = byte + ascii
    w = word (2b)
    W = word (2b) + ascii
    d = dword (4b)
    c = dword (4b) + ascii
    q = qword (8b)
    f = floating point (single precision - 4b)
    D = floating point (double precision - 8b)

    *****************************************/

    dyb /c 3 7c801e02 // 从7c801e02内存处开始,显示3个byte及二进制

    /*****************************************

    dy[b | d] ..   // b = binary+byte     d = binary+dword

    *****************************************/

    #dump输出

    .dump /ma "d:mydmpfile.dmp" // 将当前调试进程输出Dump文件

    #其他元命令

    .tlist  // 显示所有进程

    .cls // 清除屏幕

    #其他扩展命令

    !analyze -v // 详细显示当前异常信息

    !peb // 格式化输出PEB信息(process's environment block)

    !gle  // 打印当前线程最近的错误信息

    !gle -all  // 打印所有线程的最近的错误信息

    !error  897// 显示错误码为897的详细描述信息

    #帮助

    中文在线帮助:http://www.dbgtech.net/windbghelp/index.html

    windbg cmd: http://www.slideshare.net/kewuc/windbg-cmds

    整理自http://www.cnblogs.com/Clingingboy/archive/2013/03/26/2983166.html

  • 相关阅读:
    SQLServer 错误: 15404,维护计划无法执行
    Axis2 服务器端抛出ServiceClass object does not implement问题解决方法
    领域驱动设计 软件核心复杂性应对之道 读书笔记
    华为实施微服务架构的五大军规
    DDD领域驱动设计基本理论知识总结
    TransactionScope使用说明
    错误:该行已经属于另一个表
    SQL基础之 时间戳
    采用左右值编码来存储无限分级树形结构的数据库表设计
    违反并发性: UpdateCommand影响了预期 1 条记录中的 0 条 解决办法
  • 原文地址:https://www.cnblogs.com/wang-xiaohui/p/5521425.html
Copyright © 2020-2023  润新知