【调试技术】windbg 随手记
相关工具整理:
- API Monitor
- PCHunter工具
- windbg 脚本
分析32位
1 |
|
设置PDB文件路径
1 |
|
生成dump
1 |
|
调试技巧
- 直接按回车可以执行上一条命令
- 使用分分号作为分隔符,可以在同一行输入多条命令
- 按上下方向键可以浏览和选择以前输入过的命令
- 当命令提示符显示为BUSY时,即使命令编辑框可以输入命令,但是这个命令也不会被马上执行,要等WinDBG恢复到空闲状态才能执行
- 使用Ctrl+Break 来终止一个长时间未完成的命令。如果使用KD或则CDB,那么用Ctrl+C
- 选择菜单->Edit_>Write Window Text to File可以把之前敲过的所有命令记录到文件
伪寄存器
WinDBG自动定义了很多伪寄存器。在命令行和命令文件中都可以使用伪寄存器。WinDBG会自动将其替换(展开)为合适的值。例如下面这个@$scopeip就是一个伪寄存器,它代表当前的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中,可以使用以下命令来切换线程:
~
命令:用于切换当前活动线程。例如,~0s
将切换到线程ID为0的线程。~*
命令:用于切换到所有线程中的下一个线程。~[]
命令:用于切换到特定索引的线程。例如,~[3]s
将切换到索引为3的线程。
请注意,使用这些命令时,要确保已经在调试会话中加载了适当的符号和源代码,并且已经打开了需要调试的进程和线程。
切换进程
在WinDbg中,可以使用以下命令来切换进程:
|
命令:用于切换当前活动进程。例如,|1s
将切换到进程ID为1的进程。~*
命令:用于切换到所有进程中的下一个进程。~[]
命令:用于切换到特定索引的进程。例如,~[3]s
将切换到索引为3的进程。
请注意,使用这些命令时,要确保已经在调试会话中加载了适当的符号和源代码,并且已经打开了需要调试的进程和线程。
!process 命令
在Windows Debugger(WinDbg)中,!process
命令用于显示有关特定进程或所有进程的信息,包括EPROCESS块。
该命令的语法随Windows版本的不同而有所不同。
在Windows NT 4.0中,它的语法如下:
1 |
|
在Windows 2000中,它的语法如下:
1 |
|
在Windows XP及更高版本中,它的语法如下:
1 |
|
以上命令中的参数含义如下:
/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目标机使用。