1、有时候想对某个函数下断点,可就是记不清楚的函数具体的名字,好吧,使用x命令来列举所有的符号的。
命令格式为:
x [选项] 模块名字!符号匹配表达式, 如:
x et!* //于是,所以的et模块的函数都出来,哈哈~
2、64位生成器生成32位的程序的dump文件,查看时,可以使用以下命令转到32位模式下调试。
.load wow64exts !sw
3、如果想要了解该模块的详细信息,使用lm命令
lm命令可以用于查看模块的信息,详情可以看帮助文档。其中,
lmvm命令可以查看任意一个指定的已加载的DLL/EXE的详细信息,以及symbol的情况, 特别提醒的是,不要加后缀名(无论EXE/DLL)
lmvm
4、u 地址:用于显示指定地址的汇编代码。最常用法如下:
u eip // 可以找出程序崩溃时执行的指令 及后7条指令
ub 7c80240f // 显示地址7c80240f 指向的指令 及前7条指令
5、du/da address: 以unicode或者ascii characters显示地址address指向的内存
ddaddress // Double-word values (4 bytes)
dppaddress // 显示指针address指向的地址
6、!handle [handle值] [显示的内容]:!handle handle_value f(显示所有句柄信息)
Syntax
// User-Mode
!handle [Handle [UMFlags [TypeName]]]
!handle -?
// Kernel-Mode
!handle [Handle [KMFlags [Process [TypeName]]]]
7、dmp文件关联windbg
windbg.exe -W Default -z "%1" -c ".ecxr;kb" // %1表示dmp文件路径
8、句柄泄露调试
首先用windbg载入目标程序,!htrace -enable开启句柄跟踪开关。
某个时刻创建一次句柄快照:!htrace -snapshot
继续运行后进行一次句柄快照对比:!htrace -diff
如:执行!htrace -diff后,
Handle = 0x000005a0 - OPEN
句柄0x000005a0被打开了,可能是一次句柄泄露但是也不一定,需要继续分析,使用!htrace 0x000005a0命令显示创建该句柄的堆栈:
9、dt 类型 [地址]查看对象信息
dt soui!SOUI::SWindow // 后面不加地址,则只展示对象结构信息
dt soui!SOUI::SWindow 0136fa6c // 后面加对象地址,除了展示结构信息,也会把对象各成员的值解析出来
10、分析dump信息, 包括被断下来的蓝屏
!analyze -v
11、查看堆栈 - k, 一般用kb, 其他参数F1参见帮助文档
kb
12、关联.dmp文件到windbg的脚本。
@echo off
set dbgpath=\"C:\Program Files\Debugging Tools for Windows (x64)\windbg.exe\"
REG ADD "HKCU\Software\Classes\.dmp" /f /d dmpfile
set val=%dbgpath%,0
REG ADD "HKCU\Software\Classes\dmpfile\DefaultIcon" /f /d "%val%"
set val=%dbgpath% -c \".ecxr;kpn L\" -z \"%%1\"
REG ADD "HKCU\Software\Classes\dmpfile\Shell\open\command" /f /d "%val%
set val=%dbgpath% -c \"!wow64exts.sw; !analyze -v\" -z \"%%1\"
REG ADD "HKCU\Software\Classes\dmpfile\Shell\Analyze With Windbg - wow64\command" /f /d "%val%"
set val=%dbgpath% -c \"!analyze -v\" -z \"%%1\"
REG ADD "HKCU\Software\Classes\dmpfile\Shell\Analyze With Windbg\command" /f /d "%val%"
REG DELETE "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.dmp\UserChoice" /f
set /p finish="finsh!"
11、.time获取进程运行时间
.time
Debug session time: Thu Aug 22 10:11:04.000 2013 (UTC + 8:00)
System Uptime: 14 days 17:26:44.613 // 系统运行时间
Process Uptime: 14 days 17:14:25.000 // 当前进程运行时间
Kernel time: 0 days 0:09:02.000
User time: 0 days 0:42:36.000
12、.effmach x86
一般是用 !wow64exts 扩展切换机器类型。 在没有扩展的情况下,用内置命令 .effmach
.effmach (Effective Machine)
The .effmachcommand displays or changes the processor mode that the debugger uses.
Syntax
.effmach [MachineType]
.x86 Use an x86-based processor mode
.amd64 Use an x64-based processor mode
.ia64 Use an Itanium-based processor mode
.ebc Use an EFI byte code processor mode
The processor mode influences many debugger features:
Which processor is used for stack tracing.
Whether the process uses 32-bit or 64-bit pointers.
Which processor's register set is active.
13、一个比较老的模块崩溃,PDB符号文件已经失传,代码是有的,此时强制加载符号文件就有用了,
.reload /i XXXX.exe
14、!sym
The !sym extension controls noisy symbol loading and symbol prompts.
!sym
!sym noisy // 会打印详细的加载符号信息
!sym quiet // 加载符号时,不会打印详细的信息
!sym prompts
!sym prompts off
15、!address
详见:https://www.cnblogs.com/kissdodog/p/3730598.html
16、vertarget 可以用 vertarget 命令来显示操作系统的详细信息
Windows XP Version 2600 (Service Pack 3) MP (2 procs) Free x86 compatible
Product: WinNt, suite: SingleUserTS
kernel32.dll version: 5.1.2600.5512 (xpsp.080413-2111)
Machine Name:
Debug session time: Sat Feb 21 14:01:29.638 2009 (GMT-8)
System Uptime: 0 days 18:40:50.509
Process Uptime: 0 days 0:00:05.546
Kernel time: 0 days 0:00:00.015 User time: 0 days 0:00:00.015
上面的输出告诉我们,该用户使用WinXP SP3, CPU 是 x86 双核。 该机已经持续运行了18个小时40分50秒, 当前调试进程刚刚启动(运行5秒钟)
17、!heap
堆信息查看命令,定位内存问题相当有用
详见:有道-windbg-定位内存占用问题