zoukankan      html  css  js  c++  java
  • 我常用的Windbg命令

    用Windbg也有些时间了, 很喜欢这个强大的调试器, 不仅调试驱动爽, 调试应用程序也很爽. 命令有点多, 但经常用到的也是少数, 将自己经常用到的留存在这里, 以后用的时候, 难得去翻.

    1 下断点: bp, bm, ba, bl, bd, be

    bp 普通下断点, 可以下在符号上, 也可下在地址上

    bm 可以一次下很多断点, 支持通配符匹配, 例如, bm ga*, 能够下在所有ga开头的函数上.

    ba 下在内存上, 当需要检视某块内存的读写或者执行时, 用这个命令. 格式一般如下: ba r4 8504160c, 从8504160c的内存, 当有读时, break

    bl和bd, be就不用说了

    br 从新分配断点id br 13 8

    // 下条件断点. article_name: Setting a Conditional Breakpoint

    bp `sufilter.c:143` ".if (poi(MyVar)>5) {.echo MyVar Too Big} .else {.echo MyVar Acceptable; gc} "

    2 ln

    查看某个地址附近的情况, 例如, 需要了解某段地址附近有哪些代码, 可用这个命令.

    3 x

    查看module在内存中的地址.

    x *! 查看所有模块在内存中的地址范围

    x sufilter! 查看sufilter所有的代码符号(全局变量, 函数)的加载地址

    x sufilter!sufilterreadwritemt

    4 !analyze -v

    分析dump信息, 包括被断下来的蓝屏

    5 .crash

    强制目标机器crash, 这对有时候需要带走dump信息应该好使

    要dump目标机器的信息, 使用.dump命令. .dump c:\xxxxx.dmp

    分析, kd(windbg) -z xxxxx.dmp. .dump /f dump full信息. 默认dump为minidump

    6 .reboot

    强制目标机器重新启动.

    7 设置Windbg启动参数, 通常将其设置在快捷方式里

    "C:\Program Files\Debugging Tools for Windows (x86)\windbg.exe" -b -v -i D:\PROJECTS\Founder\fastrest\FastDisk\objchk_w2k_x86\i386 -y D:\PROJECTS\Founder\fastrest\FastDisk\objchk_w2k_x86\i386 -srcpath D:\PROJECTS\Founder\fastrest\FastDisk -k

    -b - 参数, 1 debugger启动后, 立即断下目标机器. 2 机器重新启动后, 内核一旦初始化, 就立即被断下来.

    -k - 参数, 用来指示连接参数. 参见windbg帮助.windbg ... -k com:port=ComPort,baud=BaudRate

    -v - Enables verbose output from debugger.

    -i - 指示ImagePath

    -y - 指示symbolpath

    -z - DumpFile. 分析dump文件时用.

    -srcpath - 指示源文件path

    8 查看堆栈 - k, 一般用kb, 其他参数参见帮组

    childebp, retadd, argument func_addr

    childebp - 该函数的堆栈, ebp起始地址, 局部变量, 参数, 都是通过ebp来访问的. 所以, 了解ebp的地址是非常重要的

    retadd - 返回地址, 可以通过返回地址ln retadd, 知道是那个函数call进来的.

    argument - 不用说了. 进参是ebp+8开始的

    dd ebp时, 看到的第一个dword是保存的父调用函数的ebp, 第二个dword是返回地址, 然后就是参数了.

    dd ebp-x, 是本函数堆栈, 编译时, 如果有cod生成, 可以看到local variable在堆栈中的位置, ebp-4, ebp-8, ebp-c等等.

    kv 显示Displays frame pointer omission (FPO) information. 这个Frame pointer, 我暂时的理解为堆栈或者Trap的框架指针.

    当要用.trap命令查看trap frame时,先运行kv命令. 会看到诸如:a815e874 8052c409 badb0d00 e3051000 00000000 nt!KiTrap0E+0x238 (FPO: [0,0] TrapFrame @ a815e874)的样式. 然后, 运行.trap a815e874. 查看trap frame

    9 r 显示寄存器

    r eip=a9876045 修改寄存器的值.

    10 !chkimg

    查看在debug过程中, 手动修改过哪些地方.

    !chkimg -v -f 查看module是否在调试过程中被修改过. -v - 详细信息 -f - 修复.

    11 lm

    显示加载的module

    lmvm module 就是lm带v和m选项. 列出module的详情. m用来指定通配符. 如lmvm s*

    12 t

    t有很多子命令, 运行到分支tb, 运行到下一个call, tc, 运行到下一个return, tt等等

    13 u

    u也有很多子命令. 其中, ur(realmode bios)和ux(x86 bios)反汇编bios相关的代码.

    14 dt

    查看类型, dt -b 显示全部类型,包括子类型.

    显示数组.dt -a array

    显示子域. 如struct _st {int v1; int v2[10];} 要显示b的内容. dt (_st)st_var -a v2

    15 刚开始使用时, 经常让我莫名奇妙的问题:

    关于源代码下不了断点, 有可能有如下原因:

    源代码不是最新的, 源代码的版本与符号文件的版本不一致.

    注意, 经常用.reload来重新加载Symbol文件. 这是用windbg很容易犯的一个错误, 莫名奇妙的不知道怎么搞的, 就发现不对劲了.

    源代码的某段被宏注释后, 可能下不了断点.

    16 值得看的帮助主题

    //////////

    Debugging a Stack Overflow

    // 下条件断点

    Setting a Conditional Breakpoint

    // 实时下载更新Symbols

    Microsoft Public Symbols

  • 相关阅读:
    LeetCode(75) Sort Colors
    大众点评2015 在线笔试(1)
    百度2015 在线笔试题(3)
    百度2015 在线笔试题(2)
    百度2015 在线笔试题(1)
    其他 之网站分享插件
    Flask框架 之request对象
    Flask框架 之路由
    Flask框架 之第一个Flask程序
    微信 之网页授权登录
  • 原文地址:https://www.cnblogs.com/crunchyou/p/2673603.html
Copyright © 2011-2022 走看看