NetRoc's Blog

N-Tech

 

WinDbg 文档翻译----28

cc682/NetRoc

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

其他远程调试方法

本节包含:

进程服务器(用户模式)

KD连接服务器(内核模式)

转发器

高级远程调试

注意  可以从内核调试器控制CDB(或NTSD)。这是另一种远程调试的形式。查看从内核调试器控制用户模式调试器获取更多细节。

进程服务器(用户模式)

通过进程服务器进行的远程调试需要在服务器上运行一个称为进程服务器的小应用程序。之后用户模式调试器在客户端上启动。由于该调试器会承担所有实际的操作,所以它被称为灵巧客户端(smart client)

Windows调试工具包包含一个用户模式的进程服务器名为DbgSrv (dbgsrv.exe) 。

两台计算机不需要运行相同版本的Windows;他们可以运行Windows NT、Windows 2000或之后版本的Windows。但是,客户端使用的调试器和服务器端使用的DbgSrv必须是来自相同版本的Windows调试工具包中的二进制文件。该方法不能用于调试dump文件。

要设置该远程会话,要先设置进程服务器然后再激活灵巧客户端。任意数量的灵巧客户端可以通过单个进程服务器进行操作—这些调试会话会彼此分割不会相互影响。当某个调试会话结束时,进程服务器可以继续运行并且用于新的调试会话。

本节包含:

激活进程服务器

搜索进程服务器

激活灵巧客户端

进程服务器示例

控制进程服务器会话

激活进程服务器

Windows调试工具包中包含的进程服务器称为DbgSrv (dbgsrv.exe)。

DbgSrv支持几种传输协议:命名管道(NPIPE)、TCP、COM端口、安全管道(SPIPE)和安全套接字层(SSL)。SPIPE和SSL协议仅在Windows 2000 和之后的系统中支持。

DbgSrv 命令行语法依赖于所使用的协议。有下面一些不同的形式:

dbgsrv -t npipe:pipe=PipeName[,hidden][,password=Password]  [-x | [-sifeo Executable-c[sAppCmdLine

dbgsrv -t tcp:port=Socket[,hidden][,password=Password][,ipversion=6]  [-x | [-sifeo Executable-c[sAppCmdLine

dbgsrv -t tcp:port=Socket,clicon=Client[,password=Password][,ipversion=6] [-x | [-sifeo Executable-c[sAppCmdLine

dbgsrv -t com:port=COMPort,baud=BaudRate,channel=COMChannel[,hidden][,password=Password] [-x | [-sifeo Executable-c[sAppCmdLine

dbgsrv -t spipe:proto=Protocol,{certuser=Cert|machuser=Cert},pipe=PipeName[,hidden][,password=Password] [-x | [-sifeo Executable-c[sAppCmdLine

dbgsrv -t ssl:proto=Protocol,{certuser=Cert|machuser=Cert},port=Socket[,hidden][,password=Password] [-x | [-sifeo Executable-c[sAppCmdLine

dbgsrv -t ssl:proto=Protocol,{certuser=Cert|machuser=Cert},port=Socket,clicon=Client[,password=Password] [-x | [-sifeo Executable-c[sAppCmdLine

上面命令中的参数有以下这些可能值:

PipeName

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

Socket

当使用TCP或SSL时,Socket 是套接字的端口号。也可以用一个冒号来指定端口范围(例如port=2:7)。DbgSrv会检查该范围内的端口是否可用。如果找到了一个空闲端口并且没有出现错误,进程服务器会被创建起来。灵巧客户端需要指定连接到服务器的实际端口号。 (如果使用了clicon参数来进行反向连接,灵巧客户端也可以按这种方式指定端口范围,而进程服务器必须指定实际使用的端口。)

clicon=Client

使用TCP或SSL协议并指定clicon 参数时,会打开反向连接。这意味着进程服务器会试图连接调试客户端,而不是由灵巧客户端来发起连接。这在当防火墙阻止通常方向上的连接时会比较有效。客户端指定灵巧客户端所在的计算机的网络名或IP地址。两个反斜杠(\\)是可选的。

如果使用进程服务器来寻找特定客户端的方式,就不能将多个客户端连接到一个服务器。如果连接被拒绝或丢失,必须重起进程服务器。当使用-QR命令显示所有活动服务器时,反向连接的进程服务器不会被列举出来。

注意  使用clicon时,最好在进程服务器创建之前启动灵巧客户端,但是正常的顺序(服务器在客户端之前)也可以使用。

COMPort

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

BaudRate

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

COMChannel

如果使用COM协议,COMChannel 指定和调试客户端通信所使用的COM频道。它可以是0到254之间的任意值(包含0和254)。单个COM端口可以通过使用不同的频道号来支持多个连接。 (这和调试电缆使用COM的情况不同—那种情况下COM端口不能使用频道。)

Protocol

(Windows 2000 和之后的系统) 如果使用SSL或SPIPE,Protocol 指定安全频道(S-Channel)协议。它可以是tls1pct1ssl2ssl3

Cert

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

hidden

避免该服务器在使用-QR命令行选项显示所有活动服务器时被显示出来。

password=Password

要求灵巧客户端在连接到进程服务器时提供指定的密码。Password 可以是任何字母和数字组成的字符串。

注意  在TCP、NPIPE或COM协议下使用密码仅提供程度的保护,因为密码不会被加密。当密码和SSL或SPIPE协议一起使用时,会被加密。如果需要安全的远程会话,必须使用SSL或SPIPE协议!

ipversion=6

(仅Debugging Tools for Windows 6.6.07 和更老的版本) 用TCP连接到Internet时强制调试器使用IPV6而不是V4。在Windows Vista和之后版本中,调试器会尝试默认使用IP v6

,所以没有必要使用该选项。

-x

忽略后面的命令行。在从一个可能在命令行中添加不需要的文本的程序启动DbgSrv时该选项很有用。

-sifeo Executable

挂起指定映像的映像文件执行选项(Image File Execution Option (IFEO))值。Executable需要包含可执行映像的文件名和扩展名。 -sifeo 选项使得DbgSrv可以设置成为使用--c 选项启动的映像的IFEO调试器,而不会因为IFEO设置造成递归请求。

-c

使DbgSrv创建一个新进程。可以用它来创建打算调试的进程。但是,该选项本身不会使得新进程被调试;必须找到它的PID并在启动灵巧客户端调试该进程时使用-p选项指定。

s

使得新创建的进程被立即挂起。如果使用该选项,建议使用CDB作为灵巧客户端。进程服务器启动之后,需要找出新进程的PID。然后就可以和-p PID一样,用-pr-pb命令行选项来启动调试器了。

AppCmdLine

指定被创建进程的完整命令行。AppCmdLine 可以是Unicode或ASCII字符串,并且可以包含任何可打印字符。-c[s]参数后的任何文本都会被认为是AppCmdLine字符串的内容。

可以在计算机上启动任意数量的进程服务器。但是通常这是不需要的,因为一个进程服务器就可以被任意数量的灵巧客户端使用(每个都在不同的调试会话中)。

搜索进程服务器

可以用KC、CDB和-QR命令行选项来获得某个网络服务器上运行的所有可用的进程服务器列表。

这个列表中可能包含已经不存在但是没有被完全关闭的服务器—连接到这样的服务器会产生一条错误信息。该列表也包含调试服务器和KD连接服务器。每种情况下的服务器类型都会被指明。

使用语法如下:

Debugger -QR \\Server 

Debugger 可以是KD或CDB—两种情况下输出都一样。反斜杠(\\)开头的Server是可选的。

在WinDbg中,可以使用Connect to Remote Stub Server对话框来查看可用服务器列表。

对于每个调试服务器都会按照用于启动调试客户端的完整的连接字符串形式列出(除了密码会用星号替代之外) 。KD连接服务器也在该列表中。查看File | Connect to Remote Stub获得详细信息。

激活灵巧客户端

一旦DbgSrv进程服务器被激活,就可以在另外一台计算机上启动一个灵巧客户端开始调试会话。

有两种不同的启动灵巧客户端的方法:使用-premote 命令行选项来启动CDB或WinDbg;或者使用WinDbg图形界面。

灵巧客户端使用的协议必须和进程服务器匹配。启动灵巧客户端的常规语法由使用的协议决定。有下面一些选择:

Debugger -premote npipe:server=Server,pipe=PipeName[,password=Password] [Options] 

Debugger -premote tcp:server=Server,port=Socket[,password=Password][,ipversion=6] [Options] 

Debugger -premote tcp:clicon=Server,port=Socket[,password=Password][,ipversion=6] [Options] 

Debugger -premote com:port=COMPort,baud=BaudRate,channel=COMChannel[,password=Password] [Options] 

Debugger -premote spipe:proto=Protocol,{certuser=Cert|machuser=Cert},server=Server,pipe=PipeName[,password=Password] [Options] 

Debugger -premote ssl:proto=Protocol,{certuser=Cert|machuser=Cert},server=Server,port=Socket[,password=Password] [Options] 

Debugger -premote ssl:proto=Protocol,{certuser=Cert|machuser=Cert},clicon=Server,port=Socket[,password=Password] [Options] 

要使用图形界面连接到进程服务器,WinDbg必须在静止模式下—它必须以没有命令行参数的形式启动,或必须中止已有的调试会话。选择File | Connect to Remote Stub菜单命令。当Connect to Remote Stub Server 对话框出现后,在Connection string 文本框中输入下面的字符串之一:

npipe:server=Server,pipe=PipeName[,password=Password

tcp:server=Server,port=Socket[,password=Password][,ipversion=6

tcp:clicon=Server,port=Socket[,password=Password][,ipversion=6

com:port=COMPort,baud=BaudRate,channel=COMChannel[,password=Password

spipe:proto=Protocol,{certuser=Cert|machuser=Cert},server=Server,pipe=PipeName[,password=Password

ssl:proto=Protocol,{certuser=Cert|machuser=Cert},server=Server,port=Socket[,password=Password

ssl:proto=Protocol,{certuser=Cert|machuser=Cert},clicon=Server,port=Socket[,password=Password

另外,也可以使用Browse 来定位激活的进程服务器。查看File | Connect to Remote Stub获取详细信息。

上面命令中的参数有下面一些可能的值:

Debugger

可以是CDB或WinDbg。

Server

这是创建进程服务器的计算机的网络名字或IP地址。两个反斜杠(\\) 在命令行中是可选的,但是在WinDbg对话框中不能使用。

PipeName

如果使用NPIPE或SPIPE,PipeName 是进程服务器创建时设定的管道名。

Socket

如果使用TCP或SSL协议,Socket 和进程服务器创建时指定的套接字端口号一样。

clicon

指定进程服务器将试图通过反向连接来连接到灵巧客户端。客户端当且仅当服务器也使用clicon时才能使用clicon。大多数情况下,使用反向连接时,灵巧客户端应比进程服务器启动。

COMPort

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

BaudRate

如果使用COM协议,BaudRate 必须和进程服务器创建时选择的波特率匹配。

COMChannel

如果使用COM协议,COMChannel 必须和进程服务器创建时选择的频道号匹配。

Protocol

(Windows 2000 和之后的系统) 如果使用SSL或SPIPE协议,Protocol 必须和进程服务器创建时选择的安全协议匹配。

Cert

(Windows 2000 和之后的系统) 如果使用SSL或SPIPE协议,必须和进程服务器创建时指定一样的certuser=Certmachuser=Cert 参数。

Password

如果进程服务器创建时使用了密码,创建灵巧客户端时必须使用Password 。它必须和原始密码匹配。密码是大小心敏感的。如果密码错误,会出现"Error 0x80004005." 错误。

ipversion=6

(仅Debugging Tools for Windows 6.6.07 和之前的版本) 强制调试器在使用TCP连接到Internet时使用IP v6而不是v4。在Windows Vista和之后的版本中,调试器尝试默认使用IP v6,所以不再需要该选项。

Options

任何其它命令行参数都可以放在这里。查看命令行选项获得完整列表。如果使用CDB,这里必须指定要调试的进程。如果使用WinDbg,可以在命令行或者通过图形界面指定要调试的进程。

由于进程服务器类似于灵巧客户端的网关一样工作,其他的选项和在同一台机器上调试用户模式程序时一样。 查看Starting the Debugger获得操作规程。

如果在.attach (Attach to Process).create (Create Process)命令使用-premote选项,需要的参数和上面列出的相同。

进程服务器示例

假设一个人在一台名为\\BOX17的计算机上运行一个应用程序。该程序有一些问题,但是调试技术人员在其他地方。

第一个人使用DbgSrv在\\BOX17上设置进程服务器。目标应用程序的进程ID为122。使用TCP协议,套接字段口号为1025。用如下命令启动服务器:

E:\Debugging Tools for Windows> dbgsrv -t tcp:port=1025 

在另一台计算机上,技术人员决定使用WinDbg作为灵巧客户端。它可以用如下命令启动:

G:\Debugging Tools> windbg -premote tcp:server=BOX17,port=1025 -p 122 

这里有另一个例子。该例子中使用NPIPE,调试器使用CDB而不是WinDbg。第一个用户选择一个管道名。它可以是任何字母或数字—这个例子中为" AnotherPipe "。使用如下命令启动调试服务器:

E:\Debugging Tools for Windows> dbgsrv -t npipe:pipe=AnotherPipe 

技术人员不确定使用了什么名字,所以他/她在网络上查询管道名:

G:\Debugging Tools> cdb -QR \\BOX17 
Servers on \\BOX17:
Debugger Server - npipe:Pipe=MainPipe
Remote Process Server - npipe:Pipe=AnotherPipe

显示了两个管道。但是,只有一个是进程服务器—另一个是调试服务器,所以不是需要的那个。所以AnotherPipe肯定是正确的名字。然后可以使用下面的命令来启动灵巧客户端:

G:\Debugging Tools> cdb -premote npipe:server=BOX17,pipe=AnotherPipe -v sol.exe 

关于使用进程服务器的更复杂的示例,查看居中的符号

控制进程服务器会话

当远程会话开始之后,灵巧客户端就可以像在单台机器上调试目标程序一样使用。除了路径是按照灵巧客户端所在计算机设置之外,所有命令也按同样的方式使用。

使用WinDbg作为灵巧客户端

当WinDbg启动作为用户模式进程服务器的灵巧客户端之后,它会一直保持对该服务器的附加状态。如果调试会话结束了, File | Attach to a Process菜单命令或.tlist (List Process IDs)命令可以显示进程服务器所在的计算机上所有运行的进程。WinDbg 可以附加到任意进程上。

File | Open Executable命令不能使用。只能通过WinDbg命令行来创建一个新进程。

这种情况下,WinDbg不能调试本机上的进程,也不能开始内核调试会话。

结束会话

CDB或WinDbg可以通过常规方法退出或结束调试会话。查看结束调试会话获得详细信息。进程服务器会继续存在并可以被使用任意多次。 (也可以同时被任意多个调试会话使用。)

在每一方的计算机上都可以终止进程服务器。使用.endpsrv (End Process Server) 命令从灵巧客户端终止它。在进程服务器所在的计算机上,可以使用进程管理器终止dbgsrv.exe 进程。

posted on 2008-05-14 14:08 NetRoc 阅读(724) 评论(1)  编辑 收藏 引用

评论

# re: WinDbg 文档翻译----28 2008-05-15 16:13 图书

是挺有价值。  回复  更多评论   

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

导航

统计

常用链接

留言簿(7)

随笔档案(99)

文章分类(35)

文章档案(32)

Friends

Mirror

搜索

最新评论

阅读排行榜

评论排行榜