NetRoc's Blog

N-Tech

 

WinDbg 文档翻译----65

cc682/NetRoc

http://netroc682.spaces.live.com/

.readmem (Read Memory from File)

.readmem 命令从指定文件中读取原始二进制数据并复制到目标机内存中。

语法

.readmem FileName Range 

参数

FileName

指定要读取的文件名。可以指定完整路径或仅仅是文件名。如果文件名包含空格,用括号将FileName 扩起来。如果没有指定路径,则调试器使用当前目录。

Range

指定要放置数据的地址范围。该参数可以是开始和结束地址,也可以是开始地址和对象个数。语法的更多信息,查看地址和地址区域语法

环境

模式

用户模式、内核模式

目标

活动目标、崩溃转储

平台

所有

 

注释

内存数据会逐个的复制到目标机中。调试器不会以任何形式分析数据。例如,.readmem myfile 1000 10 命令从Myfile 中复制10个字节到目标机中从1000地址开始的位置。

.readmem 命令和.writemem (Write Memory to File) 命令是相反的。

.reboot (Reboot Target Computer)

.reboot 命令重起目标机。

语法

.reboot 

环境

模式

仅内核模式

目标

仅活动调试

平台

所有

附加信息

相关命令的更多信息和重起过程如何作用于调试器的说明,查看崩溃和重起目标机

.record_branches (Enable Branch Recording)

.record_branches 命令启用对目标代码执行的分支记录。

语法

