cc682/NetRoc
http://netroc682.spaces.live.com/
.netuse (Control Network Connections)
.netuse 命令添加一个到网络共享的连接。
语法
.netuse /a "[Local]" "Remote" "[User]" "[Password]"
参数
/a
增加一个新连接。必须总是使用/a开关。
Local
指定该连接要使用的驱动器字母。必须用引号将 Local 括起来。如果省略它,也必须包含一对空引号。
Remote
指定要连接的共享的UNC路径。必须用双引号将Remote 扩起来。
User
指定建立连接时用来认证的帐号的用户名。必须用引号包含User 。如果省略它,也必须使用一对空引号。
Password
指定User帐号的密码。必须用引号包含Password 。如果省略它,也必须使用一对空引号。
环境
模式
|
用户模式、内核模式
|
目标
|
活动目标、崩溃转储
|
平台
|
所有
|
注释
.netuse 命令的作用类似于Microsoft MS-DOS命令中的net use。
如果在远程调试会话中使用.netuse 该命令会作用于调试服务器而不是 调试客户端。
下面是该命令的示例。
0:000> .netuse "m:" "\\myserver\myshare" "" ""
.noshell (Prohibit Shell Commands)
.noshell 命令用于禁止使用.shell 命令。
语法
.noshell
环境
模式
|
用户模式、内核模式
|
目标
|
活动目标、崩溃转储
|
平台
|
所有
|
注释
如果使用了.noshell 命令,只要调试器还在运行就不能再使用.shell (Command Shell) ,即使新开了调试会话。
进行远程调试时,该命令可用于增强安全性。
附加信息
关于命令Shell的更多信息和其他禁用Shell命令的方法,查看使用Shell 命令。
.noversion (Disable Version Checking)
.noversion 命令禁止对扩展DLL进行版本检查。
语法
.noversion
环境
模式
|
用户模式、内核模式
|
目标
|
活动目标、崩溃转储
|
平台
|
所有
|
注释
扩展DLL的build号应该和要调试的计算机的build号相同,因为这些DLL是使用了版本相关的数据结构来编译和链接的。如果版本不匹配,一般会看到下面的信息。
*** Extension DLL(1367 Free) does not match target system(1552 Free)
.ocommand (Expect Commands from Target)
.ocommand 命令使得目标程序可以发送命令到调试器。
语法
.ocommand String
.ocommand -d
.ocommand
参数
String
指定命令前缀字符串。String 可以包含空格,但是不能使用类似\" 和\n 这样的C风格控制字符。也可以将String包含在引号中。但是,如果String 中含有分号、头部的空格或尾部的空格,就不能用引号包含String。
-d
删除命令前缀字符串。
环境
注释
如果不带参数使用.ocommand ,调试器显示当前的命令前缀字符串。使用.ocommand –d命令清除已存在的字符串。
设置了命令前缀字符串之后,会对目标的任何调试输出(例如OutputDebugString的内容)进行扫描。如果该输出是以命令前缀字符串开头的,那么该输出在前缀字符串之后的文本会被当作调试器命令来运行。当对这个字符串进行执行时,命令字符串不会显示出来。
如果需要附加的信息,目标可以在调试输出字符串中包含.echo (Echo Comment) 命令。没有以前缀字符串开头的调试输出仍然按照通常情况处理。
命令字符串中的命令执行之后,如果最后一条命令不是g (Go),则会中断到调试器。
命令前缀字符串和目标的调试输出之间的比较是不区分大小写的。(但是,后面通过.ocommand 命令来显示的字符串是按照输入时的大小写显示的)。
例如,假设在调试器中输入了下面的命令。
0:000> .ocommand magiccommand
然后,目标程序执行下面这行。
OutputDebugString("MagicCommand kb;g");
调试器会将命令字符串前缀识别出来并立即执行kb;g。
但是,下面这行不会造成任何命令的执行。
OutputDebugString("Command on next line.\nmagiccommand kb;g");
上面这条命令因为输出的开头不是命令字符串前缀,所以即使它出现在一个新行的开头,也不会执行任何命令。
注意 应该选择一个不会出现在除了命令之外的其他调试输出中的字符串作为命令字符串前缀。
附加信息
关于OutputDebugString 的更多信息和其他用户模式用来和调试器联系的函数,查看Microsoft Windows SDK 文档。
.ofilter (Filter Target Output)
.ofilter 命令过滤来自目标程序或目标机的调试输出。
语法
.ofilter [/!] String
.ofilter ""
.ofilter
参数
/!
颠倒过滤器,使得调试器只显示不包含String 的那些输出。如果不使用该参数,调试器只显示包含String 的输出。
String
指定要在目标的调试输出中匹配的字符串。String 可以包含空格,但是不能使用\" 和\n 这样的C风格控制符。String 可以包含各种通配符和修饰符。关于该语法的更多信息,查看字符串通配符语法。
可以将String 用引号括起来。但是,如果String 包含分号、开头的空格或结尾的空格,就不能使用引号。String 中的字母数字都会被转换成大写,但是实际的模板匹配是大小写敏感的。
环境
模式
|
用户模式、内核模式
|
目标
|
活动目标、崩溃转储
|
平台
|
所有
|
注释
如果不带参数使用.ofilter ,调试器显示显示当前的模板匹配标准。
要清空已存在的过滤器,使用.ofilter ""。该命令放过任何从用户模式例程(例如OutputDebugString)和内核模式例程(如DbgPrint)发送过来的数据。但是,调试器总是会显示DbgPrompt发送的提示。
DbgPrintEx 和KdPrintEx 例程提供了另一种过滤掉不需要的调试信息的方法。
附加信息
关于OutputDebugString和其他用户模式例程的更多信息,查看Microsoft Windows SDK 文档。关于 DbgPrint、DbgPrintEx和其他内核模式例程的更多信息,查看Windows Driver Kit (WDK)。
.open (Open Source File)
.open 命令在源码路径中搜索一个源码文件并打开它。
语法
.open [-m Address] FileName
.open -a Address
参数
FileName
指定源码文件的名字。该名字可以包含绝对或相对路径。如果没有指定绝对路径,则该路径会被解释为源码路径中的目录的相对路径。
-m Address
指定源文件中的地址。该地址必须包含在已知模块中。如果FileName 指定的文件不是唯一时需要使用-m Address参数。该语法的更多信息,查看地址和地址区域语法。
如果使用源码服务器 来获得源文件,则必须使用-m 参数。
-a Address
指定源文件中的一个地址。该地址必须包含在已知模块中。如果调试器找到该源文件,则加载并打开它,并且和指定地址对应的行会高亮。如果调试器找不到源文件,该地址会在Disassembly窗口中显示出来。语法的更多信息,查看地址和地址区域语法。
环境
只能在WinDbg中使用.open 命令,并且不能在脚本文件中使用。
模式
|
用户模式、内核模式
|
目标
|
活动目标、崩溃转储
|
平台
|
所有
|
附加信息
关于源文件、源码路径和其他加载源文件的方法的更多信息,查看源码路径。
.opendump (Open Dump File)
.opendump 命令打开一个dump文件进行调试。
语法
.opendump DumpFile
.opendump /c "DumpFileInArchive" [CabFile]
参数
DumpFile
指定要打开的dump文件名。DumpFile 需要包含文件扩展名 (一般是.dmp 或.mdmp)并且可以包含绝对或相对路径。相对路径是相对于启动调试器的目录的。
/c "DumpFileInArchive"
指定要调试的dump文件名。该dump文件必须是包含在CabFile 指定的存档文件中。必须用括号包含DumpFileInArchive 文件。
CabFile
指定要打开的存档文件名。CabFile 需要包含扩展名 (一般是.cab) 并且可以包含绝对或相对路径。相对路径是相对于启动调试器的目录的。如果用/c开关来指定存档文件中的dump文件但是省略CabFile,调试器会使用前一次打开过的存档文件。
环境
模式
|
用户模式、内核模式
|
目标
|
仅崩溃转储(但是可以在其他会话运行时使用该命令)
|
平台
|
所有
|
注释
使用.opendump 命令之后,必须使用g (Go) 命令来完成对dump文件的加载。
打开存档文件 (例如 CAB 文件)时,需要使用/c开关。如果没有使用该开关但是又指定了一个存档文件作为DumpFile,调试器会打开该文件中第一个具有.mdmp 或.dmp扩展名的文件。
当正在处理某个调试会话时也可以使用.opendump 。这使得可以同时调试不止一个崩溃转储文件。关于如何控制多目标会话的更多信息,查看调试多个目标。
附加信息
关于dump文件的更多信息,查看打开崩溃转储。
.outmask (Control Output Mask)
.outmask 命令控制当前的输出掩码。
语法
.outmask[-] [/l] Expression
.outmask /a
.outmask /d
参数
Expression
指定要加入到掩码中的标志。Expression是可以用来指示需要的标志的任何ULONG值。可用标志的列表,查看注释节中的表格。
-
从掩码中移除Expression 指定的位,而不是添加到掩码中。
/l
保护日志文件的输出掩码的当前值。如果不包含/l, 日志文件的输出掩码和常规输出掩码(regular output mask)相同。
/a
激活所有的掩码标志。使用该参数相当于.outmask 0xFFFFFFFF。
/d
将输出掩码恢复为默认值。使用该参数相当于.outmask 0x3F7。
环境
模式
|
用户模式、内核模式
|
目标
|
活动目标、崩溃转储
|
平台
|
所有
|
注释
每个输出掩码标志都使得调试器在调试器命令窗口中显示特定内容。如果设置所有掩码,则所有输出都会显示出来。
移除输出掩码的标志时要小心,因为可能不能再看到调试器输出。
有下面这些标志位。
值
|
默认设置
|
说明
|
1
|
On
|
普通输出
|
2
|
On
|
错误输出
|
4
|
On
|
警告
|
8
|
Off
|
附加输出
|
0x10
|
On
|
提示输出
|
0x20
|
On
|
提示前的寄存器转储
|
0x40
|
On
|
扩展操作的警告
|
0x80
|
On
|
来自目标的调试输出(例如OutputDebugString 或DbgPrint)
|
0x100
|
On
|
目标期望的调试输入 (例如DbgPrompt)
|
0x200
|
On
|
符号信息 (例如!sym noisy)
|
.pagein (Page In Memory)
.pagein 命令将指定内存区域进行页换入。
语法
.pagein [Options] Address
参数
Options
任意下面的选项:
/p Process
指定包含想页换入的内存的进程。 (明确地说,该参数指定进程的EPROCESS块的地址。)如果省略Process 或指定0,调试器使用当前的进程设置。进程设置的更多信息,查看.process (Set Process Context)
/f
强制页面被换入,即使该地址是内核内存并且Microsoft Windows操作系统的版本并不支持这个操作。
Address
指定要页换入的地址。
环境
模式
|
仅内核模式(但是不能再本地内核调试中)
|
目标
|
仅活动调试
|
平台
|
所有
|
注释
运行.pagein 命令后必须使用g (Go)命令来恢复程序执行,目标机会再次自动中断到调试器中。
这时,指定的地址已经被页换入了。如果使用/p 选项,进程上下文也会被切换到指定进程,就像使用了.process /i Process 命令一样。
如果该地址已经被页换入了,.pagein 命令还是会检查该地址是否换入并且中断到调试器。如果该地址非法,命令仅仅是中断回调试器。
在Windows Server 2003和Windows XP中,使用.pagein 只能页换入用户模式地址。可以使用/f 开关来重载这个限制,但是不建议这样使用。在Windows Vista中,可以安全的页换入用户模式和内核模式内存。
注意 如果在Windows Server 2003或者Windows XP上对内核栈上的地址使用.pagein ,可能造成bug check。
需求
版本: 在Windows XP和之后版本的Windows中支持。
.pcmd (Set Prompt Command)
.pcmd 命令使得调试器不管任何时候目标停止时都执行一个命令,并且在调试器命令窗口中显示寄存器或目标状态信息的提示。
语法
.pcmd -s CommandString
.pcmd -c
.pcmd
参数
-s CommandString
指定一个新的提示命令字符串。当目标停止运行时,调试器立即运行CommandString 命令。如果CommandString 包含空格或分号,必须将它用引号括起来。
-c
删除任何已存在的提示命令字符串。
环境
模式
|
用户模式、内核模式
|
目标
|
活动目标、崩溃转储
|
平台
|
所有
|
注释
如果不带参数使用.pcmd 则显示当前的提示命令。
使用.pcmd –s设置提示命令时,指定的CommandString 会在目标停止执行时执行 (例如g、 p、或 t 命令结束时)。CommandString 命令在使用非执行命令时不会被执行,除非该命令会显示寄存器或者目标状态信息。
下面的例子中,第一次使用.pcmd 设置了和提示符一起出现的固定字符串。第二次使用.pcmd 使得每次出现提示符时显示目标的当前进程ID和线程ID。该提示在使用.ttime 命令之后不会出现,因为该命令不会造成执行。
0:000> .pcmd
No per-prompt command
0:000> .pcmd -s ".echo Execution is done."
Per-prompt command is '.echo Execution is done.'
0:000> t
Prymes!isPrime+0xd0:
004016c0 837dc400 cmp dword ptr [ebp-0x3c],0x0 ss:0023:0012fe70=00000002
Execution is done.
0:000> t
Prymes!isPrime+0xd4:
004016c4 7507 jnz Prymes!isPrime+0xdd (004016cd)
[br=1]
Execution is done.
0:000> .ttime
Created: Thu Aug 21 13:18:59 2003
Kernel: 0 days 0:00:00.031
User: 0 days 0:00:00.000
0:000> .pcmd -s "r $tpid, $tid"
Per-prompt command is 'r $tpid, $tid'
0:000> t
Prymes!isPrime+0xdd:
004016cd ebc0 jmp Prymes!isPrime+0x9f (0040168f)
$tpid=0000080c $tid=00000514
0:000> t
Prymes!isPrime+0x9f:
0040168f 8b55fc mov edx,[ebp-0x4] ss:0023:0012fea8=00000005
$tpid=0000080c $tid=00000514
附加信息
For more information about the Debugger Command window prompt, see Using Debugger Commands.
.process (Set Process Context)
.process 命令指定要用作进程上下文的进程。
语法
.process [/i] [/p [/r] ] [/P] [Process]
参数
/i
(Windows XP 和之后的系统;仅活动调试;非本地内核调试) 指定要侵入(invasively)调试Process 。这种调试意味着目标机上的操作系统实际上将指定的进程激活。 (如果不带该参数,.process 命令改变调试器的输出,但是不会作用于目标机本身。)如果使用了 /i,必须使用g (Go) 命令来执行目标。数秒之后,目标会再次中断到调试器中,并且指定的 Process 被激活并用作当前进程上下文。
/p
如果使用了/p 并且Process 非0,在访问之前将该进程所有页表入口(PTE)转换成物理地址。这种转换可能造成速度变慢,因为调试器必须找到该进程使用的所有内存的物理地址。调试器也需要通过调试电缆传输大量数据。 (该行为和.cache forcedecodeuser一样。)
如果包含/p 并且Process为0或者省略,则禁用这样的转换。 (这种行为和.cache noforcedecodeptes一样。)
/r
如果使用了/r和/p选项,进程上下文设置之后会重新加载用户模式符号。 (该行为和.reload /user一样。)
/P
(仅活动调试) 如果使用/P 并且Process 非0,在访问之前将该进程所有页表入口(PTE)转换成物理地址。和/p不同,/P 选项转换所有用户模式和内核模式进程的PTE,而不只是指定进程。这种转换可能造成速度变慢,因为调试器必须找到该进程使用的所有内存的物理地址。调试器也需要通过调试电缆传输大量数据。 (该行为和.cache forcedecodeuser一样。)
Process
指定需要的进程的地址。(更明确一些,该参数指定进程的EPROCESS 块的地址)。进程上下文会设置为该进程。如果省略Process 或指定0,进程上下文会重新设置为当前系统状态的默认进程。 (如果使用了/i 选项来设置进程上下文,则也必须使用/i选项来重置进程上下文。)
环境
模式
|
仅内核模式
|
目标
|
活动目标、崩溃转储
|
平台
|
所有
|
注释
一般来说,进行内核调试时,只能看到当前进程关联的用户模式地址空间。
.process 命令指示内核调试器使用指定的用户模式进程作为进程上下文。这种用法有几种作用,但是最重要的是调试器可以访问该进程的虚拟地址空间。调试器使用该进程的页表来解释所有用户模式内存地址,所以就可以读写这些内存。
.context (Set User-Mode Address Context) 命令有类似作用。但是,.context 命令将用户模式地址上下文设置为指定的页目录,而.process 命令将进程上下文设置为指定进程。在x86处理器上,.context 和.process 的作用几乎完全一样。但是在Itanium处理器上,单个进程可能拥有不止一个页目录。这时,.process 命令更加强大,因为可以启用对该进程关联的所有页目录的访问。进程上下文的更多信息,查看进程上下文。
注意 如果在进行活动调试,需要使用/i或/p参数。如果不使用它们之一,则不能正确显示用户模式或会话的内存。
/i 参数激活目标进程。使用该选项时,必须执行目标一次以使得命令起作用。如果再次执行,则进程上下文又会丢失。
/p 参数启用forcedecodeuser 设置。(如果forcedecodeuser 选项已经激活,则不需要 /p。) 进程上下文和forcedecodeuser 状态只在目标再次运行起来之前保持。
如果调试崩溃转储, /i 和/p 选项不能使用。不管如何,不能访问当崩溃发生时被换页到磁盘上的用户模式进程虚拟内存的任何部分。
如果想使用内核调试器在用户空间设置断点,使用/i选项来将目标切换到正确的进程上下文。
下面的例子说明了如何使用!process扩展命令来查找需要的进程的 EPROCESS 块地址。
kd> !process 0 0
**** NT ACTIVE PROCESS DUMP ****
PROCESS fe5039e0 SessionId: 0 Cid: 0008 Peb: 00000000 ParentCid: 0000
DirBase: 00030000 ObjectTable: fe529b68 TableSize: 50.
Image: System
.....
PROCESS fe3c0d60 SessionId: 0 Cid: 0208 Peb: 7ffdf000 ParentCid: 00d4
DirBase: 0011f000 ObjectTable: fe3d0f48 TableSize: 30.
Image: regsvc.exe
下面的.process 命令使用该进程的地址。
kd> .process fe3c0d60
Implicit process is now fe3c0d60
注意该命令使得不再需要.context 命令。用户模式地址上下文已经是需要的值了。
kd> .context
User-mode page directory base is 11f000
这个值使得可以以各种方式察看内存空间。例如,下面是一个!peb 扩展命令的示例。
kd> !peb
PEB at 7FFDF000
InheritedAddressSpace: No
ReadImageFileExecOptions: No
BeingDebugged: No
ImageBaseAddress: 01000000
Ldr.Initialized: Yes
Ldr.InInitializationOrderModuleList: 71f40 . 77f68
Ldr.InLoadOrderModuleList: 71ec0 . 77f58
Ldr.InMemoryOrderModuleList: 71ec8 . 77f60
01000000 C:\WINNT\system32\regsvc.exe
77F80000 C:\WINNT\System32\ntdll.dll
77DB0000 C:\WINNT\system32\ADVAPI32.dll
77E80000 C:\WINNT\system32\KERNEL32.DLL
77D40000 C:\WINNT\system32\RPCRT4.DLL
77BE0000 C:\WINNT\system32\secur32.dll
SubSystemData: 0
ProcessHeap: 70000
ProcessParameters: 20000
WindowTitle: 'C:\WINNT\system32\regsvc.exe'
ImageFile: 'C:\WINNT\system32\regsvc.exe'
CommandLine: 'C:\WINNT\system32\regsvc.exe'
DllPath: 'C:\WINNT\system32;.;C:\WINNT\System32;C:\WINNT\system;C:\WINNT;C:\WINNT\system32;C:\WINNT;C:\WINNT\System32\Wbem;C:\PROGRA~1\COMMON~1\AUTODE~1'
Environment: 0x10000
附加信息
关于进程上下文和其他上下文设置的更多信息,查看改变上下文。
.prompt_allow (Control Prompt Display)
.prompt_allow 命令控制在单步和跟踪时显示哪些信息,以及目标的执行何时停止。
语法
.prompt_allow {+|-}Item [...]
.prompt_allow
参数
+
指定单步、跟踪和执行时要显示的项。在加号(+)前必须加上一个空格,但是之后不能加。
-
阻止单步、跟踪和执行时要显示的项。在减号(-)前必须加上一个空格,但是之后不能加。
Item
指定要显示或者不显示的项。可以指定任意数量的项。以空格分隔多项。每项前面都必须加上一个加号(+) 或者减号 (–) 。可以使用下面这些项:
dis
当前位置的反汇编指令。
ea
当前指令的有效地址。
reg
最重要的寄存器的当前状态。可以通过pr、 tr或者.prompt_allow -reg 命令来禁止对寄存器的显示。 这三个命令都可以控制相同的设置,并且可以用任何一个来覆盖先前命令的设置。
也可以使用l-os 命令来禁止寄存器显示。这个设置和其他三个命令是分开的,下面的注释节中会说明。要控制哪些寄存器和标志显示出来,可以使用rm (Register Mask) 命令。
src
对应当前指令的源码行。可以通过l-ls 或 .prompt_allow -src;命令来禁止源码行显示。必须设置这两个机制才能显示源码行。
sym
当前指令处的符号。该符号包括当前模块、函数名和偏移。
环境
模式
|
用户模式、内核模式
|
目标
|
活动目标、崩溃转储
|
平台
|
所有
|
注释
不带参数使用.prompt_allow 命令可以查看显示和不显示的项。每次运行 .prompt_allow,调试器仅改变指定项的状态。
默认情况下,所有项都会显示出来。
如果使用了 l+os 选项,该选项会覆盖除了src 之外的所有.prompt_allow 选项。
可以使用像下面例子一样的复杂命令。
0:000> .prompt_allow -reg -dis +ea
Allow the following information to be displayed at the prompt:
(Other settings can affect whether the information is actually displayed)
sym - Symbol for current instruction
ea - Effective address for current instruction
src - Source info for current instruction
Do not allow the following information to be displayed at the prompt:
dis - Disassembly of current instruction
reg - Register state
附加信息
关于作用于执行的命令的更多信息,查看控制调试目标。
.quit_lock (Prevent Accidental Quit)
.quit_lock 命令设置一个密码用于避免意外的结束调试会话。
语法
.quit_lock /s NewPassword
.quit_lock /q Password
.quit_lock
参数
/s NewPassword
阻止调试会话结束并保存NewPassword 。如果没有过使用.quit_lock /q 命令并提供相同的密码,则不能结束调试会话。NewPassword 可以是任何字符串,必须用引号将NewPassword 括起来。
/q Password
允许调试会话被结束。Password 必须和.quit_lock /s 命令设置的匹配。
环境
模式
|
用户模式、内核模式
|
目标
|
活动目标、崩溃转储
|
平台
|
所有
|
注释
不带参数时, .quit_lock 显示当前的加锁状态,包括密码的完整文本。
可以重复使用.quit_lock /s 来改变已存在的密码。
使用 .quit_lock /q时,锁会被移除。该命令不会关闭调试器,而只是使得可以在需要的时候结束会话。
注意 密码不是"秘密"。任何附加到调试会话上的远程用户都可以使用.quit_lock 来查看密码。该命令的作用是避免意外使用q (Quit) 命令。特别是在调试会话重新启动非常困难时,该命令非常有用(例如远程调试时)。
不能在安全模式下使用.quit_lock /s 。如果在安全模式(Secure Mode)激活时使用该命令,密码保护也会存在,只是不能改变或移除它。
附加信息
关于退出调试器和停止对目标附加的各种方法,查看结束调试会话。