cc682/NetRoc
http://netroc682.spaces.live.com/
.srcfix, .lsrcfix (Use Source Server)
.srcfix 和.lsrcfix 命令自动设置源码路径以指示使用了源码服务器。
语法
.srcfix[+] [Paths]
.lsrcfix[+] [Paths]
参数
+
使得以存在的源码路径被保持,并且将srv*添加到末尾。如果没有使用 +,则当前的源码路径会被替换掉。
Paths
指定要添加到新的源码路径末尾的一个或多个附加的路径。
环境
.srcfix 命令在所有调试器中都可用。.lsrcfix 命令仅在WinDbg中可用,并且不能用于脚本文件。
模式
|
用户模式、内核模式
|
目标
|
活动目标、崩溃转储
|
平台
|
所有
|
注释
该命令在调试客户端中执行时,.srcpath 将调试服务器上的源码路径设置为使用源码服务器,而.lsrcpath 用来设置本地计算机。
下面两个命令是等价的:
.srcfix[+] [Paths]
.srcpath[+] srv* [;Paths]
类似的,下面两条命令也等价:
.lsrcfix[+] [Paths]
.lsrcpath[+] srv* [;Paths]
附加信息
设置远程客户端的本地源码路径的更多信息,查看WinDbg命令行选项。关于SrcSrv的细节,查看使用源码服务器。关于源码路径和本地源码路径的详细信息,查看源码路径。通过调试器进行远程调试时可以使用的命令的信息,查看控制远程调试会话。
.srcnoisy (Noisy Source Loading)
.srcnoisy 命令控制源码文件加载的显示级别。
语法
.srcnoisy {1|0}
.srcnoisy
环境
模式
|
用户模式、内核模式
|
目标
|
活动目标、崩溃转储
|
平台
|
所有
|
注释
.srcnoisy 1 命令使得调试器显示源文件加载和卸载过程的信息。.srcnoisy 0 命令禁止这些信息。
不带参数时,.srcnoisy 显示当前设置的状态。
注意 详细源码加载不要和详细符号加载混淆— 它是由!sym noisy 扩展命令和SYMOPT_DEBUG设置来控制的。
.srcpath, .lsrcpath (Set Source Path)
.srcpath 和.lsrcpath 命令设置或显示源文件搜索路径。
语法
.srcpath[+] [Directory [; ...]]
.lsrcpath[+] [Directory [; ...]]
参数
+
指定要添加(而不是替代)到当前的源文件搜索路径后面的目录。
Directory
指定要放入搜索路径中的一个或多个目录。如果没有指定Directory,则显示当前路径。可以用分号分隔多个目录。
环境
.srcpath 命令可以在所有调试器中使用。.lsrcpath 命令只能在WinDbg中可用,并且不能用于脚本文件。
模式
|
用户模式、内核模式
|
目标
|
活动目标、崩溃转储
|
平台
|
所有
|
注释
当在调试客户端中执行该命令时, .srcpath 设置调试服务器上的源码路径,而.lsrcpath 设置本地机器上的源码路径。
附加信息
改变该路径的详细信息和其他方法,查看源码路径。通过调试器进行远程调试时可以使用的命令,查看控制远程调试会话。
.step_filter (Set Step Filter)
.step_filter 命令创建一个在跟踪时要跳过(步过)的函数列表。这使得可以跟踪代码并且只跳过特定的函数。也可以在源码模式下一行中有多个函数调用时用来对单步进行控制。
语法
.step_filter "FilterList"
.step_filter /c
.step_filter
参数
"FilterList"
指定要步过的函数关联的符号。FilterList 可以包含任意多个用分号分隔的文本模板。每个模板都可以包含各种通配符和修饰符,查看字符串通配符语法获取详细信息。符号匹配其中某个模板的函数将会在跟踪时被步过。每次使用.step_filter "FilterList" 时,先前的过滤列表都会完全被新列表替代。
/c
清除过滤列表。
环境
模式
|
用户模式、内核模式
|
目标
|
活动目标、崩溃转储
|
平台
|
所有
|
注释
不带参数时,.step_filter 显示当前的过滤列表。
一般来说,一个跟踪命令 (例如t 或者WinDbg的 Debug | Step Into 按钮) 将会跟踪进入函数调用中。但是,如果被调用函数关联的符号能够匹配FilterList 中的模板,则该函数会被步过 — 就像使用单步命令一样 (例如 p) 。
如果指令指针在过滤列表中列出的代码里面,任何跟踪或单步命令都会执行到函数返回,就像gu 命令或者WinDbg 的Step Out 按钮一样。当然,过滤器首先就会避免跟踪到这些代码中,所以这种情况只会在改变了过滤器或者遇到断点时发生。
例如,下面的命令使得跟踪命令跳过所有的CRT调用:
.step_filter "msvcrt!*"
.step_filter 命令在源码模式调试时最有用,因为单行源码上可以有多个函数调用。p 和 t 命令没有办法区分这些函数调用。
例如,下面一行中, t 命令将会单步进入GetTickCount 和printf,而p命令会同时步过两个函数调用:
printf( "%x\n", GetTickCount() );
.step_filter 命令允许忽略某个调用但是跟踪到另一个中。
由于函数是由符号来标识的,所以单个过滤器就可以包含整个模块。这使得可以过滤掉所有的框架函数 — 例如,微软基本类库(MFC) 或活动模板库(ATL) 的调用。
在汇编模式下调试时,每个调用都在单独的行上,所以可以选择是单步还是一行一行的跟踪。所以汇编模式下.step_filter不是非常有用。
.suspend_ui (Suspend WinDbg Interface)
.suspend_ui 命令暂停WinDbg调试信息窗口的刷新。
语法
.suspend_ui 0
.suspend_ui 1
.suspend_ui
参数
0
暂停对WinDbg的调试信息窗口的刷新。
1
启用对WinDbg调试信息窗口的刷新。
环境
只能在WinDbg中使用该命令,并且不能用于脚本文件。
模式
|
仅内核模式
|
目标
|
活动目标、崩溃转储
|
平台
|
所有
|
注释
不带参数时,.suspend_ui 显示调试信息窗口的刷新是否被暂停了。
默认情况下,每次显示的信息有变化时调试信息窗口都会刷新。
暂停刷新这些窗口可以使得WinDbg在执行一连串很快速的操作时更快 — 例如,连续很快的跟踪或者单步很多次时。
附加信息
关于调试信息窗口的更多信息,查看使用调试信息窗口。
.symfix (Set Symbol Store Path)
.symfix 命令自动将符号路径设置来指向Microsoft 符号存储。
语法
.symfix[+] [DownstreamStore]
参数
+
使得Microsoft 符号存储的路径被添加到当前符号路径末尾。如果不包含,则当前符号路径会被替换掉。
DownstreamStore
指定要用作下游存储的目录。如果该目录不存在,当符号服务器复制文件时会创建。如果省略DownstreamStore ,则会使用调试器安装目录下的 sym 子目录。
环境
模式
|
用户模式、内核模式
|
目标
|
活动目标、崩溃转储
|
平台
|
所有
|
注释
该命令相当于
.sympath[+] srv*DownstreamStore*http://msdl.microsoft.com/download/symbols
附加信息
详细信息查看使用符号服务器和符号存储。
.symopt (Set Symbol Options)
.symopt 命令设置或显示符号选项。
语法
.symopt+ Flags
.symopt- Flags
.symopt
参数
+
使得Flags 指定的符号选项被设置。如果.symopt和Flags 一起使用,但是不带加减号,则被假定为加号。
-
使得Flags 指定的符号选项被清除。
Flags
指定要改变的符号选项。Flags 必须是符号选项的位标志的和。
环境
模式
|
用户模式、内核模式
|
目标
|
活动目标、崩溃转储
|
平台
|
所有
|
注释
不带任何参数时,.symopt显示当前符号选项。
附加信息
所有符号选项的列表和说明、位标志和其他设置或清除这些选项的方法,查看设置符号选项。
.sympath (Set Symbol Path)
.sympath 命令改变调试器进行符号搜索的默认路径。
语法
.sympath[+] [Path [; ...]]
参数
+
指定要添加(而不是替换)到当前的符号搜索路径末尾的新目录。
Path
主控机上进行新的符号搜索的有效路径。多个符号路径可以用分号分隔。如果省略Path,则显示当前路径。
环境
模式
|
用户模式、内核模式
|
目标
|
活动目标、崩溃转储
|
平台
|
所有
|
注释
符号路径改变时并不会加载新的符号信息。如果延迟符号加载被禁止,可以使用.reload (Reload Module)命令来重加载符号。查看延迟符号加载获取详细信息。
附加信息
详细信息和其他改变该路径的方法,查看符号路径。
.thread (Set Register Context)
.thread 命令指定哪个线程用作寄存器上下文。
语法
.thread [/p [/r] ] [/P] [/w] [Thread]
参数
/p
(仅活动调试) 如果使用了该选项并且Thread 非0, 拥有该线程的进程的所有过渡页表项(transition page table entries)在访问前都会被转换成物理地址。这可能造成运行变慢,因为调试器会查找该进程使用的所有内存的物理地址,并且需要从调试电缆传输大量数据。 (该行为和.cache forcedecodeuser一样。)
如果包含/p 选项并且Thread 为0或省略,则禁止这种转换。 (这种行为和.cache noforcedecodeuser一样)
/r
(仅活动调试) 如果/r 和/p 一起使用,则进程和寄存器上下文设置之后会重新加载拥有该线程的进程的用户模式符号。 (该行为和.reload /user一样)
/P
(仅活动调试) 如果包含该选项并且Thread非0,所有过渡页表项在访问前都会转换成物理地址。和/p 不同,这种PTE的转换会针对所有用户模式和内核模式进程,而不仅仅是拥有该线程的进程。这可能造成运行变慢,因为调试器会查找该进程使用的所有内存的物理地址,并且需要从调试电缆传输大量数据。 (该行为和.cache forcedecodeuser一样。)
/w
(仅64位内核调试) 将线程的活动上下文改变成WOW64 32位上下文。指定的线程必须运行在一个WOW64状态的进程中。
Thread
线程的地址。如果省略或为0,线程上下文被重置为当前线程。
环境
模式
|
仅内核模式
|
目标
|
活动目标、崩溃转储
|
平台
|
所有
|
注释
一般来说,内核调试时只有当前线程关联的寄存器才是可见的。
.thread 命令指示内核调试其使用指定线程作为寄存器上下文。命令执行后,调试器就可以访问该线程的重要寄存器和堆栈回溯了。该寄存器上下文会一直持续到允许目标执行或者使用另一个寄存器上下文命令(.thread、 .cxr或 .trap)为止。查看寄存器上下文获得详细信息。
/w 选项只能在64位内核调试会话中调试WOW64 状态的进程中的线程时可以使用。获得的上下文是WOW64最近一次记录的上下文,这通常是Thread最后执行的用户模式代码。该选项只有当目标在原生机器模式(native machine mode)时才可用。例如,如果目标运行在通过WOW64模拟x86处理器的机器上,该选项就不能使用。使用/w 选项会使得机器模式变成自动切换到x86处理器。。
该命令并不实际改变当前线程。换句话说,如果不带参数时, !thread 和!teb 扩展命令仍然作用于当前线程。
这里有一个示例。使用 !process 扩展命令来找到需要的线程的地址。(这里,!process 0 0用于显示所有进程,第二次的 !process 用于显示需要的进程中所有线程。)
kd> !process 0 0
**** NT ACTIVE PROCESS DUMP ****
PROCESS fe5039e0 SessionId: 0 Cid: 0008 Peb: 00000000 ParentCid: 0000
DirBase: 00030000 ObjectTable: fe529a88 TableSize: 145.
Image: System
.....
PROCESS ffaa5280 SessionId: 0 Cid: 0120 Peb: 7ffdf000 ParentCid: 01e0
DirBase: 03b70000 ObjectTable: ffaa4e48 TableSize: 23.
Image: winmine.exe
kd> !process ffaa5280
PROCESS ffaa5280 SessionId: 0 Cid: 0120 Peb: 7ffdf000 ParentCid: 01e0
DirBase: 03b70000 ObjectTable: ffaa4e48 TableSize: 23.
Image: winmine.exe
VadRoot ffaf6e48 Clone 0 Private 50. Modified 0. Locked 0.
DeviceMap fe502e88
Token e1b55d70
.....
THREAD ffaa43a0 Cid 120.3a4 Teb: 7ffde000 Win32Thread: e1b4fea8 WAIT: (WrUserRequest) UserMode Non-Alertable
ffadc6a0 SynchronizationEvent
Not impersonating
Owning Process ffaa5280
WaitTime (seconds) 24323
Context Switch Count 494 LargeStack
.....
现在使用 .thread 命令和需要的线程的地址。这会设置寄存器上下文并且可以查看该线程的重要寄存器和调用堆栈。
kd> .thread ffaa43a0
Using context of thread ffaa43a0
kd> r
Last set context:
eax=00000000 ebx=00000000 ecx=00000000 edx=00000000 esi=00000000 edi=00000000
eip=80403a0d esp=fd581c2c ebp=fd581c60 iopl=0 nv up di pl nz na pe nc
cs=0000 ss=0000 ds=0000 es=0000 fs=0000 gs=0000 efl=00000000
0000:3a0d ?? ???
kd> k
*** Stack trace for last set context - .thread resets it
ChildEBP RetAddr
fd581c38 8042d61c ntoskrnl!KiSwapThread+0xc5
00001c60 00000000 ntoskrnl!KeWaitForSingleObject+0x1a1
附加信息
关于寄存器上下文和其他上下文设置的更多信息,查看改变上下文。
.time (Display System Time)
.time 命令显示系统时间变量的信息。
语法
.time [-h Hours]
参数
-h Hours
指定和格林威治时间相差的小时。负数的Hours必须用圆括号括起来。
环境
模式
|
用户模式、内核模式
|
目标
|
活动目标、崩溃转储
|
平台
|
所有
|
注释
系统时间变量控制性能计数器的行为。
这是内核模式下的示例:
kd> .time
Debug session time: Wed Jan 31 14:47:08 2001
System Uptime: 0 days 2:53:56
这是用户模式下的示例:
0:000> .time
Debug session time: Mon Apr 07 19:10:50 2003
System Uptime: 4 days 4:53:56.461
Process Uptime: 0 days 0:00:08.750
Kernel time: 0 days 0:00:00.015
User time: 0 days 0:00:00.015
.tlist (List Process IDs)
.tlist 命令列出系统中运行的所有进程。
语法
.tlist [Options] [FileNamePattern]
参数
Options
可以是任意多个下面的选项:
-v
详细输出。包括会话号、进程的用户名和启动进程使用的命令行。
-c
仅显示当前进程。
FileNamePattern
指定要显示的文件名,或者进程的文件名必须匹配的模板。只有文件名匹配该模板的进程才会显示出来。FileNamePattern 可以包含各种通配符和修饰符,查看字符串通配符语法获取详细信息。 这种匹配只针对实际的文件名,而不是路径。
环境
注释
每个进程ID都带有0n 前缀,说明PID是10进制数字。
附加信息
显示进程的其他方法,查看获得进程ID。
.trap (Display Trap Frame)
.trap 命令显示陷阱帧寄存器状态,也会设置寄存器上下文。
语法
.trap [Address]
参数
Address
目标系统上的陷阱帧的16进制地址。省略该地址则不会显示任何陷阱帧信息,但是会重置寄存器上下文。
环境
模式
|
仅内核模式
|
目标
|
活动目标、崩溃转储
|
平台
|
所有
|
注释
.trap 命令显示指定的陷阱帧的重要寄存器。
该命令也指示内核调试器使用指定的上下文纪录作为寄存器上下文。该命令执行后,调试器就可以访问该线程的重要寄存器和堆栈回溯了。该寄存器上下文会一直持续到允许目标执行或者使用另一个寄存器上下文命令(.thread、 .cxr或 .trap)为止。查看寄存器上下文获得详细信息。
该命令常常在调试bug check 0xA 和0x7F时使用。详细信息和示例,查看Bug Check 0xA (IRQL_NOT_LESS_OR_EQUAL)。
附加信息
关于寄存器上下文和其他上下文设置的更多信息,查看改变上下文。
.tss (Display Task State Segment)
.tss 命令显示当前处理器已保存的任务状态段(TSS)的格式化信息。
语法
.tss [Address]
参数
address
TSS地址。
环境
模式
|
仅内核模式
|
目标
|
活动目标、崩溃转储
|
平台
|
仅x86
|
注释
通过查看!pcr 扩展命令的输出可以找到TSS的地址。
.ttime (Display Thread Times)
.ttime 命令显示某个线程的运行时间。
语法
.ttime
环境
模式
|
仅用户模式
|
目标
|
活动目标、崩溃转储
|
平台
|
仅x86
|
注释
该命令仅在用户模式下工作。内核模式下,需要使用!thread命令。用户模式下使用/mt 或/ma 创建的minidump也可以使用该命令,查看Minidumps获得详细信息。
.ttime 显示线程的创建实践,以及运行于内核模式和用户模式的总时间。
示例:
0:000> .ttime
Created: Sat Jun 28 17:58:42 2003
Kernel: 0 days 0:00:00.131
User: 0 days 0:00:02.109
.unload (Unload Extension DLL)
.unload 命令从调试器中卸载一个扩展DLL。
语法
.unload DLLName
!DLLName.unload
参数
DLLName
指定要卸载的调试器扩展DLL的文件名。如果DLL加载时指定了完整路径,那么也必须指定完整路径。如果省略DLLName ,则卸载当前扩展DLL。
环境
模式
|
用户模式、内核模式
|
目标
|
活动目标、崩溃转储
|
平台
|
所有
|
注释
该命令在测试自己创建的扩展时游泳。要重新编译扩展,必须先卸载掉才能加载新DLL。
附加信息
关于加载、卸载和控制扩展的详细信息,查看加载调试器扩展DLL。
.unloadall (Unload All Extension DLLs)
.unloadall 命令卸载调试器在主系统上的所有扩展DLL。
语法
.unloadall
环境
模式
|
用户模式、内核模式
|
目标
|
活动目标、崩溃转储
|
平台
|
所有
|
附加信息
关于加载、卸载和控制扩展的详细信息,查看加载调试器扩展DLL。
.wake (Wake Debugger)
.wake 命令结束睡眠模式。该命令仅在从内核调试器控制用户模式调试器时使用。
语法
.wake PID
参数
PID
用户模式调试器的PID。
环境
模式
|
从内核调试器控制用户模式调试器
|
目标
|
仅活动调试
|
平台
|
所有
|
注释
从内核调试器控制用户模式调试器并且系统在睡眠状态时,该命令用于在到达睡眠时间之前唤醒调试器。
该命令不是在目标机的用户模式调试器上,也不是在主控机上的内核调试器执行,而是从运行在目标机上的第三个调试器(KD、CDB或NTSD)执行的。
这种情况下可以使用新启动的调试器,或者正好在运行的另外的调试器。但是,如果没有其他调试器在运行,比较简单的是使用CDB和-wake 命令行选项。
附加信息
相信信息,查看从内核调试器控制用户模式调试器。关于如何得到调试器的进程ID的信息,查看 获得进程ID。
.write_cmd_hist (Write Command History)
.write_cmd_hist 命令将调试器命令窗口的所有历史信息写入一个文件中。
语法
.write_cmd_hist Filename
参数
Filename
指定要创建的文件的路径和文件名。
环境
该命令只能在WinDbg中使用,并且不能用于脚本文件。
模式
|
用户模式、内核模式
|
目标
|
活动目标、崩溃转储
|
平台
|
所有
|
.writemem (Write Memory to File)
.writemem 命令将一段内存写入文件中。
语法
.writemem FileName Range
参数
FileName
指定要创建的文件。可以使用全路径和文件名,或者仅仅是文件名。如果包含空格,必须用引号将FileName 括起来。如果没有指定路径,则使用当前目录。
Range
指定要写入文件的内存区域。详细信息,查看地址和地址区域语法。
环境
模式
|
用户模式、内核模式
|
目标
|
活动目标、崩溃转储
|
平台
|
所有
|
注释
内存的内容被逐个拷贝到文件中,它不会被进行任何分析。
.writemem 命令和.readmem (Read Memory from File)命令相反。
.wtitle (Set Window Title)
.wtitle 命令设置WinDbg主窗口或者NTSD、CDB、 KD窗口的标题。
语法
.wtitle Title
参数
Title
窗口要使用的标题。
环境
该命令不能用于脚本文件。
模式
|
用户模式、内核模式
|
目标
|
活动目标、崩溃转储
|
平台
|
所有
|
注释
对于CDB、NTSD或KD如果没有使用 .wtitle 命令,窗口标题是启动调试器使用的命令行。
对于WinDbg,如果没有使用 .wtitle,主窗口标题包含目标的名字。如果激活了调试服务器,也会显示连接字符串。如果激活了多个调试服务器,则只显示最近的一个。
使用.wtitle后, Title会替代所有信息。即使之后又启动了调试服务器,Title也不会改变。
WinDbg版本号总是会显示在窗口标题栏上,不管是否使用了该命令。