Windbg是Microsoft公司免费调试器调试集合中的GUI的调试器,支持Source和Assembly两种模式的调试。Windbg不仅可以调试应用程序,还可以进行Kernel Debug。结合Microsoft的Symbol Server,可以获取系统符号文件,便于应用程序和内核的调试。Windbg支持的平台包括X86、IA64、AMD64。

加载符号

  1. .sympath // 查看当前符号查找路径
  2. .sympath c:\symbols // 将符号查找路径设为:c:\symbols
  3. .sympath+ c:\symbols // 将c:\symbols添加到符号查找路径集合中
  4. .reload // 为所有已加载模块载入符号信息
  5. .reload /f /v // f:强制立即模式(不允许延迟载入) v:详细模式
  6. .reload /f @"c:\windows\System32\verifier.dll" // 为指定模块加载符号信息

用户进程加载

  1. 1: kd> !process 0 0 x64.exe // 根据进程名得到进程详细信息
  2. 1: kd> !process 0 0 // 列出系统所有进程
  3. 1: kd> !process -1 1 // 查看当前进程信息
  4. 1: kd> !process 0 7 // 查看详细进程信息

系统模块与PE文件检索

  1. 0:000> lm // 列出所有模块对应的符号信息
  2. 0:000> lmv // 列出所有模块对应的符号信息
  3. 0:000> lmt // 列出所有模块的基地址和偏移
  4. 0:000> lmf // 列出所有DLL的具体路径
  5. 0:000> lmvm ntdll // 查看ntdll.dll的详细信息
  6. 0:000> !lmi ntdll // 查看ntdll.dll的详细信息
  7. 0:000> !dlls -a // 列出镜像文件PE结构的文件头
  8. 0:000> !dlls -l // 按照顺序列出所有加载的模块
  9. 0:000> !dlls -c ntCreateFile // 查询指定函数所在的模块
  10. 0:000> !dlls -c ntdll.dll // 列出特定模块头信息
  11. 0:000> !dlls -s -c ntdll.dll // 列出ntdll.dll的节区
  12. 0:000> !dlls -v -c ntdll // 查看ntdll.dll的详细信息
  13. 0:000> ld * // 为所有模块加载符号
  14. 0:000> ld kernel32 // 加载kernel32.dll的符号
  15. 0:000> x*! // 列出加载的所有符号信息
  16. 0:000> x ntdll!* // 列出ntdll.dll中的所有符号
  17. 0:000> x ntdll!nt* // 列出ntdll.dll模块中所有nt开头的符号
  18. 0:000> x /t /v ntdll!* // 带数据类型、符号类型和大小信息列出符号
  19. 0:000> x kernel32!*Load* // 列出kernel32模块中所有含Load字样的符号

进程与线程操作

  1. | // 列出调试进程
  2. !dml_proc // 显示当前进程信息
  3. .tlist -v // 列出所有运行中的进程
  4. ~ // 列出线程
  5. ~. // 查看当前线程
  6. ~* // 所有线程
  7. ~0s // 查看主线程
  8. ~* k // 所有线程堆栈信息
  9. ~* r // 所有线程寄存器信息
  10. ~# // 查看导致当前事件或异常的线程
  11. ~N // 查看序数为N的线程
  12. ~~[n] // 查看线程ID为n的线程 n为16进制
  13. ~Ns // 切换序数为N的线程为当前调试线程
  14. ~~[n]s // 切换线程ID为n的线程为当前调试线程 n为16进制
  15. ~3f 把三号线程冻住
  16. ~2u 把二号线程解冻
  17. ~N n // Suspend序数为N的线程
  18. ~N m // Resume序数为N的线程
  19. !runaway //显示当前进程的所有线程用户态时间信息
  20. !runaway f //显示当前进程的所有线程用户态、内核态、存活时间信息
  21. !locks // 显示死锁
  22. !cs // 列出CriticalSection(临界段)的详细信息
  23. 0:000> .formats 1d78 // 格式化输出PID
  24. !handle // 查看所有句柄的ID

