NetRoc's Blog

N-Tech

 

WinDbg 文档翻译----47

cc682/NetRoc

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

命令

本节中的参考讨论可以在CDB、KD和WinDbg中使用的各种调试器命令。

ENTER (Repeat Last Command)

ENTER 键重复前一次输入的命令。

语法

ENTER

环境

模式

用户模式、内核模式

目标

活动目标、崩溃转储

平台

所有

 

注释

在CDB和KD中,在命令提示符下按下ENTER 本身,会执行前一次输入过的命令。

在WinDbg中,ENTER 键可以设置为无效或者重复上一条命令。可以在Options 对话框设置该选项。(点击View菜单上的Options,或者点击工具栏上的Options按钮()来打开Options对话框。)

如果将ENTER设置为重复上一条命令,但是又想在调试器命令窗口中产生一些空白,可以使用 *  (Comment Line Specifier)关键字并按下ENTER数次。

$<, $><, $$<, $$><, $$>a< (Run Script File)

$<$><$$<$$><$$>a< 命令读取指定的脚本文件的内容作为输入的调试器命令。

语法

$<Filename 
$><Filename 
$$< Filename 
$$>< Filename 
$$>a< Filename arg1 arg2 arg3 ... argn

参数

Filename

指定包含合法的调试器命令文本的文件。文件名必须符合Microsoft Windows文件命名规范。文件名中可以有空格。

argn

指定传递给脚本文件的参数。这些参数可以是引号括起来的字符串或者空格分隔的字符串。所有参数都是可选的。

环境

    

模式

用户模式、内核模式

目标

活动目标、崩溃转储

平台

所有

 

注释

如果该命令使用$$<$$><关键字,则关键字 和Filename 之间的空格是可选的。不管Filename是否包含空格,都可以使用引号来把它括起来。可以在该命令后添加一个分号或其他命令。

如果该命令使用$<$><关键字,则不能在它和Filename之间加入任何空格。 不能使用引号来包含Filename 。该命令之后不能添加分号或其他命令。

$<$$<关键字逐个执行脚本文件中的命令。$><$$><关键字打开脚本文件,将所有回车替换为分号,然后将转换后的文本当作单个命令块来执行。这些关键字在运行包含调试器命令程序的脚本时非常有用。关于这种程序的更多信息,查看使用调试器命令程序$$>a<关键字允许传递参数给脚本。

下表是如何使用这些命令的摘要信息。

关键字

文件名前是否允许空格?

是否将脚本精简为单个命令块?

$<

$><

$$<

$$><

$$>a<

 

调试器执行脚本文件时,命令和它们的输出都会在调试器命令窗口显示出来。当到达脚本末尾时,控制权返回到调试器。

脚本文件可以嵌套。如果调试器在脚本文件中遇到了这样的关键字,执行会移交给新的脚本文件,并且在它执行完成之后返回到先前的位置。脚本也可以被递归调用。

在WinDbg中,可以将附加的命令文本粘贴到调试器命令窗口中。

示例

下面的例子示范了如何将参数传递给脚本文件Myfile.txt。假设该文件包含如下文本:

.echo The first argument is ${$arg1}.
.echo The second argument is ${$arg2}.

可以通过使用类似这样的命令将参数传递给它:

0:000> $$>a<myfile.txt myFirstArg mySecondArg

命令的结果如下:

The first argument is myFirstArg.
The second argument is mySecondArg.

? (Command Help)

问号(?)字符用来显示所有命令和操作符的列表。

注意  单独的一个问号用来显示命令帮助。expression语法用来计算给定表达式的值。

语法

?

环境

模式

用户模式、内核模式

目标

活动目标、崩溃转储

平台

所有

 

注释

查看标准命令的更多信息,可以使用?。查看元命令的更多信息,使用.help。查看扩展命令的信息,使用 !help

? (Evaluate Expression)

(?) 命令可用于计算和显示一个表达式的值。

注意  单个问号(?)显示命令帮助。expression 命令计算给定表达式的值。

语法

? Expression

参数

Expression

指定要计算的表达式。

Environment

模式

用户模式、内核模式

目标

活动目标、崩溃转储

平台

所有

 

注释

?命令的输入和输出依赖于使用MASM表达式语法还是C++表达式语法。关于这积累表达式语法的更多信息,查看表达式求值数值表达式语法

如果使用MASM语法,输入和输出都依赖于当前的基数。要改变基数,使用n (Set Number Base)命令。

?命令在当前线程和进程上下文中计算表达式中符号的值。

See Also

?? (Evaluate C++ Expression), .formats (Show Number Formats)

?? (Evaluate C++ Expression)

双问号(??)命令根据C++表达式规则来计算和显示表达式的值。

