【调试技术】windbg 随手记

相关工具整理:

  1. API Monitor
  2. PCHunter工具
  3. windbg 脚本

分析32位

1
.load wow64exts

设置PDB文件路径

1
srv*D:\Symbols*https://msdl.microsoft.com/download/symbols

生成dump

1
.dump /ma C:\dumps\myapp.dmp

调试技巧

  • 直接按回车可以执行上一条命令
  • 使用分分号作为分隔符,可以在同一行输入多条命令
  • 按上下方向键可以浏览和选择以前输入过的命令
  • 当命令提示符显示为BUSY时,即使命令编辑框可以输入命令,但是这个命令也不会被马上执行,要等WinDBG恢复到空闲状态才能执行
  • 使用Ctrl+Break 来终止一个长时间未完成的命令。如果使用KD或则CDB,那么用Ctrl+C
  • 选择菜单->Edit_>Write Window Text to File可以把之前敲过的所有命令记录到文件

伪寄存器

WinDBG自动定义了很多伪寄存器。在命令行和命令文件中都可以使用伪寄存器。WinDBG会自动将其替换(展开)为合适的值。例如下面这个@$scopeip就是一个伪寄存器,它代表当前的eip指针。

eip

下表列出了windbg所定义的部分寄存器(字典型知识,需要时查阅即可)

伪寄存器 含义
$ea 调试目标所执行上一条指令的有效地址
$ea2 调试目标所执行上一条指令的第二个有效地址
$exp 表达式评估器所评估的上一条表达式
$ra 当前堆栈的返回地址。
这个在执行命令中特别有用。例如,g @$ra 将一直执行到返回地址处(虽然,对于“步出(stepping out)”当前函数gu (Go Up)是一个更加准备有效的方法)。
$ip 指令指针寄存器: x86 处理器:和 eip 相同 Itanium 处理器:涉及 iip(请看表后的注解) x64处理器:和rip相同
$eip 指令指针寄存器
$eventip 当前调试事件发生时的指令指针
$previp 上一事件的指令指针
$relip 与当前事件关联的指令指针
$scopeip 当前上下文的指令指针
$exentry 当前进程的入口地址
$retreg 首要的函数返回值寄存器
$retreg64 64位格式的首要函数返回寄存器
$csp 栈顶指针ESP
$p 上一个内存显示命令所打印的第一个值
$proc 当前进程EPROCESS结构的指针
$thread 当前线程ETHREAD结构的指针
$peb 当前进程的进程环境块(PEB)的地址
$teb 当前线程的线程环境块(TEB)地址
$tpid 拥有当前线程的进程ID(PID)
$tid 当前线程的线程ID
$bpx X号断点的地址
$frame 当前栈帧的序号
$dbgtime 当前时间
$callret 使用.call命令调用的上一个函数的返回值
$ptrsize 调试目标所在系统的指针类型宽度
$pagesize 调试目标所在的系统的内存页字节数

命令整理

? 0n 命令

Windbg中的 ?0n 是一个命令,用来设置表达式的数制为十进制。具体来说,当你需要查看一个内存地址或者变量以十进制格式时,可以使用 ?0n 命令。

在Windbg中,数制的表示:

  • 0x表示十六进制

  • 0n表示十进制

  • 0t表示八进制

  • 0y表示二进制。

Windbg默认数制为十六进制。

切换线程

在WinDbg中,可以使用以下命令来切换线程:

  1. ~ 命令:用于切换当前活动线程。例如,~0s将切换到线程ID为0的线程。
  2. ~* 命令:用于切换到所有线程中的下一个线程。
  3. ~[] 命令:用于切换到特定索引的线程。例如,~[3]s将切换到索引为3的线程。

请注意,使用这些命令时,要确保已经在调试会话中加载了适当的符号和源代码,并且已经打开了需要调试的进程和线程。

切换进程

在WinDbg中,可以使用以下命令来切换进程:

  1. | 命令:用于切换当前活动进程。例如,|1s将切换到进程ID为1的进程。
  2. ~* 命令:用于切换到所有进程中的下一个进程。
  3. ~[] 命令:用于切换到特定索引的进程。例如,~[3]s将切换到索引为3的进程。

请注意,使用这些命令时,要确保已经在调试会话中加载了适当的符号和源代码,并且已经打开了需要调试的进程和线程。

!process 命令

在Windows Debugger(WinDbg)中,!process命令用于显示有关特定进程或所有进程的信息,包括EPROCESS块。

该命令的语法随Windows版本的不同而有所不同。

在Windows NT 4.0中,它的语法如下:

1
!process[Process[Flags]]

在Windows 2000中,它的语法如下:

1
!process[/sSession] [Process[Flags]]

在Windows XP及更高版本中,它的语法如下:

1
!process[/sSession] [/mModule] [Process[Flags]]

以上命令中的参数含义如下:

  • /sSession(Windows 2000及之后)指定拥有给定进程的会话(session)。
  • /mModule(Windows XP及之后)指定拥有需要的进程的模块。
  • Process 指定目标机上某个进程的16进制地址或者进程ID。
  • Flags 是用于控制命令行为的标志位,例如,/d 用于显示完整的进程环境块,/c 用于显示完整的线程环境块等。

以上信息仅供参考,如需更多信息,建议咨询专业的技术人员。

!IDT

在WinDbg中,!idt命令用于显示中断分配表(Interrupt Dispatch Table,简称IDT)中的中断服务例程(Interrupt Service Routine,简称ISR)。

该命令的语法为:!idt [IDT],其中IDT是可选项,用于指定要显示的特定IDT。

如果未指定IDT,并且在没有指定-a选项的情况下,该命令将简短地显示目标机上所有处理器的IDT。

如果指定了-a选项,该命令将显示所有IDT的ISR。

如果需要获取该命令的帮助文本,可以在调试器命令窗口中使用!idt -?命令。

需要注意的是,该命令只能对x64或者x86目标机使用。


【调试技术】windbg 随手记
https://hodlyounger.github.io/wiki/调试技术/【调试技术】Windbg随手记/
作者
mingming
发布于
2024年8月31日
许可协议