反汇编指令与内存断点

  1. u // 反汇编当前eip寄存器地址的后8条指令
  2. ub // 反汇编当前eip寄存器地址的前8条指令
  3. u main.exe+0x10 L20 // 反汇编main.exe+0x10地址后20条指令
  4. uf lyshark::add // 反汇编lyshark类的add函数
  5. uf /c main // 反汇编main函数
  6. ub 000c135d L20 // 查看地址为000c135d指令前的20条指令内容
  7. r // 显示所有寄存器信息及发生core所在的指令
  8. r eax, edx // 显示eax,edx寄存器信息
  9. r eax=5, edx=6 // 对寄存器eax赋值为5,edx赋值为6
  10. g // Go 让程序跑起来
  11. p // 单步执行(F10)
  12. p 2 // 2为步进数目
  13. pc // 执行到下一个函数调用处停下
  14. pa 0x7c801b0b // 执行到7c801b0b地址处停下
  15. t // 停止执行
  16. !address -summary // 显示进程的内存统计信息
  17. !address -f:stack // 查看栈的内存信息
  18. !address 0x77c000 // 查看该地址处的内存属性
  19. bl // 列出所有断点
  20. bc * // 清除所有断点
  21. be * // 启用所有断点
  22. bd * // 禁用所有断点
  23. bc 1 2 5 // 清除1号、2号、5号断点
  24. be 1 2 5 // 启用1号、2号、5号断点
  25. bd 1 2 5 // 禁用1号、2号、5号断点
  26. bp main // 在main函数开头设置一个断点
  27. bp 0x7c801b00 // 在7c801b00地址处放置一个断点
  28. bp main.exe+0x1032 // 在模块MyDll.dll偏移0x1032处放置一个断点
  29. bp @$exentry // 在进程的入口放置一个断点
  30. bm message_* // 匹配message_开头的函数,并在这些函数起始处都打上断点

堆栈操作

  1. k // 显示当前调用堆栈
  2. kn // 带栈编号显示当前调用堆栈
  3. kb // 打印出前3个函数参数的当前调用堆栈
  4. kb 5 // 只显示最上的5层调用堆栈
  5. kv // 在kb的基础上增加了函数调用约定、FPO等信息
  6. kp // 显示每一层函数调用的完整参数,包括参数类型、名字、取值
  7. kd // 打印堆栈的地址
  8. kD // 从当前esp地址处,向高地址方向搜索符号(注:函数是符号的一种)
  9. dds 02a9ffec // 从02a9ffec地址处,向高地址方向搜索符号(注:函数是符号的一种)
  10. dds // 执行完dds 02a9ffec后,可通过dds命令继续进行搜索
  11. .frame // 显示当前栈帧
  12. .frame n // 显示编号为n的栈帧(n为16进制数)
  13. .frame /r n // 显示编号n的栈帧(n为16进制数) 并显示寄存器变量
  14. .frame /c n // 设置编号n的栈帧为当前栈帧(n为16进制数)
  15. !uniqstack // 显示所有线程的调用堆栈
  16. !findstack kernel32 2 // 显示包含kernel32模块(用星号标出)的所有栈的信息
  17. !heap -s // 显示进程堆的个数
  18. dt _HEAP 00140000 // 选取一个堆的地址,打印该堆的内存结构
  19. !heap -a 00140000 // 选取一个堆的地址,打印该堆的信息,比上面打印内存命令更详细直观

其他命令

  1. dt ntdll!* // 显示ntdll里的所有类型信息
  2. dt -rv _TEB
  3. dt -rv _PEB
  4. dt -v _PEB @$PEB
  5. dt _PEB_LDR_DATA
  6. dt _TEB ny LastErrorValue // 只查看TEB(thread's environment block)结构成员LastErrorValue
  7. dt _eprocess
  8. dt _eprocess 0x510
  9. !dh 773a0000 显示文件PE
  10. *是通配符;显示所有peb打头的结构体名称;
  11. dt ntdll!_peb*
  12. 0:000> dt -rv ntkrnlmp!*Object* 枚举ntkrnlmp中带"Object"的结构体名称;
  13. .attach PID 附加进程
  14. .detach 结束会话
  15. .dump 文件名 转存文件
  16. .opendump 打开文件
  17. dt -v ntdll!* # 列出ntdll中的全部结构体,导出的函数名也会列出
  18. dt ntdll!*file* # 下面命令将列出ntdll导出的文件操作相关的函数名
  19. dt _FILE_INFORMATION_CLASS 查看一个结构定义
  20. dt ntdll!_* 列出ntdll中结构体

参考文献

https://www.cnblogs.com/luluping/p/15488354.html

