NetRoc's Blog

N-Tech

 

WinDbg 文档翻译----59

cc682/NetRoc

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

.cache (Set Cache Size)

.cache 命令用来设置保存从目标接收到的数据的缓冲区大小。也可以用来设置一些缓冲区和内存选项。

语法

.cache Size 
.cache Option 
.cache 

参数

Size

内核调试的缓冲区大小,以KB为单位。如果Size是0,则禁用缓存。该命令的输出以字节为单位显示缓存大小。 (默认大小是1000 KB。)

Option

可以是下面的选项之一:

hold

禁用自动缓存刷新。

unhold

关闭hold 选项(这是默认设置。)

decodeptes

所有过渡页表入口(transition page table entries (PTEs))都会被暗中解码。 (这是默认设置。)

nodecodeptes

关闭decodeptes 选项

forcedecodeptes

所有虚拟地址在访问前都要先转换为物理地址。该选项也会造成缓存被禁用。除非只关心内核模式内存,否则使用forcedecodeuser要更有用些。

forcedecodeuser

所有的用户模式虚拟地址在访问前都被转换为物理地址。该选项会造成缓存被禁用。

Note  注意,在进行活动调试时,使用.thread (Set Register Context).context (Set User-Mode Address Context).process (Set Process Context)!session之前,必须先激活forcedecodeuser (或者forcedecodeptes)。如果.thread.process 带有/p选项,则会自动设置forcedecodeuser 选项。在很多其它情况下,需要显式使用.cache forcedecodeuser命令。

noforcedecodeptes

关闭forcedecodeptesforcedecodeuser 选项(这是默认设置。)

flushall

删除整个虚拟内存缓存入口。

flushu

在缓存中删除所有有错误的区域的入口,以及用户模式入口。

flush Address

删除从Address 开始的4096字节缓存块。

环境

模式

仅内核模式

目标

仅活动调试

平台

所有

 

注释

如果.cache不带任何参数,则显示当前缓存大小、状态和选项。

.cache forcedecodeuser.cache forcedecodeptes 选项仅持续到目标机还中断在调试器中时。如果对目标进行单步或者执行,则noforcedecodeptes 状态又会开始起作用。这可以避免调试器妨碍执行或重起。

.call (Call Function)

.call 命令使得目标进程执行一个函数。

语法