语法

?? Expression

参数

Expression

指定要求值的C++表达式。语法的更多信息,查看C++数值和操作符

环境

模式

用户模式、内核模式

目标

活动目标、崩溃转储

平台

所有

 

注释

??命令根据当前线程和进程上下文来对表达式中的符号进行求值。

如果要使用MASM表达式规则来为Expression 表达式的一部分进行求值,可以将这部分用圆括号括起来并在前面添加两个at符号( @@ )。关于MASM和C++表达式的更多信息,查看表达式求值数值表达式语法

参见

? (Evaluate Expression).formats (Show Number Formats)

# (Search for Disassembly Pattern)

数字号(#)命令在反汇编代码中搜索符合指定模板的数据。

语法

# [Pattern] [Address [ L Size ]] 

参数

Pattern

指定用于在反汇编代码中搜索的模板。Pattern可以包含各种通配符和修饰符。关于该语法的更多信息,查看字符串通配符语法。如果在Pattern中包含空格,需要将模板用引号括起来。模板是不区分大小写的。如果之前使用过#命令,并且省略掉Pattern ,该命令会使用上一次的模板。

Address

指定搜索开始的地址。该语法的更多信息,查看地址和地址范围语法

Size

指定要搜索的指令数量。如果省略掉Size ,会一直搜索直到遇到匹配项。

环境

模式

用户模式、内核模式

目标

活动目标、崩溃转储

平台

所有

 

注释

如果之前使用过#命令并且省略掉Address ,会从上次搜索结束的地方开始搜索。

该命令通过搜索反汇编文本来查找指定的模板。可以使用该命令来查找寄存器名、常数或其他任何在反汇编输出中出现的字符串。可以反复使用不带Address 参数的命令来顺序查找匹配模板的项。

可以使用u (Unassemble) 命令或在WinDbg反汇编窗口中查看反汇编代码。反汇编的输出包含四个部分:地址偏移、二进制代码、汇编语言助记符合汇编语言详细信息。下面是这种显示的例子。

0040116b    45          inc         ebp            
0040116c    fc          cld                        
0040116d    8945b0      mov         eax,[ebp-0x1c] 

#命令可以在反汇编输出的任意单独部分中搜索文本。例如,使用# eax 0040116b 来在0040116d 地址查找mov eax,[ebp-0x1c] 指令。下面的命令也能搜索到该指令。

#  [ebp?0x  0040116b 
#  mov  0040116b 
#  8945*  0040116b 
#  116d  0040116b 

但是,不能将mov eax*作为单独的单元来进行搜索,因为moveax 出现在输出的不同部位。

另一个示例,可以使用下面的命令在入口点main 中查找对strlen 的第一个引用。

# strlen main

类似的,可以使用下面两个命令来查找0x779F9FBA 之后的第一个jnz 指令,并再查找之后的下一条jnz 指令。

# jnz 779f9fba# 

省略PatternAddress 时,他们的值由上一次的#命令决定。如果第一次使用#命令时省略掉它们中的一个,则不会进行搜索。但是即使在这种情况下PatternAddress 的值也会被初始化。

如果包含了PatternAddress,它的值被设置成输入的值。如果省略Address,它会被设置为程序计数器的当前值。如果省略掉Pattern ,会被设置为任意的空模板。

附加信息

关于汇编调试和相关命令的更多信息,查看汇编模式下的调试

|| (System Status)

双竖线(||)命令打印指定系统或当前正在调试的所有系统的状态信息。

不要将该命令和| (Process Status)命令混淆。

语法

|| System 

参数

System

指定要显示的系统。如果省略掉该参数,所有被调试的系统都会显示出来。该语法的更多信息,查看系统语法

环境

模式

多目标调试

目标

活动目标、崩溃转储

平台

所有

 

注释

||仅在调试多个目标时有用。很多,但不是全部的多目标调试会话会使用到多系统。关于这些会话的更多信息,查看调试多个目标

每个系统的信息包含服务器名字和详细的协议信息。调试器运行的系统被标识为<Local>

下面是如何使用该命令的示例。下面的命令显示所有系统。

3:2:005> ||

这个命令也显示所有系统。

3:2:005> ||*

下面的命令显示当前的活动系统。

3:2:005> ||.

下面的例子显示最近一次异常或中断发生的系统。

3:2:005> ||#

下面显示编号为2的系统。

3:2:005> ||2

||s (Set Current System)

||s命令设置或显示当前系统号。

不要将该命令和s (Search Memory)~s (Change Current Processor)~s (Set Current Thread)|s (Set Current Process) 命令混淆。

语法

||System s 
|| s 

参数

System

指定要激活的系统。该语法的更多信息,查看系统语法

环境

模式

多目标调试

目标

活动目标、崩溃转储

平台

所有

 

注释

||s命令仅在多目标调试时有用。很多,但不是全部的多目标调试会话会使用到多系统。关于这些会话的更多信息,查看调试多个目标

如果使用||s语法,调试器显示当前系统的信息。

该命令也会反汇编当前系统、当前进程、当前线程的当前指令。

| (Process Status)

管道(|)命令显示指定进程或当前正在调试的所有进程的信息。

不要将该命令和|| (System Status)命令混淆。

语法

| Process 

参数

Process

指定要显示的进程。如果省略掉该参输,则显示所有进程。该语法的更多信息,查看进程语法

环境

模式

仅用户模式

目标

活动目标、崩溃转储

平台

所有

 

注释

仅能在用户模式下指定进程。

可以在很多命令前添加一个进程符号。关于在命令后接一个管道(|)的意义的信息,查看每个命令本身的说明。

除非在启动调试会话时启用了对子进程的调试,否则仅有一个进程对调试器是可用的。

下例说明了如何使用该命令。例中的命令显示所有进程。

2:005> |

下例也显示所有进程。

2:005> |*

下面的命令显示当前的激活进程。

2:005> |.

下面的命令显示最初产生异常的进程(或者调试器最初附加到的进程)。

2:005> |#

下面的命令显示号码为2的进程。

2:005> |2

前面的命令显示如下输出。

0:002> |
#  0 id: 224   name: myprog.exe 
   1 id: 228   name: onechild.exe 
. 2 id: 22c   name: anotherchild.exe 

在输出的第一行,0是一个十进制进程号,224是16进制进程ID,Myprog.exe 是进程的程序名。进程2前面的点号(.) 表示该进程为当前进程。进程0前面的数字号(#)表示该进程是最初产生异常或调试器附加到的进程。

附加信息

关于显示或控制进程和线程的其他方法和更多信息,查看控制进程和线程

|s (Set Current Process)

|s命令设置或显示当前进程号。

不要将该命令和s (Search Memory)~s (Change Current Processor)~s (Set Current Thread)||s (Set Current System)命令混淆。

语法

|Process s 
| s 

参数

Process

指定要显示或设置的进程。关于该语法的更多信息,查看进程语法

环境

模式

仅用户模式

目标

活动目标、崩溃转储

平台

所有

 

注释

只能在用户模式下指定进程。

如果使用|s语法,调试器现实当前进程的信息。

该命令也会反汇编当前系统、当前进程、当前线程的当前指令。

附加信息

关于显示或控制进程和线程的其他方法和更多信息,查看控制进程和线程

~ (Thread Status)

波形符(~) 命令显示指定线程或当前进程中的所有线程的信息。

语法

~ Thread 

参数

Thread

指定要显示的线程。如果省略该参数,则显示所有线程。该语法的更多信息,查看线程语法

环境

模式

仅用户模式

目标

活动目标、崩溃转储

平台

所有

 

注释

只有在用户模式下才能显示线程。在内核模式下,波形符 (~)用于引用处理器。

可以在很多命令中添加线程符号。关于在这些命令中使用的波形符的意义的更多信息,查看这些命令本身的说明。

下面这些示例说明了该命令的使用方法。这条命令显示所有线程。

0:001> ~

该命令也显示所有线程。

0:001> ~*

下面的命令显示当前活动线程。

0:001> ~.

下面的命令显示原始的产生异常的线程(或调试器附加到进程时活动的线程)。

0:001> ~#

下面显示号码为2的线程。

0:001> ~2

上面的命令会产生如下输出。

0:001> ~
   0 id: 4dc.470 Suspend: 0 Teb 7ffde000 Unfrozen
. 1 id: 4dc.534 Suspend: 0 Teb 7ffdd000 Unfrozen
#  2 id: 4dc.5a8 Suspend: 0 Teb 7ffdc000 Unfrozen

输出的第一行上,0是10进制线程号,4DC是16进制进程ID,470是16进制线程ID,0x7FFDE000是TEB 地址,Unfrozen 是线程状态。线程1前面的点号(.)表示它是当前线程。线程2前面的数字号(#)表示它是产生异常或调试器附加到进程时活动的线程。

附加信息

关于显示或控制进程和线程的其他方法和更多信息,查看控制进程和线程

posted on 2008-06-10 12:03 NetRoc 阅读(342) 评论(0)  编辑 收藏 引用

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

导航

统计

常用链接

留言簿(7)

随笔档案(99)

文章分类(35)

文章档案(32)

Friends

Mirror

搜索

最新评论

阅读排行榜

评论排行榜