驱动开发:WinDBG 常用调试命令总结的更多相关文章

  1. VS 2013驱动开发 + Windbg + VM双机调试(亲测+详解)

    ------------VS 2013驱动开发 + Windbg + VM双机调试(亲测+详解)------------- WIN10已上线,随之而来的是VS2015:微软在 "WDK760 ...

  2. 开发中常用linux命令

    1.创建目录mkdir 创建目录命令,常用的参数-p,递归创建目录 [root@web01 ~]# mkdir /data [root@web01 ~]# mkdir /data/a/b mkdir: ...

  3. Android 开发中常用 ADB 命令总结

    adb 的全称为 Android Debug Bridge,就是起到调试桥的作用.通过 adb 我们可以在 Eclipse 中方便通过 DDMS 来调试 Android 程序,说白了就是 debug ...

  4. gdb常用调试命令

    一般来说,GDB主要帮忙你完成下面四个方面的功能: 1.启动你的程序,可以按照你的自定义的要求随心所欲的运行程序.    2.可让被调试的程序在你所指定的调置的断点处停住.(断点可以是条件表达式)   ...

  5. iOS之LLDB常用调试命令

    LLDB是个开源的内置于XCode的调试工具,这里来理一理常用用法.lldb对于命令的简称,是头部匹配方式,只要不混淆,你可以随意简称某个命令.结果为在xcode下验证所得,可能与其它平台有所误差. ...

  6. GDB常用调试命令以及多进程多线程调试

    http://blog.csdn.net/freeelinux/article/details/53700266 一:普通命令   1.list命令 list  linenum      显示程序第l ...

  7. linux开发中常用的命令及技巧(连载)

    1.在内核或uboot目录下搜索相关内容/文件名时:grep "USB" * -nR find -name "*USB*" 2.查看系统中设备 cat  /pr ...

  8. WinDBG常用断点命令

    WinDBG提供了多种设断点的命令: bp 命令是在某个地址 下断点, 可以 bp 0x7783FEB 也可以 bp MyApp!SomeFunction . 对于后者,WinDBG 会自动找到MyA ...

  9. GDB常用调试命令(一)

    GDB是UNIX及UNIX-like下的调试工具,通常gdb使用前置条件:编译时加入debug信息,这里指的是C++. gcc/g++调试选项   gcc/g++是在编译时加入-g,-g分4个等级: ...

  10. gdb常用调试命令以及多线程堆栈的查看

    GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具.或许,各位比较喜欢那种图形界面方式的,像VC.BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC ...

随机推荐

  1. 【Docker】docker介绍 什么是虚拟化 容器与虚拟机比较 Docker 概念 docker安装

    目录 docker介绍 什么是虚拟化 docker是什么 容器与虚拟机比较 Docker 概念 docker安装 docker介绍 什么是虚拟化 在计算机中,虚拟化(英语:Virtualization ...

  2. 在Windows下配置Clang编译器

    Preferences Linux & macOS 平台LLVM 相关工具链下载 2019年,在Windows下配置Clang编译器 Visual Studio 2022 中使用 Clang ...

  3. 【每日一题】26.codeJan与旅行 (贪心)

    补题链接:Here 算法涉及:贪心 思路: 首先,我们处在p位置,显然要么向左走到相邻的城市,要么向右走走到相邻的城市. 有一个不会证明但观察到的结论,从这两个位置走的话,只有四种可能. 可能1:一直 ...

  4. go语言-Go环境搭建

    go语言-Go环境搭建 下载 https://golang.org/dl/ 切换root权限 su root 进入用户列表 cd /usr/local/ 解压缩 tar -zxvf go1.13.li ...

  5. uni-app学习笔记

    uniapp封装请求方法(含请求期间的Loading样式) https://blog.csdn.net/weixin_43242112/article/details/108019404?utm_me ...

  6. CoinBase是什么?

    什么是CoinBase交易? 比特币区块链上的每个区块中都会包含一个或者多个交易(transaction),其中第一个交易就叫做CoinBase交易. 什么是CoinBase交易? CoinBase交 ...

  7. Android Emulator 画面闪烁

    Android 虚拟机经常会出现画面闪烁,可以通过修改设置解决. 打开虚拟机之后,点击 "..." 按钮.按照下图改为 "D3D11",冷重启虚拟机就好了.

  8. The requested URL could not be retrieved

    在开发过程中,调用对外接口,返回了一长串的标签提示,如下 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "ht ...

  9. 【FreeRTOS】堆内存管理

    动态内存分配及其与FreeRTOS的相关性 为了使FreeRTOS更易用,内核对象(如任务.队列.信号量.事件组)不在编译期静态分配,而是在运行时动态分配,FreeRTOS在内核对象创建时分配RAM, ...

  10. Android——“EditText控件供获取最大长度的方法”

    package utils; import android.app.Activity; import android.content.Context; import android.text.Inpu ...