.call [/vFunction( Arguments ) 
.call /c 
.call /C 

参数

/v

显示该call和参数的详细信息。

Function

指定要调用的函数。这可以是函数名(最好带有模块名),或者值等于函数地址的任何表达式。如果需要调用构造函数或析构函数,则必须提供地址 — 或者使用C++表达式来为操作符的名字语法求值 (查看 数值表达式语法获取详细信息)。

Arguments

指定传递给函数的参数。如果调用一个方法,第一个参数必须是this,并且所有其它参数跟在后面。参数之间用逗号分开并且要符合常规的参数语法。可以支持不定个数的参数。参数中的表达式使用C++表达式求值器进行求值,查看C++ 数值和操作符获取详细信息。 不能使用字符串作为参数,但是可以使用字符串指针,或目标进程可以访问的其它任何内存。

/c

清除当前线程的任何已存在的call。

/C

清除当前线程的任何已存在的call ,并且将当前线程的上下文重置为保存的上一层call的上下文。

环境

模式

仅用户模式

目标

仅活动调试

平台

仅x86和x64

 

注释

指定函数是被当前进程的当前线程调用的。

只支持 cdeclstdcallfastcallthiscall 调用约定。不能使用该方法调用托管代码。

使用.call 之后,调试器会刷新堆栈,将指令指针修改为指向被调用函数的开头,调用该函数,然后停止。使用g (Go)来恢复执行或者~. g 来执行刚才进行调用的线程。

函数返回时,会发生一次中断并且调试器显示函数的返回值。返回值也会保存在可以得到返回值类型的 $callret 伪寄存器中。

如果使用CTRL+C 或CTRL+BREAK来中断到目标中,当前线程是一个用来处理中断(breakin)的附加线程。 如果这时候使用.call命令,则会使用该额外线程来调用函数。

如果遇到了之前定义的断点,线程不会进行额外的中断。如果在用户模式断点中断时使用.call ,可以使用g来执行整个进程或者 ~. G来执行当前线程。使用g可能会造成程序行为的错误,因为已经将某个线程转移来执行新的函数了。另一方面,该线程还是保留它的锁和其他属性,所以~. g 也可能遇到死锁。

安全的使用.call的方法是,将断点设置到可以安全调用指定函数的代码位置。遇到该断点时,如果需要就可以使用.call来执行函数。如果在不能正常调用该函数的地方使用.call,则可能造成死锁或目标执行错误。

在代码中包含一些只由调试器调用而不由代码来调用的额外函数可能会很有用。例如,可以添加一些函数用来检查代码的当前状态、环境并且将这些状态信息保存到已知的内存位置。注意不能优化代码,否则这些函数会被编译器去除。这种技术应该当作最后的手段,因为如果程序崩溃,.call在调试dump文件时是不能使用的。

.call /c.call /C 命令应该仅在.call 失败,或者进入g命令前改变主意时使用。它们不能随便使用,因为放弃未完成的call会造成目标状态被破坏。

.chain (List Debugger Extensions)

.chain 按照默认的搜索顺序列举所有已加载的调试器扩展。

语法

.chain 

环境

模式

用户模式、内核模式

目标

活动目标、崩溃转储

平台

所有

附加信息

关于加载、卸载和控制调试器扩展的详细信息,查看加载调试器扩展DLL。关于执行扩展命令和默认搜索顺序的描述,查看使用调试器扩展命令

.childdbg (Debug Child Processes)

.childdbg命令控制对子进程的调试。

语法

.childdbg 0 
.childdbg 1 
.childdbg 

参数

0

阻止调试器调试子进程。

1

使得调试器对子进程进行调试。

环境

该命令仅在Windows XP和之后的系统中支持。

模式

仅用户模式

目标

仅活动调试

平台

仅x86、x64和Itanium

注释

子进程是由原始的目标进程启动的进程。

如果不带参数.childdbg 会显示子进程调试的当前状态。

附加信息

详细信息和控制对子进程调试的其他方法,查看创建新进程 (用户模式)

.clients (List Debugging Clients)

.clients 命令列举所有当前连接到调试会话中的调试客户端。

语法

.clients 

环境

模式

用户模式、内核模式

目标

活动目标、崩溃转储

平台

所有

附加信息

详细信息和在进行通过调试器的远程调试时可使用的其它命令,查看控制远程调试会话

.closehandle (Close Handle)

.closehandle 命令关闭目标程序拥有的句柄。

语法

.closehandle Handle 
.closehandle -a 

参数

Handle

指定要关闭的句柄。

-a

使得目标进程的所有句柄都被关闭。

环境

模式

仅用户模式

目标

仅活动目标

平台

所有

注释

可以使用!handle扩展命令来显示存在的句柄。

.cls (Clear Screen)

.cls命令清空调试器命令窗口中的显示。

语法

.cls 

环境

模式

用户模式、内核模式

目标

活动目标、崩溃转储

平台

所有

.context (Set User-Mode Address Context)

.context 命令用于指定用户模式地址上下文使用哪个进程的页目录,或者显示当前的用户模式地址上下文。

语法

.context [PageDirectoryBase

参数

PageDirectoryBase

指定需要的进程的页目录的基地址。用户模式地址上下文将设置为该页目录。如果PageDirectoryBase 是0,用户模式地址上下文的页目录将设置为当前系统状态。如果省略PageDirectoryBase,则显示当前的用户模式地址上下文。

环境

模式

仅内核模式

目标

活动目标、崩溃转储

平台

所有

注释

一般来说,进行内核调试时,能看到的唯一的用户模式地址空间是关联到当前进程的那个。

.context命令让内核调试器将指定的页目录作为用户模式地址上下文。该命令执行后,调试器就可以访问该虚拟地址空间了。所有用户模式内存地址都将会使用该页表来进行转换。这使得可以读些这些内存。

.process (Set Process Context) 命令具有类似的作用。但是,.context 命令将用户模式地址上下文设置为指定的页目录,而.process 命令会将进程上下文设置为指定进程。在x86处理器上,这两个命令本质上效果是一样的。但是在Itanium处理器上,单个进程可能有不止一个页目录。这种情况下,.process c命令要更加有用,因为它会将对页目录的所有访问关联到某个进程。查看进程上下文获得详细信息。

如果正在进行活动调试,除了.context 命令之外还需要执行一个 .cache forcedecodeuser 命令。这会强制调试器查找需要的内存空间的物理地址。 (这可能很慢,因为会经常造成大量数据必须通过调试电缆传输。)

如果在进行崩溃转储的调试,不需要使用.cache 命令。但是,不能访问当崩溃发生时任何被页换出的用户模式进程的虚拟地址空间。

这里有一个例子。使用!process 扩展命令来查找指定进程的页目录基址:

kd> !process 0 0
**** NT ACTIVE PROCESS DUMP ****
PROCESS fe5039e0  SessionId: 0  Cid: 0008    Peb: 00000000  ParentCid: 0000
    DirBase: 00030000  ObjectTable: fe529b68  TableSize:  50.
    Image: System

.....

PROCESS fe3c0d60  SessionId: 0  Cid: 0208    Peb: 7ffdf000  ParentCid: 00d4
    DirBase: 0011f000  ObjectTable: fe3d0f48  TableSize:  30.
    Image: regsvc.exe

现在使用.context命令切换到该页目录基址。

kd> .context 0011f000

这样就可以通过各种方式来查看内存空间了。例如,这是 !peb 扩展命令的输出:三

kd> !peb
PEB at 7FFDF000
    InheritedAddressSpace:    No
    ReadImageFileExecOptions: No
    BeingDebugged:            No
    ImageBaseAddress:         01000000
    Ldr.Initialized: Yes
    Ldr.InInitializationOrderModuleList: 71f40 . 77f68
    Ldr.InLoadOrderModuleList: 71ec0 . 77f58
    Ldr.InMemoryOrderModuleList: 71ec8 . 77f60
        01000000 C:\WINNT\system32\regsvc.exe
        77F80000 C:\WINNT\System32\ntdll.dll
        77DB0000 C:\WINNT\system32\ADVAPI32.dll
        77E80000 C:\WINNT\system32\KERNEL32.DLL
        77D40000 C:\WINNT\system32\RPCRT4.DLL
        77BE0000 C:\WINNT\system32\secur32.dll
    SubSystemData:     0
    ProcessHeap:       70000
    ProcessParameters: 20000
        WindowTitle:  'C:\WINNT\system32\regsvc.exe'
        ImageFile:    'C:\WINNT\system32\regsvc.exe'
        CommandLine:  'C:\WINNT\system32\regsvc.exe'
        DllPath:     'C:\WINNT\system32;.;C:\WINNT\System32;C:\WINNT\system;C:\WINNT;C:\WINNT\system32;C:\WINNT;C:\WINNT\System32\Wbem;C:\PROGRA~1\COMMON~1\AUTODE~1'
        Environment:  0x10000

附加信息

关于用户模式地址上下文和其他上下文设置的更多信息,查看切换上下文

.cordll (Control CLR Debugging)

.cordll命令用于控制托管代码的调试和Microsoft .NET公共语言运行时 (CLR)。

语法

.cordll [Options

参数

Options

可以是下面这些选项中的一个或多个:

-l

加载CLR调试模块。

-u

卸载CLR调试模块。

-e

启用CLR调试。

-d

禁用CLR调试。

-D

禁用CLR调试并卸载CLR调试模块。

-N

重新加载CLR调试模块。

-lp Path

指定CLR调试模块的目录路径。

-se

启用CLR调试模块的短名称 Mscordacwks.dll

-sd

禁止使用CLR调试模块的短名称Mscordacwks.dll。相反,调试器使用CLR调试模块的长名称Mscordacwks_<spec>.dll。 关闭使用短名称可以在担心匹配错误时避免本地CLR被使用到。

-ve

打开CLR加载的详细输出。

-vd

关闭CLR模块加载的详细输出。

环境

模式

用户模式、内核模式

目标

活动目标、崩溃转储

平台

所有

注释

.cordll 命令在内核调试时也支持。但是,如果需要的内存被页换出,它可能不能工作。

.crash (Force System Crash)

.crash 命令使得目标机产生一次错误检查。

语法

.crash 

环境

模式

仅内核模式

目标

仅活动调试

平台

所有

注释

该命令使得目标机立即崩溃。

如果启用了崩溃转储,则会生成一个内核模式dump文件。查看创建内核模式Dump文件获取详细信息。

附加信息

相关命令的概述和系统崩溃后的选项的说明,查看崩溃和重起目标机

.create (Create Process)

.create命令创建一个新的目标进程。

语法

.create [-premote RemoteOptions] [-fCommandLine 

参数

RemoteOptions

指定进程服务器要附加到的进程。该选项和-premote 选项中的一样。查看激活灵巧客户端获得详细信息。

-f

除了被创建的新进程之外,冻结所有目标程序中的所有线程。这些线程在新进程发生异常之前都会保持冻结状态。注意初始断点也是一个异常。每个线程都可以通过~u (Unfreeze Thread) 命令来解冻。

CommandLine

指定新进程的完整命令行。CommandLine 可以包含空格,而且不能用引号括起来。.create 命令之后的所有文本都被当作CommandLine的一部分,该命令后面不能跟分号和其他调试器命令。

环境

模式

仅用户模式

目标

仅活动目标

平台

所有

注释

该命令可以在CDB静止时或者已经在调试一个或多个进程时使用。WinDbg处于静止模式时不能使用。

如果命令成功,调试器会在执行下一个运行命令时创建指定进程。如果一行中使用了多次该命令,则每一个都需要一条执行命令。

多个目标进程总是一起执行的,除非它们的某些线程被冻结或挂起。

如果希望创建新进程并冻结所有以存在的目标,使用-f 选项。

如果使用了-premote选项,新进程会是一个新的系统中的一部分。详细信息,查看 调试多个目标

附加信息

详细信息和其他开始一个新进程来进行调试的方法,查看创建新进程(用户模式)

.createdir (Set Created Process Directory)

.createdir 命令控制任何通过调试器创建的进程的启动目录和句柄继承。

语法

.createdir [-i | -I] [Path

参数

-i

使得调试器创建的进程继承调试器的句柄。这是默认选项。

-I

避免调试器创建的进程继承调试器的句柄。

Path

指定由任何目标进程创建的任何子进程的启动目录。如果Path 包含目录,则必须用引号括起来。

环境

模式

仅用户模式

目标

仅活动目标

平台

所有

注释

如果.createdir 不带参数,则显示当前的启动目录和句柄继承设置。

如果没有使用过.createdir ,创建的任何进程都使用通常的默认目录作为启动目录。如果用.createdir设置了目录又想恢复成默认值,使用.createdir "" ,引号中不带任何东西。

.createdir 的设置作用于任何以.create (Create Process)创建的进程。如果没有使用Start directory文本框来覆盖设置,也作用于WinDbg的 File | Open Executable 菜单命令。

附加信息

控制该特性的其他方法和创建新进程进行调试的信息,查看创建新进程(用户模式)

.cxr (Display Context Record)

.cxr 命令显示保存在指定地址的上下文信息。也可以设置寄存器上下文。

语法

.cxr [Options] [Address

参数

Options

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

/f Size

强制上下文的大小的字节数等于Size。这在当上下文和实际的目标不匹配时有用 — 例如,当通过WOW64 调试在x64目标上使用x86上下文时。如果指定了非法的或矛盾的大小,会显示 "Unable to convert context to canonical form" 错误。

/w

将当前上下文写入内存,并显示写入的内存的地址。

Address

系统上下文记录的地址。省略该地址则不会显示任何上下文记录的信息,但是会重置寄存器上下文。

环境

模式

用户模式、内核模式

目标

活动目标、崩溃转储

平台

所有

注释

上下文记录中的信息在调试因为发生了未处理异常,并且没有精确的调用堆栈信息而停止的系统时会起到帮助作用。.cxr 命令会显示指定的上下文记录的重要寄存器。

该命令也会指示调试器使用指定的上下文记录作为寄存器上下文。该命令执行后,调试器就可以访问该线程的最重要的寄存器,以及堆栈回溯。该寄存器上下文会持续到允许目标执行或使用了另一个寄存器上下文命令 (.thread.cxr.ecxr.trap)。用户模式下,改变当前进程或当前线程也会重置寄存器上下文。查看 寄存器上下文获取详细信息。

.cxr 命令常常用来调试错误检查0x1E。更多信息和示例,查看Bug Check 0x1E (KMODE_EXCEPTION_NOT_HANDLED)。

.cxr /w 命令将上下文写入内存并显示保存的地址。如果想在该上下文上设置数据断点,可以把这个地址传递给.apply_dbp (Apply Data Breakpoint to Context)

附加信息

关于寄存器上下文和其他上下文设置的更多信息,查看改变上下文

posted on 2008-06-24 15:47 NetRoc 阅读(543) 评论(0)  编辑 收藏 引用

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

导航

统计

常用链接

留言簿(7)

随笔档案(99)

文章分类(35)

文章档案(32)

Friends

Mirror

搜索

最新评论

阅读排行榜

评论排行榜