.record_branches {1|0
.record_branches 

环境

模式

用户模式、内核模式

目标

仅活动调试

平台

仅x64

注释

.record_branches 1命令启用对目标代码的分支记录。.record_branches 0 命令禁用这种纪录。

如果不带参数,.record_branches 显示当前的设置状态。

.reload (Reload Module)

.reload 命令删除指定模块的所有符号信息,并且按需要重新加载这些符号。某些情况下,该命令也会重新加载或卸载模块本身。

语法

.reload [Options] [Module [= Address [Size [Timestamp] ] ] ] 
.reload -? 

参数

Options

任意下面的选项:

/d

重新加载调试器模块列表中的所有模块。(省略所有参数时,这是用户模式调试下的默认行为。)

/f

强制调试器立即加载符号。该参数会覆盖延迟符号加载。更多信息,查看下面的注释节。

/i

忽略.pdb文件版本不匹配的情况。(如果没有包含该参数,调试器不会加载不匹配的符号文件。) 使用 /i时,即使没有明确指定,也会使用/f

/l

列出模块但是不重加载它们的符号。(内核模式下,使用该参数的输出和!drivers 扩展命令一样。)

/n

仅重加载内核符号。该参数不会重加载任何用户模式符号。(只能在内核模式调试时使用该选项。)

/o

强制覆盖符号服务器的下游存储(downstream store)中的缓存文件。使用该标志时,还需要包含/f。默认情况下,下游存储中的文件永远不会被覆盖。

由于符号服务器对每个版本的二进制文件的符号使用不同的名字,除非确认下游存储被破坏了,否则不需要使用该选项。

/s

重新加载系统的模块映像列表中所有模块。(省略所有参数时,在内核模式下这是默认行为。) 如果在用户模式调试时使用名字来单独加载某个系统模块,则必须包含/s

/u

卸载指定模块和它的所有符号。调试器卸载任何名字匹配Module 的模块,不管它的全路径是什么。映像名也会被搜索。更多信息,查看下面的注释节。

/unl

基于已卸载模块列表中的映像信息重新加载符号。

/user

仅重加载用户模式符号。(只能在内核模式调试时使用该选项。)

/v

打开详细显示。

/w

Module 当作一个字面上的字符串。这样可以避免调试器展开通配符。

Module

指定要在主控机上重加载符号的目标机上的映像名。Module 需要包含文件的名字和扩展名。如果没有使用/w 选项,Module 可以包含各种通配符和修饰符。该语法的更多信息,查看字符串通配符语法。如果省略Module.reload 命令的行为由使用的Options 决定。

Address

指定模块的基地址。一般来说只有在映像头被破坏或者页换出时才需要该地址。

Size

指定模块映像的大小。很多情况下,调试器会知道模块的正确大小。当调试器不知道正确大小时,就需要指定Size。该大小可以是实际的模块大小或者更大的数字,但是不能更小。一般来说,只有在映像头被破坏或者页换出时才需要该大小。

Timestamp

指定模块映像的时间戳。很多情况下,调试器会知道模块的正确时间戳。当调试器不知道正确的时间戳时,就需要指定Timestamp一般来说,只有在映像头被破坏或者页换出时才需要指定。

-?

显示这个命令的简短帮助文本。

环境

模式

用户模式、内核模式

目标

活动目标、崩溃转储

平台

所有

注释

.reload 并不会造成符号信息的读取,而是告诉调试器符号文件可能改变了,或者新的模块被添加到模块列表中。该命令使得调试器修改它的模块列表,并且删除指定模块的符号信息。每个单独的.pdb 中的符号信息直到实际被需要之前都不会被读取。(这种加载称为延迟符号加载。)

可以使用/f 选项或者执行ld (Load Symbols) 命令来强制符号加载。

.reload 命令在系统停止响应(即崩溃),使得被调试的目标机的符号信息丢失时很有用。该命令在更新了符号树时也很有用。

如果映像头因为某些原因出错或者页换出了,则必须同时指定AddressSize 才能正确加载符号。

.reload /u 命令进行更广泛的搜索。调试器首先尝试使用Module 匹配精确的模块名,不管路径是什么。如果找不到匹配项,Module 被当作已加载的映像名。例如,如果HAL在内存中的名字为halacpi.dll,下面两个命令都可以卸载它的符号。

kd> .reload /u halacpi.dll

kd> .reload /u hal

如果在进行用户模式调试,并且希望加载一个不在目标程序模块列表中的模块,必须像下面的例子一样使用/s 选项。

0:000> .reload /u ntdll.dll
Unloaded ntdll.dll

0:000> .reload /s /f ntdll.dll

附加信息

关于延迟符号加载的更多信息,查看延迟符号加载。关于其他符号选项的更多信息,查看设置符号选项

.remote (Create Remote.exe Server)

.remote 命令启动一个Remote.exe服务器, 为当前的调试会话提供一个远程连接。

语法

.remote session 

参数

session

指定给调试会话的名字。

环境

可以在KD和CDB中使用.remote 命令,但是不能在WinDbg中使用。

模式

用户模式、内核模式

目标

活动目标、崩溃转储

平台

所有

注释

.remote 命令创建一个Remote.exe 进程并且将当前调试器转变成Remote.exe 服务器。该服务器使得Remote.exe 客户端可以连接到当前调试会话上。

附加信息

关于如何使用Remote.exe 服务器和Remote.exe 客户端的更多信息,查看通过Remote.exe的远程调试

.remote_exit (Exit Debugging Client)

.remote_exit 命令退出调试客户端但是并不结束调试会话。

语法

.remote_exit [FinalCommands

参数

FinalCommands

Specifies a command string to pass to the debugging server. You should separate multiple commands by using semicolons. These commands are passed to the debugging server and the connection is then broken.

环境

只能在脚本文件中使用.remote_exit 命令。可以在KD和CDB中使用,但是不能在WinDbg中使用。

模式

用户模式、内核模式

目标

活动目标、崩溃转储

平台

所有

注释

如果直接使用KD或CDB而不是使用脚本,可以通过按下CTRL+B来退出调试客户端。

不能通过在WinDbg中执行的脚本来退出调试客户端。

附加信息

关于脚本文件的更多信息,查看使用脚本文件。关于调试客户端和调试服务器的更多信息,查看通过调试器进行的远程调试

.restart (Restart Target Application)

.restart 命令重新启动目标程序。

不要将该命令和只在内核模式下工作的.restart (Restart Kernel Connection) 命令混淆。

语法

.restart 

环境

模式

仅用户模式

目标

仅活动调试

平台

所有

注释

如果是由调试器来启动程序,则CDB 和WinDbg 可以重起目标程序。即使目标程序已经关闭也可以使用.restart 命令。

但是,如果程序已经运行之后调试器再附加上去,.restart 命令无效。

进程重起之后会立即中断到调试器。

如果通过WinDbg的命令提示符来启动目标,并且在决定是否使用.restart前想查看命令行,可以使用View | WinDbg Command Line 菜单命令。

附加信息

关于如何使用该命令的更多信息和其它相关命令的概述,查看控制调试目标

.restart (Restart Kernel Connection)

.restart 命令重起内核连接。

不要将该命令和用户模式下的.restart (Restart Target Application) 命令混淆。

语法

.restart 

环境

只能在KD中使用.restart命令。

模式

仅内核模式

目标

活动目标、崩溃转储

平台

所有

注释

.restart 命令和CTRL+R (Re-synchronize) 命令类似,只是.restart 的效果更广泛一些。该命令相当于结束调试器然后再附加一个新的调试器到目标机上。

.restart 命令在进行通过remote.exe进行的远程调试并且结束和重起调试器比较困难时最为有用。但是, 在通过调试器进行远程调试时,不能从调试客户端使用.restart 命令。

附加信息

关于重建和目标的联系的更多信息,查看同步目标机

.scroll_prefs (Control Source Scrolling Preferences)

.scroll_prefs 命令控制滚动到一行时,Source窗口中源码的位置。

语法

.scroll_prefs Before After 
.scroll_prefs 

参数

Before

指定在Source窗口中,要滚动到的行之前应该显示多少行。

After

指定在Source窗口中,要滚动到的行之后应该显示多少行。

环境

该命令只能在WinDbg中可用,并且不能用在脚本文件中。

模式

用户模式、内核模式

目标

活动目标、崩溃转储

平台

所有

注释

该命令不带参数时,显示当前的源码滚动设置。

.secure (Activate Secure Mode)

.secure 命令激活或者显示安全模式的状态。

语法

.secure 1 
.secure 

环境

安全模式只能在调试器静止时启用。由于安全模式定义为阻止用户模式的调试操作,所以只能在内核调试会话中应用。

模式

仅内核模式

目标

活动目标、崩溃转储

平台

所有

注释

要激活安全模式,使用命令.secure 1 (或者.secure后跟任意非0值)。

The command .secure will show whether Secure Mode is currently active.

附加信息

详细信息查看安全模式

.send_file (Send File)

.send_file 命令用于复制文件。如果在通过进程服务器进行远程调试,它将一个文件从灵巧客户端发送到进程服务器的计算机上。

语法

.send_file [-fSource Destination 
.send_file [-f-s Destination 

参数

-f

强制创建文件。默认情况下, .send_file 不会覆盖任何已存在的文件。如果使用了-f 开关,则总是会创建目标文件,任何已存在的同名文件都会被覆盖。

Source

指定要发送的文件的全路径和文件名。如果在通过进程服务器调试,该文件必须在灵巧客户端运行的计算机上。

Destination

指定文件要写入的目录。如果通过进程服务器进行调试,该目录必须在进程服务器运行的计算机上。

-s

使得调试器复制所有已加载的符号文件。

环境

模式

用户模式、内核模式

目标

活动目标、崩溃转储

平台

所有

注释

该命令在进行通过进程服务器的远程调试,但是又想改为本地调试时特别有用。这种情况下可以使用.send_file -s 命令来将调试器用到的所有符号文件复制到进程服务器端。这些符号文件之后就可以被本地调试器使用了。

.server (Create Debugging Server)

.server 命令启动一个调试服务器,允许远程连接到当前的调试会话上。

语法

.server npipe:pipe=PipeName[,hidden][,password=Password][,IcfEnable
.server tcp:port=Socket[,hidden][,password=Password][,ipversion=6][,IcfEnable
.server tcp:port=Socket,clicon=Client[,password=Password][,ipversion=6
.server com:port=COMPort,baud=BaudRate,channel=COMChannel[,hidden][,password=Password
.server spipe:proto=Protocol,{certuser=Cert|machuser=Cert},pipe=PipeName[,hidden][,password=Password
.server ssl:proto=Protocol,{certuser=Cert|machuser=Cert},port=Socket[,hidden][,password=Password
.server ssl:proto=Protocol,{certuser=Cert|machuser=Cert},port=Socket,clicon=Client[,password=Password

参数

PipeName

使用NPIPE 或SPIPE 协议时,PipeName 是用来作为管道名的字符串。每个管道名都应该标识一个唯一的调试服务器。如果尝试重复使用管道名,会收到一条错误信息。PipeName 不能包含空格或引号。可以包含数字的printf 形式格式化字符,如%x%d。调试器用自己的进程ID来替换它,第二个格式化字符用调试器的线程ID来替换。

Socket

使用TCP 或SSL 协议时,Socket 是套接字端口号。也可以通过冒号来指定端口范围 (例如port=2:7)。如果这样做,调试器会检查范围内的每个端口是否空闲。如果找到了一个空闲端口并且没有发现错误,则创建调试服务器。如果使用clicon 参数来启用反向连接,则不能指定端口范围而必须指定单独的TCP端口。

clicon=Client

使用TCP 或SSL协议并指定clicon参数时,会打开一个反向连接。这意味着调试服务器会尝试连接调试客户端,而不是由客户端来发起连接。这在防火墙阻挡了某方向的连接时有用。Client 指定调试客户端存在的或者即将创建的机器的网络名。开头的两个反斜线(\\) 可选。

注意  使用clicon时,最好在调试服务器创建之前就启动调试客户端,虽然正常的顺序(服务器在客户端之前)也是可以的。反向连接服务器在另一个调试器显示所有活动服务器时不会被显示出来。

COMPort

使用COM协议时,COMPort 指定要使用的COM端口。前缀COM是可选的 (例如,使用 "com2" 和"2" 都可以)。

BaudRate

使用COM协议时,BaudRate 指定连接使用的波特率。只要硬件上支持的波特率都可以使用。

COMChannel

如果使用COM 协议,COMChannel 指定用来和调试客户端通信的COM频道(channel)。可以是0到254之间的任何值,包含0和254。

Protocol

(Windows 2000和之后的系统) 使用SSL 或SPIPE协议时,Protocol 指定安全频道(S-Channel)协议。可以是字符串tls1pct1ssl2或者ssl3

Cert

(Windows 2000和之后的系统)使用SSL 或SPIPE协议时,Cert 指定证书。这可以是证书名也可以是证书的签名(thumbprint) (由证书管理机构提供的16进制数字的字符串)。如果使用了certuser=Cert 语法,调试器会在系统保存的证书(默认存储)中查找。如果使用machuser=Cert,调试器会在机器存储中查找证书。指定的证书必须支持服务器验证。

hidden

阻止该服务器在其他调试器显示活动服务器时被显示出来。

password=Password

要求客户端在连接到调试会话时提供密码。Password 可以是任意由字母数字组成的字符串。

ipversion=6

(Debugging Tools for Windows 6.6.07和更早的版本) 强制调试器连接到Internet时使用IP v6而不是IP v4。在Windows Vista和之后的版本中,调试器会尝试默认使用IP v6,所以没有必要指定该选项。

IcfEnable

(仅Windows XP和之后的版本) 使得当Internet连接防火墙打开时,调试器启用TCP或命名管道连接需要使用到的端口。默认情况下,Internet连接防火墙会禁止这些协议使用的端口。IcfEnable和TCP连接一起使用时,调试器会让Windows打开Socket参数指定的端口。IcfEnable 和命名管道连接一起使用时,调试器会让Windows打开命名管道使用到的端口(139和445端口)。连接终止后,调试器不会关闭这些端口。

环境

模式

用户模式、内核模式

目标

活动目标、崩溃转储

平台

所有

注释

该命令将当前调试器转换成调试服务器。这使得可以在调试器已经运行之后启动服务器,而-server 命令行选项只能在调试器启动时指定。

这样可以让调试客户端连接到当前调试会话上。注意,可以使用不同的选项启动多个服务器,允许不同种类的调试客户端参与到会话中。

附加信息

关于如何启动调试服务器的完整细节,查看激活调试服务器。示例可以查看客户端和服务器示例

.servers (List Debugging Servers)

.servers 命令列举该调试器创建的所有调试服务器。

语法

.servers 

环境

模式

用户模式、内核模式

目标

活动目标、崩溃转储

平台

所有

注释

.servers 命令的输出会列出它执行的调试器所创建的所有调试服务器。输出是格式化的,所以可以将它作为-remote 的命令行选项或者粘贴到WinDbg对话框中。

每个调试服务器都由唯一的ID来标识。该ID可用作结束调试服务器的.endsrv (End Debugging Server) 命令的参数。

.servers 命令并不会列出同一台计算机上其他调试器所创建的调试服务器,也不会列出进程服务器或KD连接服务器创建的。但是,该规则有一个例外。如果一个DbgEng程序或者扩展通过调用IDebugClient::StartProcessServer 方法来创建一个或多个进程服务器,并且.servers 命令是由同一个IDebugClient 实例执行的,则输出中会包含这些进程服务器。

附加信息

关于调试服务器的完整细节,查看通过调试器进行的远程调试

.setdll (Set Default Extension DLL)

.setdll 命令改变调试器默认的扩展DLL。

语法

.setdll DLLName 
!DLLName.setdll 

参数

DLLName

指定扩展DLL的名字和路径。如果DLL加载时指定了完整路径,那么这里也要使用完整路径。

环境

模式

用户模式、内核模式

目标

活动目标、崩溃转储

平台

所有

注释

调试器会维持一个在启动时暗中加载的默认扩展DLL。这使得用户可以不用先加载扩展DLL就能使用扩展命令。该命令用于改变哪个DLL会默认加载。

执行该命令时,调试器会首先查看它是否是默认扩展。如果没有找到匹配,则会按照加载顺序搜索所有已加载的扩展DLL。

附加信息

关于加载、卸载和控制扩展的详细信息,查看加载调试器扩展DLL。关于执行扩展命令的信息,查看使用调试器扩展命令

.shell (Command Shell)

.shell 命令启动一个shell进程并将他的输出重定向到调试器或指定的文件。

语法

.shell [Options] [ShellCommand
.shell -i InFile [-o OutFile [-e ErrFile]] [OptionsShellCommand 

参数

InFile

指定用作输入的文件路径和名字。如果不打算为命令提供输入,可以指定一个连字符(-)来替代InFile,连字符前面不带空格。

OutFile

指定用作标准输出的路径和文件名。如果省略-o OutFile,输出被发送给调试器命令窗口。如果不希望输出被显示或者保存到文件中,可以指定一个前面不带空格的连字号(-) 来替代OutFile

ErrFile

指定用作错误输出的路径和文件名。如果省略-e ErrFile,则错误输出被发送到和标准输出相同的地方。如果不希望把输出显示保存到文件,可以指定一个前面不带空格的连字号(-) 来替代ErrFile

Options

可以是任意多个下面的选项:

-ci "Commands"

执行指定的调试器命令,然后将他们的输出作为要创建的进程的输入文件。Commands 可以是任意多个用分号分隔的调试器命令,用引号括起来。

-x

使创建的进程完全脱离调试器。在调试会话结束后这些进程还是可以继续运行。

ShellCommand

指定程序命令行或者要执行的Microsoft MS-DOS命令。

环境

模式

用户模式、内核模式

目标

活动目标、崩溃转储

平台

所有

注释

.shell 命令后的整行都会被当作Windows命令 (即使包含分号)。该行不能用引号括起来。在.shellShellCommand 之间必须有空格(多余的前导空格被忽略)。

如果没有使用-o OutFile 参数,则命令输出会出现在调试器命令窗口中。

执行不带参数的 .shell命令会激活shell并保持打开。之后的所有命令都会被当作Windows命令。这是调试器会显示<.shell process may need input>的信息,并且WinDbg提示符变成 Input> 。有时候如果调试器保持该shell打开,会出现一个另外的命令提示符窗口。应该无视该窗口,而所有的输入输出都通过调试器命令窗口进行。

要关闭shell并返回到调试器本身,可以键入exit.shell_quit。 (.shell_quit 命令要更强大,因为即使shell被冻结时也可以工作。)

调试CSRSS时不能使用该命令,因为CSRSS非活动时不能创建新进程。

可以使用-ci 标志来运行一个或多个调试器命令,并且将输出传递给shell进程作为输入。例如,可以将!process 0 7 命令的输出使用如下命令传递给一个Perl脚本:

0:000> .shell -ci "!process 0 7" perl.exe parsemyoutput.pl 

附加信息

关于访问命令shell的其他方法,查看使用Shell命令

.sleep (Pause Debugger)

.sleep 命令使得用户模式调试器暂停而目标机开始活动。该命令只能在从内核调试器控制用户模式调试器时使用。

语法

.sleep milliseconds 

参数

milliseconds

指定暂停的时间,以毫秒为单位。

环境

模式

从内核调试器控制用户模式调试器

目标

仅活动调试

平台

所有

注释

从内核调试器控制用户模式调试器,并且用户模式调试器提示符在内核调试器中可见时,该命令将激活睡眠模式(sleep mode)。内核调试器、用户模式调试器和目标程序都会冻结,但是目标机会变为活动状态。

如果在其他任何情况下使用该命令,则仅仅是调试器冻结一段时间。

睡眠时间的单位是毫秒,并且如果没有使用类似0n这样的前缀,会以默认基数来解析。例如,假设默认基数为16,下面的命令会造成65秒的睡眠:

0:000> .sleep 10000

附加信息

关于如何将调试器从睡眠模式中唤醒的信息,查看从内核调试器控制用户模式调试器

.sound_notify (Use Notification Sound)

.sound_notify 命令使得WinDbg进入命令等待状态(wait-for-command state)时播放一个声音。

语法

.sound_notify /ed 
.sound_notify /ef File 
.sound_notify /d 

参数

/ed

使得当WinDbg进入命令等待状态时Windows播放一个声音来提醒。

/ef File

当WinDbg进入命令等待状态时,播放指定文件中的声音。

/d

禁止声音提示。

环境

该命令只能在WinDbg中使用,并且不能用于脚本文件。

模式

用户模式、内核模式

目标

活动目标、崩溃转储

平台

所有

posted on 2008-07-03 16:19 NetRoc 阅读(632) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。

导航

统计

常用链接

留言簿(7)

随笔档案(99)

文章分类(35)

文章档案(32)

Friends

Mirror

搜索

最新评论

阅读排行榜

评论排行榜