cc682/NetRoc
http://netroc682.spaces.live.com/
.dbgdbg (Debug Current Debugger)
.dbgdbg 命令启动一个CDB的新实例,这个新的调试器会将当前调试器作为目标。
语法
.dbgdbg
环境
模式
|
用户模式、内核模式
|
目标
|
活动目标、崩溃转储
|
平台
|
所有
|
注释
.dbgdbg 命令和CTRL+P (Debug Current Debugger) 控制键类似。但是,.dbgdbg 更通用,因为它可以像KD和CDB中一样在WinDbg中使用,并且可以用来调试远程电脑上的调试服务器。
.detach (Detach from Process)
.detach 命令结束调试会话,但是让任何用户模式目标程序继续运行。
语法
.detach
环境
对于用户模式活动调试,该命令仅在Windows XP和之后的系统支持。
模式
|
用户模式、内核模式
|
目标
|
活动目标、崩溃转储
|
平台
|
所有
|
注释
该命令可以在下面这些情况下结束调试会话:
- 调试用户模式或内核模式dump文件时
- (Windows XP和之后的系统) 调试用户模式活动目标时。
- 对用户模式目标进行非侵入式调试。
如果只是调试单个目标,调试器在取消附加之后会返回到静止模式。
如果正在调试多个目标,剩下的目标会继续调试会话。
附加信息
关于退出调试器和停止对目标附加的其他方法,查看结束调试会话。
.dump (Create Dump File)
.dump 命令创建一个用户模式或内核模式崩溃转储文件。
语法
.dump Options FileName
.dump /?
参数
Options
指定下面这些选项的一个或多个。
/o
覆盖具有相同名字的dump文件。如果没有使用该选项又存在一个相同名字的文件,则dump文件不会被写入。
/f
(内核模式:) 创建一个完整内存dump。
(用户模式:) 创建一个完整用户模式dump。不管怎么称呼,最大的minidump文件实际比完整用户模式dump文件包含更多信息。例如, .dump /mf 或.dump /ma 会创建比.dump /f创建更大更完整的文件。在用户模式下,.dump /m[MiniOptions] 总是比.dump /f更可取。
/m[MiniOptions]
创建一个小内存dump(内核模式)或者 minidump (用户模式)。如果没有指定 /f 和/m ,/m 是默认选项。
用户模式下,/m 后面可以跟附加的MiniOptions 用来指定dump文件中包含的数据。如果没有使用MiniOptions ,dump文件包含模块、线程和调用堆栈信息,但是没有其他附加信息。可以使用下面的任意MiniOptions 来改变dump文件的内容,它们区分大小写。
MiniOption
|
作用
|
a
|
创建一个包含所有附加选项的minidump。/ma选项相当于/mfFhut —它会在minidump中添加完整的内存数据、句柄数据、已卸载模块信息、基本内存信息和线程时间信息。
|
f
|
在minidump中包含完整内存数据。目标程序拥有的所有 可访问的已交付的页面(committed pages)都会包含进去。
|
F
|
在minidump中添加所有基本内存信息。这会将一个流加入到包含完整基本内存信息的minidump中,而不单是可使用的内存。这样可以使得调试器能够重建minidump生成时进程的完整虚拟内存布局。
|
h
|
在minidump中包含和目标进程相关的句柄信息。
|
u
|
在minidump中包含已卸载模块信息。仅在Windows Server 2003和之后版本的Windows中可用。
|
t
|
在minidump中包含附加的线程信息。包括可以在调试minidump时使用!runaway扩展命令或.ttime (Display Thread Times)命令进行显示的线程时间。
|
i
|
在minidump中包含次级内存(secondary memory)。次级内存是由堆栈中的指针或备份存储(backing store)中引用到的任何内存,加上该地址周围的一小段区域。
|
p
|
在minidump中包含进程环境块(PEB)和线程环境块(TEB)。这在想访问程序的进程和线程相关的Windows系统信息时很有用。
|
w
|
将所有已交付的可读写的私有页面包含进minidump。
|
d
|
在minidump中包含可执行映像中所有可读写的数据段。
|
c
|
加入映像中的代码段。
|
r
|
从minidump中去掉对重建调用堆栈无用的堆栈和存储内存部分。局部变量和其他数据类型值也被删除。这个选项不会使得minidump变小(因为这些内存节仅仅是变成0),但是当想保护其他程序中的机密信息时有用。
|
R
|
在minidump中去掉完整的模块路径。仅包含模块名。如果想保护用户的目录结构时该选项有用。
|
这些MiniOptions 只能在创建用户模式minidump时使用。它们需要跟在 /m 修饰符后面。
/u
在dump文件名中添加日期、时间和PID。这可以确保dump文件名的唯一性。
/a
为所有当前正在调试的进程创建dump。如果使用了/a,也必须使用/u 选项来保证每个文件有唯一的名字。
/b[a]
创建一个.cab 文件。如果包含该选项, FileName 会被当作CAB文件名,而不是dump文件名。会先创建一个临时的dump文件,然后将该文件打包为CAB,然后删除它。如果b后面跟了a,所有的符号和映像文件也会打包到CAB中。
/c "Comment"
指定要写入dump文件的注释字符串。如果Comment 中包含空格,则必须用双引号将它括起来。当dump文件加载时会显示这个Comment 字符串。
/xc Address
(仅用户模式minidump) 在dump文件中加入上下文记录。Address必须指定上下文记录的地址。
/xr Address
(仅用户模式minidump) 在dump文件中加入一个异常记录。Address 必须指定该异常记录开始的地址。
/xp Address
(仅用户模式minidumps) 在dump文件中加入一个上下文记录和异常记录。Address 必须指定一个包含上下文记录和异常记录指针的 EXCEPTION_POINTERS 结构的地址。
/xt ThreadID
(仅用户模式minidumps) 指定将会作为dump文件的异常线程的系统线程的ID。
/kpmf File
(仅创建内核模式完整内存dump) 指定一个包含物理内存页面数据的文件。
FileName
指定dump文件名。可以设置完整路径和文件名,或者只设置文件名。如果文件名中包含空格,则需要用引号将FileName 括起来。如果没有指定路径,会使用当前目录。
-?
显示该命令的帮助。在用户模式和内核模式下显示的文本是不同的。
环境
模式
|
用户模式、内核模式
|
目标
|
活动目标、崩溃转储
|
平台
|
所有
|
注释
该命令可以在各种情况下使用:
- 进行用户模式活动调试时,该命令创建目标程序的dump文件,但是目标程序不会被结束。
- 内核模式活动调试时,该命令创建目标机的dump文件,但是目标机不会崩溃。
-
调试dump文件时,该命令从旧文件创建出一个新的dump文件。这在有一个大的dump文件但是又想创建一个更小的文件时有用。
可以控制dump文件的类型:
- 内核模式下,使用/f选项来生成完整内存转储。使用/m选项(或不带选项)来生成小内存转储。.dump命令不能创建内核内存转储。
-
用户模式下,使用.dump /m[MiniOptions] 是最好的选择。虽然"m" 代表着"minidump",但是使用MiniOption创建的dump文件可以很小也可以很大。通过指定合适的MiniOptions ,可以精确的控制包含的信息。例如,.dump /ma 产生包含大量信息的dumo文件。.dump /f命令产生大小适中的"标准dump"文件,并且不能进行自定义。
不能指定要转储的进程。所有运行中的进程都会转储下来。
/xc、 /xr、 /xp和 /xt 选项用来在dump文件中保存异常和上下文信息。这使得该dump文件可以使用 .ecxr (Display Exception Context Record)。
下面的示例创建一个包含完整内存和句柄信息的用户模式minidump:
0:000> .dump /mfh myfile.dmp
句柄信息可以通过!handle 扩展命令来读取。
附加信息
内核模式dump文件和对它们使用的说明,查看内核模式dump文件。用户模式dump文件和它们的使用的说明,查看 用户模式dump文件。
.dumpcab (Create Dump File CAB)
.dumpcab 命令创建一个包含当前dump文件的CAB文件。
语法
.dumpcab [-a] CabName
参数
-a
使得当前加载的符号也包含在CAB文件中。对于minidump,所有以加载的映像也会包含进去。使用lml来查看加载了哪些符号和映像。
CabName
包含扩展名的CAB文件名。CabName 可以包含绝对或者相对路径;相对路径是相对于调试器启动的目录的。建议使用.cab扩展名。
环境
模式
|
用户模式、内核模式
|
目标
|
活动目标、崩溃转储
|
平台
|
所有
|
注释
该命令只有在调试dump文件时可以使用。(这句话似乎和前面的表格有冲突。—译者注)
如果在调试活动目标时想创建CAB中的dump文件,需要使用.dump (Create Dump File) 命令。然后,打开一个使用该dump文件作为目标的新的调试会话,然后再使用.dumpcab。
.dumpcab 不能将多个dump文件放入一个CAB文件中。
附加信息
关于崩溃转储的详细信息,查看崩溃转储文件。
.dvalloc (Allocate Memory)
.dvalloc 命令使得Windows在目标进程中分配附加的内存。
语法
.dvalloc [Options] Size
参数
Options
可以是任意多个下面的选项:
/b BaseAddress
指定内存分配开始的虚拟地址。
/r
在虚拟地址空间中保留该内存,但是并不实际分配物理内存。如果使用该选项,调试器会调用VirtualAllocEx 并将 flAllocationType 参数设置为MEM_RESERVE。如果没有使用该选项,则使用的值为MEM_COMMIT | MEM_RESERVE。查看Microsoft Windows SDK获取详细信息。
Size
指定要分配的内存的字节数大小。程序可用的内存等于Size,但是实际分配的内存可能会大一些,因为它总是页面大小的整数倍。
环境
注释
.dvalloc 命令调用VirtualAllocEx 来在目标进程中分配新内存。被分配的内存允许读、写和执行。
要释放该内存,使用.dvfree (Free Memory)。
.dvfree (Free Memory)
.dvfree命令释放目标进程拥有的已分配内存。
语法
.dvfree [/d] BaseAddress Size
参数
/d
回收分配的内存,但是并不实际释放包含内存的页面。如果使用该选项,调试器调用VirtualFreeEx 并将dwFreeType 参数设置为MEM_DECOMMIT。如果不使用该选项,则使用MEM_RELEASE。查看Microsoft Windows SDK 获取详细信息。
BaseAddress
指定已分配内存虚拟地址的开始位置。
Size
指定要释放的内存的字节数。实际释放的内存总是整数个页面。
环境
注释
.dvfree 命令调用VirtualFreeEx 来释放已分配的内存。如果没有使用/d 选项,则包含该内存的页面会被释放。
该命令可以用来释放.dvalloc (Allocate Memory)分配的内存。也可以用来释放目标进程拥有的任意内存块,但是释放非.dvalloc分配的内存很自然的会影响到目标进程的稳定性。
.echo (Echo Comment)
.echo命令显示注释字符串。
语法
.echo String
.echo "String"
参数
String
指定要显示的文本。也可以将String 用引号(")括起来。不管是否使用引号,String 都可以包含任意数量的空格、逗号和单引号 (')。如果将String 用引号括起来,还可以包含分号,但是不能包含其它引号。如果不用引号将String 括起来,它可以在除了第一个字符的任意位置包含银号,但是不能包含分号。
环境
模式
|
用户模式、内核模式
|
目标
|
活动目标、崩溃转储
|
平台
|
所有
|
注释
.echo 命令使得调试器在输入它之后立即显示String。
.echo 命令当调试器遇到分号是终止(除非该分号被包含在引起来的字符串中)。这种 限制使得.echo可以用在如下面的例子显示的条件断点这样的复杂语句中。
0:000> bp `:143` "j (poi(MyVar)>5) '.echo MyVar Too Big'; '.echo MyVar Acceptable; gc' "
.echo 命令也为调试服务器和调试客户端的用户提供了简易的交流方法。关于这种情形下的更多信息,查看控制远程调试会话。
.echo 命令和$$ (Comment Specifier)关键字以及 * (Comment Line Specifier)关键字不同,因为这些关键字会使得调试器忽略输入的文本而不会显示出来。
.echocpunum (Show CPU Number)
.echocpunum 命令在调试多处理器的目标机是用来打开或关闭对处理器号的显示。
语法
.echocpunum 0
.echocpunum 1
.echocpunum
参数
0
打开对处理器号的显示。
1
关闭对处理器号的显示。
环境
注释
如果不带任何参数使用.echocpunum ,会打开或关闭对处理器号的显示,并且显示新的状态。
默认情况下,这种显示是关闭的。
附加信息
关于如何调试多处理器计算机的更多信息,查看多处理器语法。
.echotime (Show Current Time)
.echotime 命令显示当前时间
语法
.echotime
环境
模式
|
用户模式、内核模式
|
目标
|
活动目标、崩溃转储
|
平台
|
所有
|
注释
.echotime 命令显示调试器运行的计算机上的时间。
.echotimestamps (Show Time Stamps)
.echotimestamps 命令打开或关闭对时间戳信息的显示。
语法
.echotimestamps 0
.echotimestamps 1
.echotimestamps
参数
0
关闭时间戳信息的显示。这是调试器的默认行为。
1
打开时间戳信息的显示。
环境
模式
|
用户模式、内核模式
|
目标
|
活动目标、崩溃转储
|
平台
|
所有
|
注释
不带参数使用 .echotimestamps 命令时,打开或关闭时间戳显示,并且显示新的状态。
如果打开显示,调试器会在模块加载、线程创建和其他时间时显示时间戳。
DbgPrint、KdPrint、DbgPrintEx和 KdPrintEx 内核函数向主控机的缓冲区发送格式化后的字符串。该字符串会在调试器命令窗口中显示(除非禁止了这种显示)。也可以使用!dbgprint 扩展命令来显示格式化字符串。
使用 .echotimestamps来打开时间戳显示时,DbgPrint缓冲区中每条信息的时间和日期都会被显示出来。
附加信息
关于DbgPrint、KdPrint、DbgPrintEx和KdPrintEx的更多信息,查看 DbgPrint缓冲区或者 Microsoft Windows Driver Kit (WDK) 文档。
.ecxr (Display Exception Context Record)
.ecxr 命令显示当前异常关联的上下文记录。
语法
.ecxr
环境
模式
|
仅用户模式
|
目标
|
仅崩溃转储(仅minidump)
|
平台
|
所有
|
注释
.ecxr 命令定位当前异常的上下文信息,并显示指定记录中的重要寄存器。
该命令也会指示调试器将当前异常关联的上下文记录作为寄存器上下文。运行.ecxr后,调试器就可以访问该线程的重要寄存器和调用堆栈了。该寄存器上下文一直持续到恢复目标执行、改变当前进程或线程或者使用其他寄存器上下文命令(.cxr 或 .ecxr)时。关于寄存器上下文的更多信息,查看寄存器上下文。
附加信息
关于寄存器上下文和其他上下文设置的更多信息,查看改变上下文。