NetRoc's Blog

N-Tech

 

WinDbg 文档翻译----26

cc682/NetRoc

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

远程调试

本节包含:

选择最好的远程调试方法

通过调试器的远程调试

通过Remote.exe的远程调试

其他远程调试方法

用户模式远程调试需要两台计算机:客户端服务器。服务器是用于运行被调试的应用程序和用户模式调试器的机器。客户端是用于远程控制调试会话的机器。

远程内核调试需要三台计算机:客户端服务器目标机。目标机是被调试的机器。服务器是运行调试器的机器,它和目标机位于同一个物理位置。客户端是用于远程控制调试会话的机器。查看设置内核模式调试的硬件获得关于服务器和目标机之间的连接的更多信息。

选择最好的远程调试方法

有两种主要的远程调试方法,以及一些额外方法和很多组合方法。

这里有一些主题用于帮助选择最合适的调试技术。

  • 通过调试器的远程调试常常是最好的方法。如果有一台服务器和一台客户端,并且他们可以自由的连接到对方、在两台机器都安装了同样的调试器二进制文件,并且调试的技术人员可以和服务器房间里的另一个人直接联系,那么这是最推荐的一种方法。

    客户端和服务器可以运行于Microsoft Windows NT、Windows 2000或之后版本的Windows。它们不需要运行相同版本。如果连接使用TCP协议,客户端和服务器还可以运行Windows 9x/Me。

    如果客户端不能连接到服务器,但是服务期可以连接到客户端,可以通过使用clicon 参数来使用反向连接来进行远程调试。

  • 通过remote.exe的远程调试用于远程控制一个命令提示符窗口。它可以用来远程控制KD、CDB或NTSD。不能用于WinDbg。

    如果客户端没有调试器二进制文件的拷贝,就必须使用remote.exe方法。如果运行Windows 9x/Me并不能使用TCP协议时也需要使用该方法。

  • 一个进程服务器(process server)或一个KD连接服务器(KD connection server)在调试技术人员不能和服务器所在房间的人交流时使用。所有实际的调试工作都是由客户端(称为灵巧客户端(smart client))进行的;这样就不需要有一个人在服务器旁。

    进程服务器用于用户模式调试;KD连接服务器用于内核模式调试。除此之外,它们的行为有很多相似的地方。

    该方法在服务器不能处理很重的进程负荷,或运行客户端的技术人员需要访问一些不能由服务器访问的机密的符号或源文件时非常有用。但是,该方法没有通过调试器进行的远程调试那么快和有效。该方法不能用于调试dump文件。

    查看进程服务器(用户模式)KD连接服务器(内核模式)获得详细信息。

  • 转发器是用于在两台计算机间传送数据的轻量级的代理服务器。在使用通过调试器的远程调试或进程服务器时,可以在客户端和服务器间加入一个转发器。

    当客户端和服务器不能直接通信,但是都可以访问另外一台计算机时,转发器可能是必须的。同样可以对转发器使用反向连接。也可以一次使用两个转发器,但是需要这样的情况极少。

    查看转发器获得详细信息。

  • 也可以从内核调试器控制CDB(或NTSD)。这又是另一种形式的远程调试。查看通过内核调试器控制用户模式调试器获取详细信息。

所有这些方法都可以有所变化。

可以将几台计算机一起使用以获得多种传输方法的优点。可以创建复杂的传输序列以顾及到技术人员的位置、符号所在的位置、以及是否有防火墙阻止某些方向上的连接。查看高级远程调试获得一些例子。

甚至可以在单台计算机上进行远程调试。例如,启动一个低权限的进程服务器,然后使用一个高权限的灵巧客户端连接上去可能会很有用。另外,在Windows 2000 终端服务器计算机上,可以从一个会话调试另外一个会话。

通过调试器的远程调试

直接通过调试器进行的远程调试通常是用于远程调试的最好最容易的方法。

该方法使用在不同位置运行的两个调试器。实际进行调试的一个称为调试服务器。在另外一边用于控制调试会话的调试器称为调试客户端

两台计算机不需要运行同样版本的Windows;它们可以运行Windows NT、Windows 2000或之后版本的Windows。实际的调试器不需要相同,一个WinDbg调试客户端可以连接到一个CDB调试服务器,等等。

