NetRoc's Blog

N-Tech

 

WinDbg 文档翻译----52

cc682/NetRoc

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

ib, iw, id (Input from Port)

ibiwid 命令从指定端口读取和显示字节、字或双字。

语法

ib Address 
iw Address 
id Address 

参数

Address

端口的地址。

环境

模式

仅内核模式

目标

仅活动目标

平台

仅x86计算机

 

注释

Ib命令读取单个字节,iw读取一个字(WORD),id命令读取一个双字(DWORD)。

要确认读取该I/O端口不会对被读取的设备造成影响。一些设备在只读端口被读取之后就会改变状态。也不能尝试在不支持指定长度的端口上读取一个字或者双字。

参见

ob, od, ow (Output to Port)

j (Execute If - Else)

j命令根据给定表达式的值,条件执行指定命令中的一个。

语法

j Expression Command1 ; Command2 
j Expression 'Command1' ; 'Command2' 

参数

Expression

要求值得表达式。如果表达式的值是非0值,则执行Command1 。如果表达式的值为0,则执行Command2 。该表达式语法的更多信息,查看数值表达式语法

Command1

Expression 为非0值(TRUE)时要执行的命令字符串。可以通过在命令字符串两边加上单引号( ' ),并且以分号来分隔各个命令来一次使用多条命令。如果命令字符串是单条命令,单引号是可选的。

Command2

Expression 值为0(FALSE)时要执行的命令字符串。可以通过在命令字符串两边加上单引号( ' ),并且以分号来分隔各个命令来一次使用多条命令。如果命令字符串是单条命令,单引号是可选的。

环境

模式

用户模式、内核模式

目标

活动目标、崩溃转储

平台

所有

 

注释

j命令之后不能添加其他分号或其他命令。如果在Command2之后出现了分号,则后面的所有内容都被忽略。

下面的命令当MySymbol 等于0时显示eax的值,否则显示ebxecx的值。

0:000> j (MySymbol=0) 'r eax'; 'r ebx; r ecx' 

可以省略r eax两边的单引号,但是它们可以使得命令更容易阅读。如果要省略其中一条命令,可以使用未包含字符的引号或省略指定该命令的参数,如下。

0:000> j (MySymbol=0) ''; 'r ebx; r ecx' 
0:000> j (MySymbol=0)  ; 'r ebx; r ecx' 

也可以在其他命令中使用j命令。例如,可以使用j命令来创建条件断点。

0:000> bp `mysource.cpp:143` "j (poi(MyVar)>0n20) ''; 'gc' "

关于条件断点语法的更多信息,查看设置条件断点

参见

z (Execute While)

k, kb, kd, kp, kP, kv (Display Stack Backtrace)

k*命令显示给定线程的调用堆栈,以及其他相关信息。

语法

用户模式

[~Threadk[b|p|P|v] [n] [f] [L] [FrameCount
[~Threadk[b|p|P|v] [n] [f] [L= BasePtr [FrameCount
[~Threadk[b|p|P|v] [n] [f] [L= BasePtr StackPtr InstructionPtr 
[~Threadkd [WordCount

内核模式

[Processork[b|p|P|v] [n] [f] [L] [FrameCount
[Processork[b|p|P|v] [n] [f] [L= BasePtr [FrameCount
[Processork[b|p|P|v] [n] [f] [L= BasePtr StackPtr InstructionPtr 
[Processorkd [WordCount

参数

Thread

指定要显示调用堆栈的线程。如果省略该参数,则显示当前线程的堆栈。线程语法的更多信息,查看线程语法。仅有用户模式可以指定线程。

Processor

指定要显示调用堆栈的处理器。处理器语法的更多信息,查看多处理器语法。仅在内核模式下可以指定处理器。

b

显示传递给堆栈回溯中的每个函数的前三个参数。

p

显示传递给堆栈回溯中的每个函数的所有参数。参数列表包含参数的数据类型、名字和值。P命令是区分大小写的。使用该参数需要完整符号信息

P

p参数一样,显示传递给堆栈回溯中的每个函数的所有参数。但是,使用P ,函数参数在第二行中显示,而不是作为数据的结尾在行末显示。

v

显示帧指针省略信息(FPO)。在x86处理器上,还显示调用约定(即__stcdall、__cdecl等等 — 译者注)的信息。

n

显示帧号码。

f

显示临近的帧之间的距离。该距离是在实际堆栈中分隔两个帧的字节数。

L

隐藏源码行信息。L区分大小写。

FrameCount

指定要显示的堆栈帧号码。如果没有使用n (Set Number Base)命令改变基数的话,需要使用16进制数。如果没有使用.kframes (Set Stack Length)命令改变的话,它的默认值是20(0x14)。

BasePtr

指定堆栈回溯的基指针。BasePtr 参数仅在命令后有等号(=)时可用。在x86处理器上,BasePtr 之后可以添加一个参数(被当作FrameCount 参数)或两个参数(被当作StackPtrInstructionPtr 参数)。

StackPtr

(仅x86处理器) 指定用于堆栈回溯的堆栈指针。如果省略掉StackPtrInstructionPtr ,命令会使用esp寄存器中指定的堆栈指针和eip中指定的指令指针。

InstructionPtr

(仅x86处理器) 指定用于堆栈回溯的指令指针。如果省略掉StackPtrInstructionPtr ,命令会使用esp寄存器中指定的堆栈指针和eip中指定的指令指针。

WordCount

指定堆栈中要转储的DWORD_PTR 值的个数。如果没有使用.kframes (Set Stack Length)命令修改的话,默认值为20 (0x14)。

环境

模式

用户模式、内核模式

目标

活动目标、崩溃转储

平台

所有

 

注释

使用kkbkpkPkv 命令时,堆栈回溯按照表格形式显示。如果启用了行号,源码模块和行号也会显示出来。

堆栈回溯中包含堆栈帧的基指针、返回地址和函数名。

如果使用kpkP 命令,堆栈回溯中每个函数的所有参数都会显示出来。参数列表包含每个参数的数据类型、名字和值。

该命令的执行可能很慢。例如,当MyFunction1 调用MyFunction2时,调试器必须获得MyFunction1 的完整符号信息来显示传递过去的参数。该命令不能完整显示在公有符号中未暴露的Microsoft Windows内部例程。

如果使用kbkv命令,则显示传递给每个函数的前三个参数。如果使用kv,FPO数据也会显示出来。

在x86处理器上,kv命令也会显示调用约定的信息。

在基于Itanium的处理器上,kv命令也会使得非易失性寄存器(nonvolatile registers)显示出来。该信息使得可以回溯寄存器堆栈。

使用kv命令时,FPO信息按如下格式添加到行末。

FPO文本

含义

FPO: [non-Fpo]

帧中没有FPO数据。

FPO: [N1,N2,N3]

N1是参数的总数。

N2 是局部变量的DWORD值个数。

N3是保存了的寄存器的个数。

FPO: [N1,N2] TrapFrame @ Address

N1 是参数总数。

N2是局部变量的DWORD值个数。

Address 是陷阱帧的地址。

FPO: TaskGate Segment:0

Segment 是任务门的段选择子。

FPO: [EBP 0xBase]

Base 是帧的基指针。

 

kd命令显示原始堆栈数据。每个DWORD值都显示在单独的行上。这些行中的符号信息也和关联的符号显示在一起。这种格式比其他k*包含更详细的列表。kd命令和使用dds (Display Memory)命令并将堆栈地址作为参数一样。

如果想从不是当前堆栈位置开始堆栈回溯,可以使用BasePtr参数来指定基指针的值。在x86处理器上指定基指针需要指定BasePtrStackPtrInstructionPtr。这些参数需要和堆栈回溯对应的ebpespeip值相等。如果指定了BasePtr 而省略StackPtrInstructionPtr,当存在FPO帧时可能获得错误的结果。

如果在某个函数开头使用k命令(在函数内部的预处理执行之前),会得到错误的结果。调试器使用帧寄存器来计算回溯,而该寄存器在预处理执行之前都不会被正确设置。

在用户模式下,堆栈回溯基于当前线程的栈。关于线程的更多信息,查看控制进程和线程

在内核模式下,堆栈跟踪基于当前寄存器上下文。可以设置寄存器上下文来匹配指定线程、上下文记录或陷阱帧。

附加信息

关于堆栈回溯的更多信息和其它显示调用堆栈的方法,查看查看调用堆栈。关于寄存器上下文和其他上下文设置的更多信息,查看改变上下文

l+, l- (Set Source Options)

l+l- 命令用来控制源码显示和程序单步选项的设置源码行选项。

语法

l+Option 
l-Option 
l{+|-

参数

+ or

指定哪个选项要打开(加号 [+])或关闭 (减号 [–])。

Option

下面的选项之一。这些选项必须是小写字母。

l

在命令提示符显示源码行号。可以通过l-ls.prompt_allow -src来禁止源码行显示。如果要显示出来,必须通过两种方式启用源码行显示。

o

单步执行代码时隐藏所有信息(除了源码行和行号)。(要o选项起效,s选项也必须激活。)

s

在命令提示符显示源码行和行号。

t

开始源码模式。如果没有设置该模式,调试器处于汇编模式下。

*

打开或关闭所有选项。

环境

模式

用户模式、内核模式

目标

活动目标、崩溃转储

平台

所有

 

注释

如果省略Option,则会显示先前的设置选项。这种情况下, l+l-命令作用相同。但是,要l命令工作,必须包含加号(+)或减号(–)。

每次执行该命令只能包含一个Option。如果列出多余一个选项,只有第一个会被识别。但是,通过重复执行该命令,可以打开或关闭任意多个选项。(即不能使用l+lst,而应该使用l+l; l+s; l+t来达到希望的效果。)

指定s选项时,如果没有指定l选项,源码行和行号在单步执行时会显示出来。如果没有设置s选项,则o选项无效。

如果没有使用.lines (Toggle Source Line Support)命令或-lines命令行选项来启用源码行加载,则源码行选项是无效的。默认情况下,如果没有使用这些命令,WinDbg打开源码行支持,而CDB关闭。

附加信息

源码调试和相关命令的更多信息,查看源码模式调试。汇编模式调试的更多信息和相关命令,查看汇编模式调试

ld (Load Symbols)

ld 命令加载指定模块的符号并刷新所有模块信息。

语法

ld ModuleName [/f FileName]

参数

ModuleName

指定要加载符号的模块名。ModuleName 可以包含各种通配符和修饰符。

/f FileName

改变选择用来匹配的名称。默认情况下使用模块名来匹配,但是当使用/f时,使用文件名来匹配而不是模块名。FileName 可以包含各种通配符合修饰符。关于通配符和修饰符的更多信息,查看字符串通配符语法

环境

模式

用户模式、内核模式

目标

活动目标、崩溃转储

平台

所有

 

注释

调试器的默认行为是延迟符号加载(lazy symbol loading)(也称为deferred symbol loading)。这意味着符号仅在被需要的时候才实际加载。

ld命令,换句话说,会强制指定模块的符号被加载。

附加信息

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

lm (List Loaded Modules)

lm命令显示指定的已加载模块。输出中包含模块状态和路径。

语法

lm Options [a Address] [m Pattern | M Pattern

参数

Options

下面这些选项的任意组合:

o

仅显示已加载模块。

l

仅显示已加载符号信息的模块。

v

显示详细信息。输出中包含符号文件名、映像文件名、校验和信息、时间戳和该模块是否是托管代码(CLR)的信息。如果相关的头丢失或页换出,则该信息不能显示出来。

u

(仅内核模式) 仅显示用户模式符号信息。

k

(Kernel mode only) 仅显示内核模式符号信息。

e

仅显示有符号问题的模块。包括没有符号和符号状态为CT#MExport的模块。关于这些符号的更多信息,查看符号状态缩写

c

显示校验和数据。

1m

减少输出以使得只包含模块的名字。当使用.foreach 关键字将该命令的输出通过管道传输给另一个命令作为输入时很有用。

sm

输出按模块名排序而不是按起始地址。

另外,还可以包含下面这些选项中的一个。如果一个都没有包含,则显示中包括符号文件名。

i

显示映像文件名。

f

显示完整映像路径。(如果没有使用.reload -s 命令,则该路径总是和初始加载信息中显示的匹配。) 当使用f时,符号类型信息不会显示出来。

n

显示映像名。使用n时,符号类型信息不会显示。

p

显示映射的映像名。使用p时,符号类型信息不会显示。

t

显示文件的时间戳。使用t时,符号类型信息不会显示。

a Address

指定包含在模块中的一个地址。只有包含该地址的模块会被显示出来。如果Address是一个表达式,它必须用圆括号括起来。

m Pattern

指定模块名必须匹配的模板。Pattern可以包含各种通配符和修饰符。关于语法的更多信息,查看字符串通配符语法

注意  大多数情况下,模块名是不包含扩展名的文件名。例如,如果要显示Flpydisk.sys 驱动的信息,使用lm mflpydisk命令,而不是lm mflpydisk.sys。有些时候,模块名和文件名有显著的不同。更多信息,查看可执行映像路径

M Pattern

指定映像路径必须匹配的模板。Pattern可以包含各种通配符和修饰符。关于语法的更多信息,查看字符串通配符语法

环境

模式

用户模式、内核模式

目标

活动目标、崩溃转储

平台

所有

 

注释

lm 命令列出所有模块和每个模块的符号状态。

Microsoft Windows Server 2003和之后版本的Windows为用户模式进程维护一个 已卸载模块列表(unloaded module list)。 调试用户模式进程或dump文件时,lm命令也会显示这些已卸载模块。

该命令显示几个列或字段,每个都有不同的标题。某些标题有特定含义:

  • module name一般是没有扩展名的文件名。有些情况下,模块名和文件名有显著不同。更多信息,查看可执行映像路径
  • 符号类型信息紧跟在模块名后。这一列没有标明。关于各种状态值得信息,查看符号状态缩写。如果有已加载的符号,符号文件名会跟在这一列后。
  • 模块的首地址显示在start列。模块末尾之后的第一个地址显示在end。例如,如果start 是"faab4000" 并且end 是"faab8000",则模块位于从0xFAAB4000 到0xFAAB7FFF的地址。
  • lmvIimage path 列显示包含扩展名的可执行文件名。一般来说用户模式下包含完整路径而内核模式下不会包含。
  • lmv: 如果不存在Microsoft CodeView 符号,则loaded symbol image file 值和映像名相同。如果在Microsoft Windows NT 4.0上存在CodeView符号,则该值为.dbg文件的完整路径。
  • lmvmapped memory image file 值一般没有使用。如果调试器映射了映像文件(例如,进行minidump调试时),它的值是被映射的映像的名字。

    下面的是lm命令对Windows Server 2003目标机使用的示例。该示例包含ms* 选项,所以只有以"s"开头的模块会显示出来。

    kd> lm m s*
    start    end        module name
    f9f73000 f9f7fd80   sysaudio     (deferred)                 
    fa04b000 fa09b400   srv          (deferred)                 
    faab7000 faac8500   sr           (deferred)                 
    facac000 facbae00   serial       (deferred)                 
    fb008000 fb00ba80   serenum      e:\mysymbols\SereEnum.pdb\.......
    fb24f000 fb250000   swenum       (deferred)                 

    Unloaded modules:
    f9f53000 f9f61000   swmidi.sys
    fb0ae000 fb0b0000   splitter.sys
    fb040000 fb043000   Sfloppy.SYS

    下面使用没有任何选项的lm一次和带sm选项的命令一次。比较两个例子的排序。

    Example 1:

    0:000> lm
    start    end        module name
    01000000 0100d000   stst       (deferred)
    77c10000 77c68000   msvcrt     (deferred)
    77dd0000 77e6b000   ADVAPI32   (deferred)
    77e70000 77f01000   RPCRT4     (deferred)
    7c800000 7c8f4000   kernel32   (deferred)
    7c900000 7c9b0000   ntdll      (private pdb symbols) c:\db20sym\ntdll.pdb

    Example 2:

    0:000> lmsm
    start    end        module name
    77dd0000 77e6b000   ADVAPI32   (deferred)
    7c800000 7c8f4000   kernel32   (deferred)
    77c10000 77c68000   msvcrt     (deferred)
    7c900000 7c9b0000   ntdll      (private pdb symbols)  c:\db20sym\ntdll.pdb
    77e70000 77f01000   RPCRT4     (deferred)
    01000000 0100d000   stst       (deferred)

ln (List Nearest Symbols)

ln 命令显示给定地址处的或者最近的符号。

语法

ln Address 

参数

Address

指定要调试器开始搜索符号的地址。会显示出Address 前后最近的一个符号。该语法的更多信息,查看地址和地址区域语法

环境

模式

用户模式、内核模式

目标

活动目标、崩溃转储

平台

所有

 

注释

可以使用ln命令来帮助确认指针指向的内容。该命令在通过已破坏的堆栈查找哪段程序进行的调用时也很有用。

如果源码行信息可用,ln的显示中也包含源文件名和行号信息。

如果使用源码服务器ln 命令显示的是和源码服务器关联的信息。

ls, lsa (List Source Lines)

lslsa 命令显示从当前源码文件和当前源码行号开始的一系列代码行。

语法

ls [.] [first] [, count
lsa [.address [, first [, count]] 

参数

.

使得该命令查找调试器引擎或.srcpath (Set Source Path)命令使用的源文件。如果不包含点号 (.),s使用最近一次 lsf (Load Source File)命令加载的文件。

address

指定源码显示开始的地址。该语法的更多信息,查看地址和地址区域语法

first

指定要显示的第一行。默认值为当前行。

count

指定要显示的行数。如果没有使用lsp -a命令修改的话,默认值是20 (0x14)。

环境

模式

用户模式、内核模式

目标

活动目标、崩溃转储

平台

所有

 

注释

运行lslsa命令之后,当前行变成显示的最后一行的下一行。Lslsalsc 命令会用到当前行。

参见

lsc (List Current Source)lsf, lsf- (Load or Unload Source File)

lsc (List Current Source)

lsc 命令显示当前源文件和行号。

语法

lsc 

环境

模式

用户模式、内核模式

目标

活动目标、崩溃转储

平台

所有

 

参见

ls, lsa (List Source Lines)lsf, lsf- (Load or Unload Source File)

lse (Launch Source Editor)

lse命令为当前源文件打开一个编辑器。

语法

lse 

环境

模式

用户模式、内核模式

目标

活动目标、崩溃转储

平台

所有

 

注释

lse为当前源文件打开一个编辑器。该命令和在WinDbg的Source窗口快捷菜单中点击Edit this file一样。

编辑器在目标运行的计算机上打开,所以不能在远程客户端上使用lse命令。

WinDiff 编辑器的注册表信息或WINDBG_INVOKE_EDITOR 环境变量的值决定了哪个编辑器被打开。例如,假设WINDBG_INVOKE_EDITOR 的值如下。

c:\my\path\myeditor.exe -file %f -line %l

这个值指示Myeditor.exe 打开当前源文件的基于1的行号。%l 选项指示行号是从1算起的,%f指示使用当前源文件。也可以包含%L来指定行号从0算起或者%p来指示使用当前源文件。

lsf, lsf- (Load or Unload Source File)

lsflsf- 命令加载或卸载一个源文件。

语法

lsf Filename 
lsf- Filename 

参数

Filename

指定要加载或卸载地文件。如果该文件不在打开调试器的目录中,则必须使用绝对或相对路径。文件名必须符合Microsoft Windows文件名规范。

环境

模式

用户模式、内核模式

目标

活动目标、崩溃转储

平台

所有

 

注释

lsf命令加载源文件。

lsf– 命令卸载源文件。可以使用该命令来卸载之前使用lsf加载或自动加载的源文件。不能使用lsf–来卸载通过WinDbg的File | Open Source File命令或WinDbg工作空间加载的文件。

在CDB或KD中,可以在调试器命令窗口中查看源文件。在WinDbg中,源文件在新的Source窗口中加载。

关于源文件、源码路径的更多信息和其他加载源文件的方法,查看源码路径

查看

ls, lsa (List Source Lines)lsc (List Current Source)

lsp (Set Number of Source Lines)

lsp命令控制单步执行、执行代码或使用lslsa 命令时多个源码行如何显示。

语法

lsp [-aLeadingLines TrailingLines 
lsp [-aTotalLines 
lsp [-a

参数

-a

设置或显示lslsa命令显示的代码行数。如果省略-alsp 设置或显示单步和执行代码时显示的代码行数。

LeadingLines

指定要显示的当前行之前的代码行数。

TrailingLines

指定要显示的在当前行之后的代码行数。

TotalLines

指定要显示的总行数。该数字被前部和末尾行数平分。(如果该数字是奇数,则会显示更多的尾部的行。)

环境

模式

用户模式、内核模式

目标

活动目标、崩溃转储

平台

所有

 

注释

使用lsp命令而不带参数时, 显示当前在单步执行时使用的前导行数(leading line)和末尾行数(trailing line)。将该命令和-a参数一起使用时,lsp显示单步和lslsa 命令显示的行数。

单步执行程序或在程序执行时中断,前一个lsp命令决定要显示的前导行数和末尾行数。使用lsa时,前一个lsp -a 命令决定要显示的前导和末尾行数。使用ls时,所有行都在单个块中显示,所以lsp -a 命令决定要显示的总行数。

附加信息

源码调试的更多信息和相关命令,查看源码模式调试

posted on 2008-06-17 16:07 NetRoc 阅读(1108) 评论(0)  编辑 收藏 引用

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

导航

统计

常用链接

留言簿(7)

随笔档案(99)

文章分类(35)

文章档案(32)

Friends

Mirror

搜索

最新评论

阅读排行榜

评论排行榜