但是,两台计算机上的调试器二进制文件最好是同一个Windows调试工具包版本中的,或者至少都是最新版本的。

要设置远程会话,需要首先设置调试服务器,然后再激活调试客户端。任意数量的调试客户端可以连接到调试服务器。一个单独的调试器可以同时将自己分成几个调试服务器,以适应不同的连接类型。

但是,单个调试器不能同时作为调试客户端和调试服务器。如果要连接三个调试器,查看其他远程调试方法

本节包含:

激活调试服务器

搜索调试服务器

激活调试客户端

客户端和服务器示例

控制远程调试会话

激活调试服务器

有两种方法用于激活调试服务器。可以通过使用-server 命令行选项激活。也可以通过在启动调试器之后使用.server 命令激活。

调试器支持几种传输协议:命名管道(NPIPE)、TCP、COM端口、安全pipe(SPIPE)和安全套接字层(SSL)。SPIPE和SSL协议仅在Windows 2000和之后的系统中支持。如果使用Windows 9x/Me,必须使用TCP协议,并且调试服务器必须使用-noio 命令行选项启动。

启动调试器的常规语法决定于使用的协议。有些面一些选择:

Debugger -server npipe:pipe=PipeName[,hidden][,password=Password]  [-noio] [Options] 

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

Debugger -server tcp:port=Socket,clicon=Client[,password=Password][,ipversion=6] [-noio] [Options] 

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

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

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

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

另一种开始调试服务器的方法是在启动调试启之后使用.server (Create Debugging Server) 命令。该命令的语法和命令行相似:

.server npipe:pipe=PipeName[,hidden][,password=Password]  

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

.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

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

Debugger

可以是KD、 CDB、NTSD或WinDbg。

PipeName

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

Socket

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

clicon=Client

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

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

注意  如果使用了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

避免服务器在另一个调试器显示所有活动服务器时被显示出来。

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

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

-noio

如果调试器使用-noio 选项一起启动,通过服务器就本身不能进行输入输出了。调试器仅接收来自调试客户端的输入(加上任何初始命令或通过-c命令行选项指定的命令脚本)。所有输出都被定向到调试客户端。-noio 选项仅在KD、CDB和NTSD可用。如果用NTSD 作为服务器,则不会创建控制台窗口。

Options

任何更多的命令行参数都可以放在这里。完整列表查看命令行选项

可以使用.server 命令来使用不同的协议选项启动多个服务器。这使得不同类型的调试客户端可以加入到会话中。

搜索调试服务器

可以使用KD或CDB和-QR 命令行选项来获得一个网络服务器上的所有可用的调试服务器列表。

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

使用语法如下:

Debugger -QR \\Server 

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

在WinDbg中,可以使用Connect to Remote Debugger Session 对话框来查看可用服务器列表。查看File | Connect to Remote Session 获得详细信息。

对于每个调试服务器都会按照用于启动调试客户端的完整的连接字符串形式列出(除了密码会用星号替代之外) 。

激活调试客户端

一旦调试服务器被激活,就可以在另外一台计算机上启动一个调试客户端连接到该调试会话上。

有两种方法可以启动调试客户端:使用 -remote 命令行选项,或者使用WinDbg图形界面。

客户端使用的协议必须和服务器匹配。开始调试客户端的一般语法由使用的协议决定。有下面一些选择:

Debugger -remote npipe:server=Server,pipe=PipeName[,password=Password

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

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

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

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

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

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

要使用图形界面连接到远程调试会话,WinDbg必须在静止模式下—它必须以没有命令行参数的形式启动,或必须中止已有的调试会话。选择File | Connect to Remote Session 菜单命令或按下 快捷键。当Connect to Remote Debugger Session对话框出现后,在 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 Session 获取详细信息。

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

Debugger

该参数不一定要和调试客户端(疑为调试服务器)使用的一样—WinDbg、KD和CDB都可以用于通过调试器进行的远程调试。

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,所以不再需要该选项。

用于开始新调试会话的命令行选项(如-p)不能用在调试客户端上,而只能由服务器使用。配制选项(如-n)在客户端或服务器上都可以使用。

客户端和服务器示例

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

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

E:\Debugging Tools for Windows> cdb -server tcp:port=1025 -p 122 

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

G:\Debugging Tools> windbg -remote tcp:server=BOX17,port=1025 

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

E:\Debugging Tools for Windows> cdb -server npipe:pipe=MainPipe -v winmine.exe 

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

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

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

G:\Debugging Tools> cdb -remote npipe:server=BOX17,pipe=MyPipe 

使用安全服务器

这里有一个使用安全服务器的例子。该服务器使用安全套接字层,并使用TLS1作为S-Channel 协议。调试器会在机器存储中查找证书。证书是用它的16进制特征码指定的。

D:\> cdb -server "ssl:proto=tls1,machuser=ab 38 f7 ae 13 20 ac da 05 14 65 60 30 83 7b 83 09 2c d2 34,port=1234" notepad.exe

控制远程调试会话

当远程会话开始之后,调试服务器和调试客户端都可以输入命令。如果有多个客户端,他们也都可以输入命令。当按下ENTER时,命令会传输到调试服务器并执行。

当用户输入命令后,所有用户都会看到命令输出。如果是从调试客户端输入的命令,所有其他用户都会看到一个标识表明是谁使用了该命令。在调试服务器上输入的命令不会有这个前缀。

某个用户执行了一条命令之后,其他通过KD或CDB连接的用户看不到新的命令提示符。另一方面,WinDbg用户会一直看到调试器命令窗口底部面板的提示符,即使调试器引擎正在运行。遇到这样的问题都不用在意,任何用户在任何时候都可以输入命令,引擎会按照接收道命令的顺序来执行。

通过WinDbg界面进行的操作也会在调试服务器中被执行。

用户之间的通信

每当有新的调试客户端连接到会话中,所有其他用户都会看到该客户端连接的信息。一个客户端断开连接不会显示信息。

.clients (List Debugging Clients)命令会列出当前连接到调试会话的所有客户端。

.echo (Echo Comment) 命令在一个用户发送信息到另一个用户时很有用。

WinDbg 工作空间

当WinDbg用作调试客户端时,它的工作空间只保存通过图形界面设置的值。通过调试器命令窗口进行的改变不会保存。 (这保证了只有本地客户端进行的改变会被体现出来,因为调试器命令窗口和调试服务器一样接收来自所有客户端的输入。)

文件路径

符号路径、可执行映像路径和扩展DLL路径都被解释为调试服务器上的Windows调试工具包安装目录的相对路径。

当WinDbg作为调试客户端时,它也拥有自己的本地源码路径(local source)。所有源码相关的命令都访问本地计算机上的源码文件。因此,任何需要使用源码命令的客户端和服务器上都必须设置适合的路径。

查看设置路径和加载文件获取关于这些路径的详细信息。

这种多路径系统使得调试客户端可以使用源码相关的命令而不需要和其他客户端或服务器实际共享源文件。这在某个用户需要访问私有或机密代码时很有用。

删除调试服务器

.endsrv (End Debugging Server)命令可以用来终止一个调试服务器。如果有多个调试服务器,可以停止一些并保留另外一些。

终止一个服务器可以避免之后的任何客户端附加到它上面。这样不会中断当前已连接到该服务器的客户端。

退出调试器和终止会话

要退出一个调试客户端而不终止服务器,必须在该客户端上执行一条命令。如果客户端是KD或CDB,使用CTRL+B 键退出。如果用脚本来运行KD或CDB,使用.remote_exit (Exit Debugging Client)。如果客户端是WinDbg,选择File 菜单的Exit 来退出。

要终止整个会话并退出调试服务器,使用q (Quit) 命令。该命令可在任何服务器或客户端输入,并且它会终止整个会话的所有用户。

posted on 2008-05-12 17:29 NetRoc 阅读(396) 评论(1)  编辑 收藏 引用

评论

# re: WinDbg 文档翻译----26 2008-05-15 16:25 网上买书

“直接通过调试器进行的远程调试”翻译的很不错。  回复  更多评论   

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

导航

统计

常用链接

留言簿(7)

随笔档案(99)

文章分类(35)

文章档案(32)

Friends

Mirror

搜索

最新评论

阅读排行榜

评论排行榜