NetRoc's Blog

N-Tech

 

WinDbg 文档翻译----44

     摘要: cc682/NetRoc/小喂 http://netroc682.spaces.live.com/ 数值表达式语法部分直接使用了小喂翻译的文档。新版本WinDbg文档中更新过的部分作了一些修改。非常感谢小喂的共享。他的主页在 http://www.ztssoft.com/   调试器命令 本节包含以下主题: 语法规则 命令关键字 命令 元命令 控...  阅读全文

posted @ 2008-06-04 14:39 NetRoc 阅读(1049) | 评论 (0)编辑 收藏

WinDbg 文档翻译----43

cc682/NetRoc

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

环境变量

本参考节包含:

常规环境变量

内核模式环境变量

内核模式调试对环境变量的使用信息,查看主控机的软件配置。用户模式对环境变量的使用信息,查看基本的用户模式设置

常规环境变量

下表列出了可以同时在用户模式调试和内核模式调试使用的环境变量。

变量

意义

_NT_DEBUGGER_EXTENSION_PATH = Path

指定调试器首先用来搜索扩展DLL的路径。Path可以包含后跟一个冒号(:)的驱动器符。用分号分隔多个目录(;)。详细信息查看加载调试器扩展DLL

_NT_EXECUTABLE_IMAGE_PATH = Path

指定包含二进制可执行文件的路径。Path可以包含后跟一个冒号(:)的驱动器符。用分号分隔多个目录(;)。详细信息和其他可以设置该路径的方法,查看可执行映像路径

_NT_SOURCE_PATH = Path

指定包含调试目标的源代码的路径。Path可以包含后跟一个冒号(:)的驱动器符。用分号分隔多个目录(;)。详细信息和其他可以设置该路径的方法,查看源码路径

_NT_SYMBOL_PATH = Path

指定包含符号文件的目录树的根目录。Path可以包含后跟一个冒号(:)的驱动器符。用分号分隔多个目录(;)。详细信息和其他可以设置该路径的方法,查看符号路径

_NT_ALT_SYMBOL_PATH = Path

指定一个在_NT_SYMBOL_PATH 之前进行搜索的预备的符号路径。这对于保存私有版本的符号文件很有用。Path可以包含后跟一个冒号(:)的驱动器符。用分号分隔多个目录(;)。详细信息查看符号路径

_NT_SYMBOL_PROXY = Proxy:Port

指定SymSrv 使用的代理服务器。详细信息,查看防火墙和代理服务器

_NT_DEBUG_HISTORY_SIZE = Number

指定远程调试时可以访问的历史命令的数量。由于命令的长度相差很大,这个行数可能和实际情况并不完全符合。详细信息和其他改变该数字的方法,查看使用调试器命令

_NT_DEBUG_LOG_FILE_OPEN = Filename

(仅CDB和KD) 指定调试器用来记录输出的日志文件。详细信息和其他记录日志文件的方法,查看记录日志文件

_NT_DEBUG_LOG_FILE_APPEND = Filename

(仅CDB和KD) 指定调试器用来添加输出的日志文件。详细信息和将信息添加到日志文件末尾的其他方法,查看记录日志文件

_NT_EXPR_EVAL = {masm | c++}

指定默认的表达式求值器。如果指定masm,则使用MASM表达式语法。如果指定c++,则使用C++表达式语法。默认使用的是MASM表达式。查看表达式求值获取详细信息。

_NO_DEBUG_HEAP

(Windows XP和之后的版本) 指定用户模式调试时不使用调试堆。查看创建的进程的行为获取详细信息。

 

内核模式环境变量

下表列出了只能在内核模式调试时使用的环境变量。

变量

意义

_NT_DEBUG_PORT = ComPort

指定内核调试时使用COM端口。详细信息,查看选择内核调试设置

_NT_DEBUG_BAUD_RATE = BaudRate

指定使用COM端口连接时的波特率。详细信息,查看选择内核调试设置

_NT_DEBUG_BUS = 1394

指定内核调试使用1394电缆连接。

_NT_DEBUG_1394_CHANNEL = 1394Channel

指定1394内核连接使用的频道。详细信息,查看选择内核调试设置

_NT_DEBUG_1394_SYMLINK = Protocol

指定1394内核连接使用的连接协议。详细信息,查看选择内核调试设置

KDQUIET =Anything

如果定义了KDQUIET,调试器将在安静模式(quiet mode)运行。安静模式有下面三种特殊的效果:

1. 每次加载或卸载扩展DLL时,调试器不会显示信息。

2. r (Registers)命令语法中不再需要等号。

3. 调试器中断目标机时不再显示警告信息。

安静模式可以使用sq (Set Quiet Mode)命令来控制。

_NT_DEBUG_CACHE_SIZE
= Size

指定最大的内核调试缓冲区大小,以字节为单位。这个缓冲区保存主控机从串口连接接收到数据。默认值为1,024,000。

_NT_DEBUG_OPTIONS = Option

指定下面的两个值之一:

NOEXTWARNING使得调试器在找不到扩展命令时不输出警告信息。

NOVERSIONCHECK使得调试器不检查调试器扩展的版本。



这些选项可以使用so (Set Kernel Options)命令来更改或显示。

_NT_KD_FILES = MapFile

指定驱动替换映射文件。详细信息和控制驱动替换的其他方法,查看映射驱动文件

posted @ 2008-06-04 10:29 NetRoc 阅读(409) | 评论 (0)编辑 收藏

WinDbg 文档翻译----42

cc682/NetRoc

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

DbgSrv命令行选项

DbgSrv命令行使用如下语法。

dbgsrv -t ServerTransport [-x

dbgsrv -t ServerTransport [-sifeo image.ext-c[sAppCmdLine 

dbgsrv -? 

所有选项都是区分大小写的。

参数

-t ServerTransport

指定传输协议。完整的可用协议列表和每种情况下ServerTransport 的语法,查看激活进程服务器

-x

使得剩余的命令行被忽略。该选项当从可能在命令行中添加一些不需要的字符的程序启动DbgSrv时有用。

-sifeo Executable

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

-c

让DbgSrv创建一个新进程。这和从调试器创建新进程类似,但是该进程被创建时并没有被调试。要调试这个进程,需要启动CDB或WinDbg并使用-premote 选项通过进程服务器附加上去。

s

使得新创建的进程立即挂起。当使用CDB或WinDbg连接到该进程时,可以使用-pr命令行选项或~*m命令来恢复该进程的执行。

AppCmdLine

指定要创建的进程的完整命令行。AppCmdLine 可以是Unicode或ASCII字符串并且可以包含任何可打印字符。所有出现在-c[s]参数之后的文本都会当作AppCmdLine

-?

显示一个DbgSrv命令行帮助文本的信息框。

关于DbgSrv的使用,查看进程服务器(用户模式)

KdSrv命令行选项

KdSrv命令行使用如下语法。

kdsrv -t ServerTransport 

参数

-t ServerTransport

指定传输协议。完整的可用协议列表和每种情况下ServerTransport 的语法,查看激活KD连接服务器

如果输入kdsrv不带任何参数,会出现一个帮助文本的消息框。

关于KdSrv的使用的更多信息,查看KD连接服务器(内核模式)

DbEngPrx命令行选项

DbEngPrx命令行选项使用如下语法。

dbengprx [-p-c ClientTransport -s ServerTransport 

dbengprx -? 

参数

-p

使得即使所有连接都丢失了,DbEngPrx仍然继续存在。

-c ClientTransport

指定用来连接到服务器的协议设置。使用的协议应该和服务器创建时的设置匹配。详细信息查看激活转发器

-s ServerTransport

指定当客户端连接到转发器时应该使用的协议设置。详细信息查看激活转发器

-?

显示包含DbEngPrx命令行帮助文本的消息框。

关于DbEngPrx的使用的信息,查看转发器

KDbgCtrl命令行选项

KDbgCtrl 命令行使用如下语法:

kdbgctrl [-e|-d|-c] [-ea|-da|-ca] [-eu|-du|-cu] [-sdb Size | -cdb

kdbgctrl -cx 

kdbgctrl -? 

参数

-e

启用完整内核调试设置。

-d

禁用完整内核调试设置。

-c

显示当前的完整内核调试设置。

-ea

启用自动内核调试设置。

-da

禁用自动内核调试设置。

-ca

显示自动完整内核调试设置。

-eu

启用用户模式错误处理设置。

-du

禁用用户模式错误处理设置。

-cu

显示用户模式错误处理设置。

-sdb Size

设置DbgPrint缓冲区大小。如果Size 带有0x前缀则被解释为16进制数字。如果带有0(零)前缀,则被解释为8进制。其他情况下,它被当作十进制数。

-cdb

显示当前DbgPrint缓冲区大小,以字节为单位。

-cx

检查当前的完整内核调试设置并返回一个适当的值。该选项不能和其它选项联合使用,并且不显示任何输出。它被设计为在能检查KDbgCtrl程序返回值的批处理文件中使用。可能的返回值如下:

意义

0x10001

完全内核调试被启用。

0x10002

完全内核调试被禁用。

其它值表示出现错误。KdbgCtrl不能检查当前的完整内核调试状态。

 

-?

显示KDbgCtrl的命令行帮助。

其它信息

关于KDbgCtrl所有设置的描述,查看使用DbgCtrl

DbgRpc命令行选项

DbgRpc命令行选项必须包含且只包含-l-e-t-c–a开关中的一个。这些开关之后的选项由它们来决定。-s-p-r选项可以和其它任何选项一起使用。

dbgrpc [-s Server -p ProtSeq] [-r Radix-l -P ProcessID -L CellID1.CellID2 

dbgrpc [-s Server -p ProtSeq] [-r Radix-e [-E EndpointName

dbgrpc [-s Server -p ProtSeq] [-r Radix-t -P ProcessID [-T ThreadID

dbgrpc [-s Server -p ProtSeq] [-r Radix] [-c|-a] [-C CallID] [-I IfStart] [-N ProcNum] [-P ProcessID

dbgrpc -? 

参数

-s Server

允许DbgRpc从远程机器查看信息。服务器名不能由斜线开头。关于远程使用DbgRpc的更多信息,查看使用DbgRpc工具

-p ProtSeq

指定使用的远程传输。ProtSeq 可能的值为ncacn_ip_tcp (TCP 协议) 和ncacn_np (命名管道协议)。建议使用TCP协议。关于远程使用DbgRpc的更多信息,查看使用DbgRpc工具

-r Radix

指定命令行参数使用的进制数。默认是16。如果使用了-r参数,它必须放在行首,因为它只作用于后面的参数。它不会影响DbgRpc工具的输出。

-l

显示指定单元的RPC状态信息。示例查看获取RPC单元信息

ProcessID

指定某个进程的进程ID(PID)。使用-l 选项时,它应该是包含指定单元的服务的进程。使用-t 选项时,它应该是包含指定线程的进程。使用-c-a选项时,该参数是可选的;它应该是拥有希望显示的调用的服务进程。

CellID1.CellID2

指定要显示的单元号。

-e

从系统的RPC状态信息搜索终端信息。示例查看获取RPC终端信息

EndpointName

指定要显示的终端号。如果省略,系统上所有进程的终端都会显示出来。

-t

从系统RPC状态信息中搜索线程信息。示例查看获取RPC线程信息

ThreadID

指定要显示的线程的ID。如果省略,指定进程的所有线程会被显示。

-c

在系统RPC状态信息中搜索服务器端调用信息(server-side call (SCALL))。示例查看获取RPC调用信息

-a

在系统RPC状态信息中搜索客户端调用信息(client call (CCALL))。示例查看获取RPC客户端调用信息该选项需要完整的RPC状态信息

CallID

指定调用ID。该参数可选;仅在希望显示匹配指定的CallID 值的调用时使用。

IfStart

显示产生调用的接口的全局唯一标识符(UUID)的第一个DWORD。该参数可选;仅在希望显示匹配指定的IfStart 值得调用时包含。

ProcNum

指定调用的过程号。(RPC运行时通过按照IDL文件中的位置进行编号来区分接口中的不同的过程——接口中第一个过程为0,第二个为1,等等。)该参数可选;仅在希望显示匹配指定的ProcNum 值的调用时使用。

其他信息

关于调试Microsoft远程过程调用(RPC)的更多信息,查看RPC调试

SymStore命令行选项

SymStore 事务支持下面这些语法形式。第一个参数必须是adddel。 其他参数的顺序不重要。

symstore add [/r] [/p [/l] [-:MSG Message] [-:REL] [-:NOREFS]] /f File /s Store /t Product [/v Version] [/o] [/c Comment] [/d LogFile] [/compress]

symstore add [/r] [/p [/l] [-:REL] [-:NOREFS]] /g Share /f File /x IndexFile [/a] [/o] [/d LogFile

symstore add /y IndexFile /g Share /s Store [/p [-:MSG Message] [-:REL] [-:NOREFS]] /t Product [/v Version] [/o] [/c Comment] [/d LogFile] [/compress]

symstore query [/r] /File /s Store [/o] [/d LogFile]

symstore del /i ID /s Store [/o] [/d LogFile

symstore /? 

参数

/f File

指定要添加的文件或目录的网络路径。

/g Share

指定符号文件本来存储的服务器和共享。当使用/f时,Share 应该和File 指示符的开头相同。使用/y 时,Share 应该是原始符号文件的位置(不是索引文件)。这使得之后将符号文件移动到不同的服务器和共享时可以改变文件路径的一部分。

/s Store

指定符号存储的根目录。

/m Prefix

使得SymStore在存储文件或升级指针时使用以前缀开始的路径来使用符号。该选项不能和/x一起使用。

/h { PUB | PRI }

使得SymStore在存储或升级符号时使用共有符号(如果指定了PUB),或私有符号(如果指定了PRI)。该选项对二进制文件没有影响。

/i ID

指定事务ID字符串。

/p

使得SymStore存储文件的指针,而不是文件本身。

/l

允许File 指定的文件在本地目录中而不是网络路径。(该选项仅在同时使用/f/p时使用。)

-:MSG Message

将指定的Message 添加到每个文件。(仅在使用/p时可以使用。)

-:REL

允许文件指针中的路径是相对路径。该选项隐含/ l选项。(仅在使用/p时可以使用。)

-:NOREFS

省略被存储的文件和指针的引用指针文件的创建。如果被修改的存储是使用该选项创建的,那么这个选项仅在符号存储最初被创建时有效。

/r

使得SymStore递归的添加文件或目录。

/t Product

指定产品名字。

/v Version

指定产品的版本。

/c Comment

为事务指定一个注释。

/d LogFile

指定一个用于命令输出的日志文件。如果没有指定它,则事务信息和其他输出被发送给stdout

/o

使得SymStore显示详细输出。

/x IndexFile

使得SymStore不存储实际的符号文件。作为替代,SymStore记录IndexFile 中的信息,使得SymStore可以在之后再访问符号文件。

/a

让SymStore将新的索引信息添加到一个已存在的索引文件中。(该选项只和/x 一起使用。)

/y IndexFile

让SymStore从使用/x 创建的文件中读取数据。

/yi IndexFile

将事务ID和注释添加到由/x选项创建的索引文件末尾。

/z { PUB | PRI }

使得SymStore仅索引指定类型的符号。指定PUB时,仅有不包含任何源码信息的符号会被索引。如果指定PRI,仅有包含完整的源码信息的符号会被索引。SymStore总是为二进制符号创建索引。

/compress

使得SymStore为每个拷贝到符号存储中的文件创建一个压缩后的版本而不是使用未压缩的文件。该选项仅在存储文件而不是指针时使用,所以不能和/p选项一起使用。

/?

显示SymStore 命令的帮助文本。

其他信息

关于SymStore 的更多信息,查看使用符号服务器和符号存储

posted @ 2008-06-03 11:51 NetRoc 阅读(352) | 评论 (0)编辑 收藏

端口访问监控原理

     摘要: NetRoc http://netroc682.spaces.live.com/ 本来不打算写文章的,呵呵。既然AhnLab敢用,我当然也敢写咯,哈哈 安博士的反外挂系统最近添加了一个功能,可以检查出来按键精灵、简单游这些用增强版WinIo直接进行端口读写的程序。后来拿来看了一下,其原理就是自己前段时间实现过的那种。通过Hook int 1,设置IO断点进行监控的方法。 原理如下:...  阅读全文

posted @ 2008-06-02 17:49 NetRoc 阅读(788) | 评论 (1)编辑 收藏

WinDbg 文档翻译----41

cc682/NetRoc

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

KD命令行选项

首次使用KD的用户应该从调试器操作节开始阅读。

KD命令行使用如下语法。

kd -server ServerTransport | -remote ClientTransport ] 
   [-| -x] [-d] [-bonc] [-m] [-myob] [-lines] [-n] [-r] [-s
   [-v] [-clines lines] [-failinc] [-noio] [-noshell
   [-secure] [-sdce] [-ses] [-sicv] [-sins] [-snc] [-snul]
   [-sup] [-sflags 0xNumber] [-log{o|aLogFile
   [-aExtension] [-zp PageFile
   [-i ImagePath] [-y SymbolPath]  [-srcpath SourcePath
   [-k ConnectType | -kl | -kx ExdiOptions] [-ee {masm|c++}] 
   [-z DumpFile] [-cf "filename"] [-cfr "filename"] [-c "command"

kd -QR Server 

kd -wake pid 

kd -?

下面是KD命令行选项的说明。仅有-remoteserver选项是区分大小写的。前面的连字号也可以用斜杠(/)代替。不带任何参数的选项可以连载一起——所以kd -r -n -v可以写成kd -rnv

如果使用了-remote-server选项,它们必须出现在命令行中其他任何选项之前。

参数

-server ServerTransport

创建一个可以用其他调试器访问的调试服务器。关于可能的ServerTransport 值的说明,查看激活调试服务器

-remote ClientTransport

创建一个调试客户端,并连接到已经运行的调试服务器上。关于ClientTransport 可能的值的说明,查看激活调试客户端

-aExtension

设置默认的扩展DLL。默认值为userexts。在"a"之后不能加入空格,并且不能包含.dll 扩展名。详细信息和设置该选项的其他方法,查看加载调试器扩展DLL

-b

该选项有两个作用:

1. 调试器在连接到目标机时立即中断它。

2. 重起之后,一旦内核初始化完成,调试器就中断目标机。查看崩溃和重起目标机获取详细信息和改变该状态的其他方法。

-bonc

如果指定了该选项,调试器会在会话开始之后尽快中断目标。这在连接到可能不能正确中断到目标的调试服务器时特别有用。

-c "command"

指定启动时运行的初始调试器命令。该命令必须用引号括起来。多条命令可以使用分号来分隔。(如果命令列表很长,将它们写入一个脚本文件并使用-c选项和$<, $><, $><, $$>< (Run Script File)命令可能会方便一些。)

如果正在启动调试客户端,该命令必须由调试服务器使用。客户端指定的类似.lsrcpath 这样的命令是不能使用的。

-cf "filename"

指定脚本文件的路径和名字。该脚本在调试器启动后会尽快被执行。如果filename 包含空格,则必须用引号括起来。如果省略掉路径,则使用默认路径。如果未使用-cf选项,当前目录下的 ntsd.ini会被作为该脚本文件。如果文件不存在也不会发生错误。详细信息,查看使用脚本文件

-cfr "filename"

指定脚本文件的路径和名字。该脚本在调试器启动后和每次调试目标被重起时会被执行。如果filename 包含空格,则必须用引号括起来。如果省略掉路径,则使用默认路径。如果文件不存在也不会发生错误。详细信息,查看使用脚本文件

-clines lines

设置进行远程调试时可访问的历史命令的近似行数。详细信息和改变该数字的其他方法,查看使用调试器命令

-d

重起之后,在完成内核模块加载时调试器就中断目标机。(该断点比-b 选项的断点更。)查看崩溃和重起目标机获取详细信息和改变该状态的其他方法。

-ee {masm|c++}

设置默认的表达式求值器。如果指定masm,则使用MASM表达式语法。如果指定C++,则使用C++语法。如果省略-ee选项,默认使用MASM表达式语法。查看表达式求值获取详细信息。

-failinc

指示调试器忽略任何可疑的符号。调试用户模式或内核模式minidump文件时,该选项也可以避免调试器加载任何映像不能被映射的模块的符号。详细信息和控制该选项的其他方法,查看SYMOPT_EXACT_SYMBOLS

-i ImagePath

指定产生错误的可执行文件的位置。如果该路径包含空格,需要用引号括起来。详细信息和改变该路径的其他方法,查看可执行映像路径

-k ConnectType

告诉调试器如何连接到目标机。详细信息,查看选择内核调试设置

-kl

(Windows XP和之后的系统) 在和调试器同一台机器上启动一个内核调试会话。详细信息,查看附加到目标机(内核模式)

-kx ExdiOptions

使用EXDI 驱动来启动一个内核调试会话。EXDI驱动在本文档中没有描述。如果拥有硬件探测器或硬件仿真器的EXDI接口,请联系Microsoft获得调试信息。

-lines

启用源码调试。如果忽略该选项,在进行源码调试之前必须执行 .lines (Toggle Source Line Support) 命令。控制该选项的其他方式,查看SYMOPT_LOAD_LINES

-log{o|a} LogFile

将日志记录到日志文件中。如果指定文件已存在,使用-logo 时会被覆盖,使用-loga 时会将新内容添加到后面。更多信息,查看使用日志文件

-m

指定连接到modem的串口。指示调试器监控载波检测信号(carrier-detect signal)。

-myob

如果和dbghelp.dll 版本不匹配,调试器仍然继续运行。(没有-myob开关时,这会产生一个致命错误。)

该选项的第二个作用是,通常在中断目标机时会显示出来的警告信息不再显示。

-n

详细符号加载:启用符号处理器的详细输出。关于控制该选项的其他方法,查看SYMOPT_DEBUG

-noio

阻止调试服务器被用于输入输出。只允许来自调试客户端的输入(加上任何用-c 命令行选项指定的初始命令或命令脚本)。所有输出都会被重定向到调试客户端。 如果使用NTSD作为服务器,不会创建任何控制台窗口。详细信息,查看激活调试服务器

-noshell

禁止任何.shell 命令。这种阻止只要调试器还在运行就会持续,即使开始了新的调试会话。详细信息和禁用.shell 命令的其它方法,查看使用Shell命令

-QR Server

列出指定网络服务器上运行的所有调试服务器。双反斜杠(\\)是可选的。查看搜索调试服务器获取详细信息。

-QR 参数不能和其他参数一起使用。该命令并不实际启动KD。

-r

显示寄存器。

-s

禁止延迟符号加载。这会造成进程启动变慢。详细信息和控制该选项的其他方式,查看SYMOPT_DEFERRED_LOADS

-sdce

使得调试器在加载符号时显示File access error 对话框。详细信息和控制该选项的其他方法,查看SYMOPT_FAIL_CRITICAL_ERRORS

-secure

激活安全模式

-ses

使得调试器对所有符号文件进行严格的匹配并忽略任何有问题的符号。详细信息和控制该选项的其他方法,查看SYMOPT_EXACT_SYMBOLS

-sflags 0xNumber

一次设置所有的符号处理器。Number 应该是以0x 开头的16进制数——不带0x 的10进制数也可以使用,但是由于符号选项是二进制标志,所以推荐使用16进制。该选项应该小心使用,因为它会覆盖所有默认的符号处理器。详细信息,查看设置符号选项

-sicv

使得符号处理器忽略CV记录。详细信息和控制该选项的其他方法,查看SYMOPT_IGNORE_CVREC

-sins

使得调试器忽略环境变量中的符号路径和可执行映像路径。详细信息查看SYMOPT_IGNORE_NT_SYMPATH

-snc

使得调试器关闭C++转换。详细信息和控制该选项的其他方法,查看SYMOPT_NO_CPP

-snul

禁止为有问题的名字自动加载符号。详细信息和控制该选项的其他方法,查看SYMOPT_NO_UNQUALIFIED_LOADS

-srcpath SourcePath

指定源文件搜索路径。用分号分隔多个路径。如果路径包含空格,需要用引号括起来。详细信息和其他改变该路径的方法,查看源码路径

-sup

使得符号处理器每次搜索符号时都搜索公有符号表。详细信息和控制该选项的其他方法,查看SYMOPT_AUTO_PUBLICS

-v

显示加载、延迟加载和卸载的详细信息。

-wake pid

使得进程ID由pid 指定的用户模式调试器结束睡眠模式。该命令必须在睡眠模式时在目标机上执行。查看从内核调试器控制用户模式调试器获取详细信息。

-wake参数不能和其他参数一起使用。该命令不会实际启动KD。

-x

使得调试器在异常第一次触发时中断,而不是让应用程序或模块来处理异常(除了初始的eb nt!NtGlobalFlag 9;g 命令之外,和-b一样)。

-y SymbolPath

指定符号搜索路径。使用分号(;)分隔多个路径。如果该路径包含空格,应该使用引号括起来。详细信息和其他修改这个路径的方法,查看符号路径

-z DumpFile

指定要调试的崩溃转储文件名。如果路径和名字包含空格,必须使用引号括起来。可以通过包含多个-z选项,每个后跟不同的DumpFile值来一次打开几个dump文件。详细信息,查看使用KD分析内核模式Dump文件

-zp PageFile

指定被修改过的页面文件的名字。这在调试dump文件并想使用.pagein (Page In Memory) 命令时很有用。-zp 不能使用标准的Windows页面文件——只有特殊修改过的页面文件可以使用。

-?

显示命令行帮助文本。

KD会自动检测目标机运行的平台。在KD命令行不需要指定目标的平台。旧的语法(使用名字I386KDIA64KD)已被废除。

WinDbg命令行选项

首次使用WinDbg的用户应该从调试器操作节开始阅读。

WinDbg命令行使用如下语法:

windbg -server ServerTransport | -remote ClientTransport ] [-lsrcpath ]
   [ -premote SmartClientTransport ] [-?] [-ee {masm|c++}] 
   [-clines lines] [-b] [-d] [-aExtension] [-e Event
   [-failinc] [-g] [-G] [-hd] [-j] [-n] [-noshell] [-o
   [-Q | -QY] [-QS | -QSY] [-robp] [-secure] [-ses] [-sdce
   [-sicv] [-sins] [-snc] [-snul] [-sup] [-sflags 0xNumber
   [-T Title] [-v] [-log{o|aLogFile] [-noinh
   [-i ImagePath] [-y SymbolPath] [-srcpath SourcePath
   [-k [ConnectType] | -kl | -kx ExdiOptions] [-c "command"
   [-pb] [-pd] [-pe] [-pr] [-pt Seconds] [-pv]
   [-W Workspace] [-WF Filename] [-WX] [-zp PageFile
   [ -p PID | -pn Name | -psn ServiceName | -z DumpFile | executable ] 

windbg -I[S

windbg -IA[S

WinDbg命令行的描述在下面内容中。除了-j 之外所有命令行参数都是大小写敏感的。前面的连字号可以用斜杠(/)代替。

如果使用了-remote-server选项,它们必须出现在命令行中其他任何选项之前。如果指定了executable,它必须位于命令行的末尾,任何在executable 名字之后的文本都被当作可执行程序自己的命令行参数传递给它。

参数

-server ServerTransport

创建一个可以用其他调试器访问的调试服务器。关于可能的ServerTransport 值的说明,查看激活调试服务器

-remote ClientTransport

创建一个调试客户端,并连接到已经运行的调试服务器上。关于ClientTransport 可能的值的说明,查看激活调试客户端

-premote SmartClientTransport

创建一个灵巧客户端,并且连接到已运行的进程服务器上。关于SmartClientTransport 的可能值的说明,查看激活灵巧客户端

-aExtension

设置默认的扩展DLL。默认值为userexts。在"a"之后不能加入空格,并且不能包含.dll 扩展名。详细信息和设置该选项的其他方法,查看加载调试器扩展DLL

-b

(仅内核模式) 该选项有两个作用:

1. 调试器在连接到目标机时立即中断它。

2. 重起之后,一旦内核初始化完成,调试器就中断目标机。查看崩溃和重起目标机获取详细信息和改变该状态的其他方法。

-c "command"

指定启动时运行的初始调试器命令。该命令必须用引号括起来。多条命令可以使用分号来分隔。(如果命令列表很长,将它们写入一个脚本文件并使用-c选项和$<, $><, $><, $$>< (Run Script File)命令可能会方便一些。)

如果正在启动调试客户端,该命令必须由调试服务器使用。客户端指定的类似.lsrcpath 这样的命令是不能使用的。

-clines lines

设置进行远程调试时可访问的历史命令的近似行数。详细信息和改变该数字的其他方法,查看使用调试器命令

-d

(仅内核模式) 重起之后,在完成内核模块加载时调试器就中断目标机。(该断点比-b 选项的断点更。)查看崩溃和重起目标机获取详细信息和改变该状态的其他方法。

-e Event

通知调试器指定的事件发生。该选项仅在编程启动调试器时使用。

-ee {masm|c++}

设置默认的表达式求值器。如果指定masm,则使用MASM表达式语法。如果指定C++,则使用C++语法。如果省略-ee选项,默认使用MASM表达式语法。查看表达式求值获取详细信息。

-failinc

指示调试器忽略任何可疑的符号。调试用户模式或内核模式minidump文件时,该选项也可以避免调试器加载任何映像不能被映射的模块的符号。详细信息和控制该选项的其他方法,查看SYMOPT_EXACT_SYMBOLS

-g

(仅用户模式) 忽略目标应用程序中的初始断点。该选项使得目标程序在启动后或者WinDbg附加之后继续运行,除非设置了其他断点。查看初始断点获取详细信息。

-G

(仅用户模式) 忽略进程终止时的最终断点。一般情况下,在映像结束过程中调试会话会结束。该选项使得调试会话在目标终止时直接退出。

-hd

(Windows XP和之后的系统,仅用户模式) 指定使用调试堆。查看创建的进程的行为获取详细信息。

-I[S]

将WinDbg安装为即时调试器。详细信息查看启用即时调试。操作完成后,会显示成功或失败的信息。如果指定了S ,成功不会有任何信息,只有失败会显示信息。

-I 参数不能和其他参数一起使用。该命令不会实际启动WinDbg,虽然WinDbg会出现一段时间。

-IA[S]

在注册表中将WinDbg和.dmp.mdmp.wew扩展名关联起来。操作完成后,会显示成功或失败的信息。如果指定了S ,成功不会有任何信息,只有失败会显示信息。进行这种关联后,双击带有这些扩展名的文件会启动WinDbg。

-I 参数不能和其他参数一起使用。该命令不会实际启动WinDbg,虽然WinDbg会出现一段时间。

-i ImagePath

指定产生错误的可执行文件的位置。如果该路径包含空格,需要用引号括起来。详细信息和改变该路径的其他方法,查看可执行映像路径

-j

允许日志。

-k [ConnectType]

(仅内核模式) 开始一个内核调试会话。详细信息查看选择内核调试设置。如果-k没有和后面的ConnectType一起使用,则必须是命令行的最后一个部分。

-kl

(Windows XP和之后的系统,仅内核模式) 在调试器同一台机器上启动一个内核调试会话。详细信息查看附加到目标机(内核模式)

-kx ExdiOptions

(仅内核模式) 使用EXDI 驱动来启动一个内核调试会话。EXDI驱动在本文档中没有描述。如果拥有硬件探测器或硬件仿真器的EXDI接口,请联系Microsoft获得调试信息。

-log{o|a} LogFile

将日志记录到日志文件中。如果指定文件已存在,使用-logo 时会被覆盖,使用-loga 时会将新内容添加到后面。更多信息,查看使用日志文件

-lsrcpath

为远程客户端设置本地源码路径。使用该选项时命令行中必须有-remote。诉讼

-n

详细符号加载:启用符号处理器的详细输出。关于控制该选项的其他方法,查看SYMOPT_DEBUG

-noinh

(仅用户模式) 阻止调试器创建的进程继承调试器的句柄。关于控制该选项的其他方法,查看创建新进程(用户模式)

-noprio

阻止任何权限的改变。该选项激活时会阻止WinDbg获得CPU时间的优先权。

-noshell

禁止任何.shell 命令。这种阻止只要调试器还在运行就会持续,即使开始了新的调试会话。详细信息和禁用.shell 命令的其它方法,查看使用Shell命令

-o

(仅用户模式) 调试所有由目标进程创建的进程(子进程)。默认情况下,调试的目标进程创建的子进程是正常运行的。控制该选项的其他方法,查看创建新进程(用户模式)

-p PID

指定要调试进程的十进制进程ID。这用于调试已运行的进程。详细信息,查看附加到运行中的进程(用户模式)

-pb

(Windows XP和之后的系统,仅用户模式) 在附加到目标进程时,阻止调试器要求初始断点。这在程序已经挂起或者不想在目标中创建中断线程(break-in thread)时有用。查看附加到运行中的进程(用户模式)

-pd

(Windows XP和之后的系统,仅用户模式) 指定在结束调试会话时目标程序不会被终止。查看结束调试会话获取详细信息。

-pe

(Windows XP和之后的系统,仅用户模式) 指示目标程序已经在被调试了。查看重新附加到目标程序获取详细信息。

-pn Name

指定被调试进程的名字。(该名字必须是唯一的。)这用来调试一个已经在运行的进程。详细信息,查看附加到运行中的进程(用户模式)

-pr

(Windows XP和之后的系统,仅用户模式) 是的调试器在附加到目标进程时让它运行。这在程序已经被挂起并且想恢复它的执行时有用。查看附加到运行中的进程(用户模式)

-psn ServiceName

指示包含要调试的进程的服务名。这在进程已经运行的情况下使用。详细信息查看附加到运行中的进程(用户模式)

-pt Seconds

指定中断超时时间,以秒为单位。默认为30。查看控制目标获取详细信息。

-pv

(仅用户模式) 指定调试器应该以无侵入的方式附加到目标进程。详细信息,查看非侵入式调试(用户模式)

-Q

禁止"Save Workspace?"对话框。工作空间不会被自动保存。查看使用工作空间获取详细信息。

-QS

禁止"Reload Source?" 对话框。源文件不会被自动重新加载。

-QSY

禁止"Reload Source?" 对话框并自动重新加载源文件。

-QY

禁止"Save Workspace?"并自动保存工作空间。查看使用工作空间获取详细信息。

-robp

这使得WinDbg可以在只读的内存页面上设置断点。(默认情况下这种操作会失败。)

-sdce

使得调试器在加载符号时显示File access error 对话框。详细信息和控制该选项的其他方法,查看SYMOPT_FAIL_CRITICAL_ERRORS

-secure

激活安全模式

-ses

使得调试器对所有符号文件进行严格的匹配并忽略任何有问题的符号。详细信息和控制该选项的其他方法,查看SYMOPT_EXACT_SYMBOLS

-sflags 0xNumber

一次设置所有的符号处理器。Number 应该是以0x 开头的16进制数——不带0x 的10进制数也可以使用,但是由于符号选项是二进制标志,所以推荐使用16进制。该选项应该小心使用,因为它会覆盖所有默认的符号处理器。详细信息,查看设置符号选项

-sicv

使得符号处理器忽略CV记录。详细信息和控制该选项的其他方法,查看SYMOPT_IGNORE_CVREC

-sins

使得调试器忽略环境变量中的符号路径和可执行映像路径。详细信息查看SYMOPT_IGNORE_NT_SYMPATH

-snc

使得调试器关闭C++转换。详细信息和控制该选项的其他方法,查看SYMOPT_NO_CPP

-snul

禁止为有问题的名字自动加载符号。详细信息和控制该选项的其他方法,查看SYMOPT_NO_UNQUALIFIED_LOADS

-srcpath SourcePath

指定源文件搜索路径。用分号分隔多个路径。如果路径包含空格,需要用引号括起来。详细信息和其他改变该路径的方法,查看源码路径

-sup

使得符号处理器每次搜索符号时都搜索公有符号表。详细信息和控制该选项的其他方法,查看SYMOPT_AUTO_PUBLICS

-T Title

设置WinDbg窗口标题。

-v

启用调试器的详细输出。

-W Workspace

加载名字给定的工作空间。如果名字空间名包含空格,需要用引号括起来。如果不存在这个名字的工作空间,则可以选择创建新的工作空间或放弃加载。详细信息查看使用工作空间

-WF Filename

从指定文件加载工作空间。Filename 需要包含文件名和扩展名(通常是.wew)。如果名字空间名包含空格,需要用引号括起来。如果不存在这个名字的工作空间,则可以选择创建新的工作空间或放弃加载。详细信息查看使用工作空间

-WX

禁止自动加载工作空间。详细信息查看使用工作空间

-y SymbolPath

指定符号搜索路径。使用分号(;)分隔多个路径。如果该路径包含空格,应该使用引号括起来。详细信息和其他修改这个路径的方法,查看符号路径

-z DumpFile

指定要调试的崩溃转储文件名。如果路径和名字包含空格,必须使用引号括起来。可以通过包含多个-z选项,每个后跟不同的DumpFile值来一次打开几个dump文件。详细信息,查看使用WinDbg分析用户模式Dump文件使用WinDbg分析内核模式Dump文件

-zp PageFile

指定被修改过的页面文件的名字。这在调试dump文件并想使用.pagein (Page In Memory) 命令时很有用。-zp 不能使用标准的Windows页面文件——只有特殊修改过的页面文件可以使用。

executable

指定可执行进程的命令行。这用于创建一个新进程并调试它。它应该作为命令行的最后一项。所有在可执行文件名之后的文本都被作为参数字符串传递给可执行文件。详细信息,查看创建新进程(用户模式)

-?

弹出本HTML帮助窗口。

通过命令行运行调试器时,在目标程序名后面指定传递给它的参数。例如:

windbg myexe arg1 arg2

posted @ 2008-06-02 13:44 NetRoc 阅读(618) | 评论 (0)编辑 收藏

WinDbg 文档翻译----40

cc682/NetRoc

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

调试器参考

本参考节包含:

命令行选项

环境变量

调试器命令

调试器扩展命令

调试器相关的API

调试器错误和警告信息

WinDbg图形界面功能

命令行选项

本参考节包含:

CDB命令行选项

KD命令行选项

WinDbg命令行选项

DbgSrv命令行选项

KdSrv命令行选项

DbEngPrx命令行选项

KDbgCtrl命令行选项

DbgRpc命令行选项

SymStore命令行选项

CDB命令行选项

首次使用CDB或NTSD的用户应该从调试器操作节开始阅读。

CDB命令行使用如下语法:

cdb  -server ServerTransport | -remote ClientTransport ] 
   [ -premote SmartClientTransport ] [-log{o|aLogFile]
   [-2] [-d] [-g] [-G] [-hd] [-lines] [-myob] [-bonc]
   [-n] [-o] [-s] [-v] [-w] [-cf "filename"] [-cfr "filename"] [-c "command"
   [-robp] [-r BreakErrorLevel]  [-t PrintErrorLevel
   [ -x{e|d|n|iException ] [-x] [-clines lines
   [-i ImagePath]  [-y SymbolPath] [-srcpath SourcePath
   [-aExtension] [-failinc] [-noio] [-noinh] [-noshell]
   [-sdce] [-ses] [-sicv] [-sins] [-snc] [-snul] [-zp PageFile
   [-sup] [-sflags 0xNumber] [-ee {masm|c++}] [-vf[:Flags]] 
   [-e Event] [-pb] [-pd] [-pe] [-pr] [-pt Seconds] [-pv
   [ -- | -p PID | -pn Name | -psn ServiceName | -z DumpFile | executable ] 

cdb -iae 

cdb -iaec KeyString 

cdb -QR Server 

cdb -wake pid 

cdb -?

NTSD命令行语法和CDB一样:

ntsd  -server ServerTransport | -remote ClientTransport ] 
   [ -premote SmartClientTransport ] [-log{o|aLogFile]
   [-2] [-d] [-g] [-G] [-hd] [-lines] [-myob] [-bonc]
   [-n] [-o] [-s] [-v] [-w] [-cf "filename"] [-cfr "filename"] [-c "command"
   [-robp] [-r BreakErrorLevel]  [-t PrintErrorLevel
   [ -x{e|d|n|iException ] [-x] [-clines lines
   [-i ImagePath]  [-y SymbolPath] [-srcpath SourcePath
   [-aExtension] [-failinc] [-noio] [-noinh] [-noshell]
   [-sdce] [-ses] [-sicv] [-sins] [-snc] [-snul] [-zp PageFile
   [-sup] [-sflags 0xNumber] [-ee {masm|c++}] [-vf[:Flags]] 
   [-e Event] [-pb] [-pd] [-pe] [-pr] [-pt Seconds] [-pv
   [ -- | -p PID | -pn Name | -psn ServiceName | -z DumpFile | executable ] 

cdb -iae 

cdb -iaec KeyString 

ntsd -QR Server 

ntsd -wake pid 

ntsd -?

NTSD和CDB唯一的不同在于NTSD会分离一个新的控制台窗口而CDB继承运行它的控制台窗口。由于start命令也会产生一个新的控制台窗口,所以下面两条命令具有相同的效果:

start cdb [parameters]
ntsd [parameters]

下面是CDB和NTSD命令行选项的说明。仅有-remote, -server-g-G 选项是区分大小写的。前面的连字号也可以用斜杠(/)代替。不带任何参数的选项可以连载一起——所以cdb -o -d -G -g winmine可以写成cdb -odGg winmine

如果使用了-remote-server选项,它们必须出现在命令行中其他任何选项之前。如果指定了executable,它必须位于命令行的末尾,任何在executable 名字之后的文本都被当作可执行程序自己的命令行参数传递给它。

参数

-server ServerTransport

创建一个可以用其他调试器访问的调试服务器。关于可能的ServerTransport 值的说明,查看激活调试服务器

-remote ClientTransport

创建一个调试客户端,并连接到已经运行的调试服务器上。关于ClientTransport 可能的值的说明,查看激活调试客户端

-premote SmartClientTransport

创建一个灵巧客户端,并且连接到已运行的进程服务器上。关于SmartClientTransport 的可能值的说明,查看激活灵巧客户端

-2

如果目标程序是控制台应用程序,该选项使得他被运行在一个新的控制台窗口中。(默认情况目标控制台程序和CDB或NTSD共享相同的窗口。)

--

这相当于-d -g -G -o -pd -p -1。查看使用NTSD调试CSRSS获得详细说明。

-aExtension

设置默认的扩展DLL。默认值为userexts。在"a"之后不能加入空格,并且不能包含.dll 扩展名。详细信息和设置该选项的其他方法,查看加载调试器扩展DLL

-bonc

如果指定了该选项,调试器会在会话开始之后尽快中断目标。这在连接到可能不能正确中断到目标的调试服务器时特别有用。

-c "command"

指定启动时运行的初始调试器命令。该命令必须用引号括起来。多条命令可以使用分号来分隔。(如果命令列表很长,将它们写入一个脚本文件并使用-c选项和$<, $><, $><, $$>< (Run Script File)命令可能会方便一些。)

如果正在启动调试客户端,该命令必须由调试服务器使用。客户端指定的类似.lsrcpath 这样的命令是不能使用的。

-cf "filename"

指定脚本文件的路径和名字。该脚本在调试器启动后会尽快被执行。如果filename 包含空格,则必须用引号括起来。如果省略掉路径,则使用默认路径。如果未使用-cf选项,当前目录下的 ntsd.ini会被作为该脚本文件。如果文件不存在也不会发生错误。详细信息,查看使用脚本文件

-cfr "filename"

指定脚本文件的路径和名字。该脚本在调试器启动后和每次调试目标被重起时会被执行。如果filename 包含空格,则必须用引号括起来。如果省略掉路径,则使用默认路径。如果文件不存在也不会发生错误。详细信息,查看使用脚本文件

-clines lines

设置进行远程调试时可访问的历史命令的近似行数。详细信息和改变该数字的其他方法,查看使用调试器命令

-d

将调试器的控制传递给内核调试器。如果调试CSRSS,即使没有指定-d,控制重定向总是被激活的。(远程调试时不能使用该选项——使用-ddefer来替代。) 查看从内核调试器控制用户模式调试器获取详细信息。

-ddefer

将该调试器的控制传递给内核调试器,除非调试客户端没有连接上来。(这是可以在调试服务器使用的-d选项的变种。)查看从内核调试器控制用户模式调试器获取详细信息。

-e Event

通知调试器指定的事件发生。该选项仅在编程启动调试器时使用。

-ee {masm|c++}

设置默认的表达式求值器。如果指定masm,则使用MASM表达式语法。如果指定C++,则使用C++语法。如果省略-ee选项,默认使用MASM表达式语法。查看表达式求值获取详细信息。

-failinc

指示调试器忽略任何可疑的符号。调试用户模式或内核模式minidump文件时,该选项也可以避免调试器加载任何映像不能被映射的模块的符号。详细信息和控制该选项的其他方法,查看SYMOPT_EXACT_SYMBOLS

-g

忽略目标应用程序中的初始断点。该选项使得目标程序在启动后或者CDB附加值后继续运行,除非设置了其他断点。查看初始断点获取详细信息。

-G

忽略进程终止时的最终断点。默认情况下,CDB会在进程结束时中断下来。该选项使得CDB在目标终止时直接退出。

-hd

(Microsoft Windows XP和之后的系统) 指定使用调试堆。查看创建的进程的行为获取详细信息。

-i ImagePath

指定产生错误的可执行文件的位置。如果该路径包含空格,需要用引号括起来。详细信息和改变该路径的其他方法,查看可执行映像路径

-iae

将CDB安装为即时调试器。详细信息,查看启用即时调试。如果操作成功,不会显示信息;如果失败会显示一条错误信息。

-iae 参数不能和其他参数一起使用。该命令并不实际启动CDB。

-iaec KeyString

将CDB安装为即时调试器。KeyString 的内容将加入到AeDebug 注册表键的末尾。如果KeyString 包含空格,必须用引号括起来。详细信息,查看启用即时调试。如果操作成功,不会显示信息;如果失败会显示一条错误信息。

-iaec不能和其他参数一起使用。该命令并不实际启动CDB。

-lines

启用源码调试。如果忽略该选项,在进行源码调试之前必须执行 .lines (Toggle Source Line Support) 命令。控制该选项的其他方式,查看SYMOPT_LOAD_LINES

-log{o|a} LogFile

将日志记录到日志文件中。如果指定文件已存在,使用-logo 时会被覆盖,使用-loga 时会将新内容添加到后面。更多信息,查看使用日志文件

-myob

如果和dbghelp.dll 版本不匹配,调试器仍然继续运行。(没有-myob开关时,这会产生一个致命错误。)

-n

详细符号加载:启用符号处理器的详细输出。关于控制该选项的其他方法,查看SYMOPT_DEBUG

-noinh

阻止调试器创建的进程继承调试器的句柄。关于控制该选项的其他方法,查看创建新进程(用户模式)

-noio

阻止调试服务器被用于输入输出。只允许来自调试客户端的输入(加上任何用-c 命令行选项指定的初始命令或命令脚本)。所有输出都会被重定向到调试客户端。 如果使用NTSD作为服务器,不会创建任何控制台窗口。详细信息,查看激活调试服务器

-noshell

禁止任何.shell 命令。这种阻止只要调试器还在运行就会持续,即使开始了新的调试会话。详细信息和禁用.shell 命令的其它方法,查看使用Shell命令

-o

调试所有由目标进程创建的进程(子进程)。默认情况下,调试的目标进程创建的子进程是正常运行的。控制该选项的其他方法,查看创建新进程(用户模式)

-p PID

指定要调试进程的十进制进程ID。这用于调试已运行的进程。详细信息,查看附加到运行中的进程(用户模式)

-pb

(Windows XP和之后的系统) 在附加到目标进程时,阻止调试器要求初始断点。这在程序已经挂起或者不想在目标中创建中断线程(break-in thread)时有用。查看附加到运行中的进程(用户模式)

-pd

(Windows XP和之后的系统) 指定在结束调试会话时目标程序不会被终止。查看结束调试会话获取详细信息。

-pe

(Windows XP和之后的系统) 指示目标程序已经在被调试了。查看重新附加到目标程序获取详细信息。

-pn Name

指定被调试进程的名字。(该名字必须是唯一的。)这用来调试一个已经在运行的进程。详细信息,查看附加到运行中的进程(用户模式)

-pr

(Windows XP和之后的系统) 是的调试器在附加到目标进程时让它运行。这在程序已经被挂起并且想恢复它的执行时有用。查看附加到运行中的进程(用户模式)

-psn ServiceName

指示包含要调试的进程的服务名。这在进程已经运行的情况下使用。详细信息查看附加到运行中的进程(用户模式)

-pt Seconds

指定中断超时时间,以秒为单位。默认为30。查看控制目标获取详细信息。

-pv

指定调试器应该以无侵入的方式附加到目标进程。详细信息,查看非侵入式调试(用户模式)

-QR Server

列出指定网络服务器上运行的所有调试服务器。双反斜杠(\\)是可选的。查看搜索调试服务器获取详细信息。

-QR 参数不能和其他参数一起使用。该命令并不实际启动CDB。

-r BreakErrorLevel

指定将造成目标中断到调试器的错误等级。这是等于0、1、2或3的一个十进制数字。可能的值如下:

常数

含义

0

NONE

任何错误都不中断

1

ERROR

在ERROR级别的调试事件时中断

2

MINORERROR

在MINORERROR和ERROR级别的调试事件时中断

3

WARNING

在WARNING、 MINORERROR和ERROR级别的调试事件时中断

 

这些错误等级仅在Microsoft Windows 2000和之前的调试版系统中有意义。默认值为1。

-robp

这使得CDB可以在只读的内存页面上设置断点。(默认情况下这种操作会失败。)

-s

禁止延迟符号加载。这会造成进程启动变慢。详细信息和控制该选项的其他方式,查看SYMOPT_DEFERRED_LOADS

-sdce

使得调试器在加载符号时显示File access error 对话框。详细信息和控制该选项的其他方法,查看SYMOPT_FAIL_CRITICAL_ERRORS

-ses

使得调试器对所有符号文件进行严格的匹配并忽略任何有问题的符号。详细信息和控制该选项的其他方法,查看SYMOPT_EXACT_SYMBOLS

-sflags 0xNumber

一次设置所有的符号处理器。Number 应该是以0x 开头的16进制数——不带0x 的10进制数也可以使用,但是由于符号选项是二进制标志,所以推荐使用16进制。该选项应该小心使用,因为它会覆盖所有默认的符号处理器。详细信息,查看设置符号选项

-sicv

使得符号处理器忽略CV记录。详细信息和控制该选项的其他方法,查看SYMOPT_IGNORE_CVREC

-sins

使得调试器忽略环境变量中的符号路径和可执行映像路径。详细信息查看SYMOPT_IGNORE_NT_SYMPATH

-snc

使得调试器关闭C++转换。详细信息和控制该选项的其他方法,查看SYMOPT_NO_CPP

-snul

禁止为有问题的名字自动加载符号。详细信息和控制该选项的其他方法,查看SYMOPT_NO_UNQUALIFIED_LOADS

-srcpath SourcePath

指定源文件搜索路径。用分号分隔多个路径。如果路径包含空格,需要用引号括起来。详细信息和其他改变该路径的方法,查看源码路径

-sup

使得符号处理器每次搜索符号时都搜索公有符号表。详细信息和控制该选项的其他方法,查看SYMOPT_AUTO_PUBLICS

-t PrintErrorLevel

指定造成调试器显示错误信息的错误级别。这是一个等于0、1、2或者3的10进制数字。可能的值如下:

常数

含义

0

NONE

不显示任何错误

1

ERROR

显示ERROR级别的调试事件

2

MINORERROR

显示MINORERROR和ERROR级别的调试事件

3

WARNING

显示WARNING、MINORERROR和ERROR的调试事件

 

这些错误级别仅在Microsoft Windows 2000和之前的调试版系统中有意义。默认值为1。

-v

启用调试器的详细输出。

-vf[:Flags]

使得目标进程在应用程序验证器(Application Verifier)下运行。 如果指定了Flags,这些标志会被传递给应用程序验证器。如果省略冒号和Flags,传递给应用程序验证器的标志值为0。详细信息,查看应用程序验证器

-w

指定调试一个在另一个VDM 中的16位程序。

-wake pid

使得进程ID由pid 指定的用户模式调试器结束睡眠模式。该命令必须在睡眠模式时在目标机上执行。查看从内核调试器控制用户模式调试器获取详细信息。

-wake参数不能和其他参数一起使用。该命令不会实际启动CDB。

-x{e|d|n|i} Exception

控制调试器在指定事件发生时的行为。Exception 可以是一个错误码或者事件代码。可以指定该选项数次来控制不同的事件。查看控制异常和事件获取详细信息和其他设置该选项的方法。

-x

禁止发生访问违例异常时的第一次中断机会。第二次访问违例的处理机会将中断到调试器。这和-xd av作用相同。

-y SymbolPath

指定符号搜索路径。使用分号(;)分隔多个路径。如果该路径包含空格,应该使用引号括起来。详细信息和其他修改这个路径的方法,查看符号路径

-z DumpFile

指定要调试的崩溃转储文件名。如果路径和名字包含空格,必须使用引号括起来。可以通过包含多个-z选项,每个后跟不同的DumpFile值来一次打开几个dump文件。详细信息,查看使用CDB分析用户模式Dump文件

-zp PageFile

指定被修改过的页面文件的名字。这在调试dump文件并想使用.pagein (Page In Memory) 命令时很有用。-zp 不能使用标准的Windows页面文件——只有特殊修改过的页面文件可以使用。

executable

指定可执行进程的命令行。这用于创建一个新进程并调试它。它应该作为命令行的最后一项。所有在可执行文件名之后的文本都被作为参数字符串传递给可执行文件。详细信息,查看创建新进程(用户模式)

-?

显示命令行帮助文本。

通过Start | Run 或命令提示符窗口启动调试器时,可以在目标程序名后面指定它的参数。例如:

cdb myexe arg1 arg2

posted @ 2008-06-02 11:25 NetRoc 阅读(471) | 评论 (0)编辑 收藏

WinDbg 文档翻译----39

cc682/NetRoc

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

安全性

本节包含:

安全弱点

安全模式

安全弱点

本节包含:

内核模式调试时的安全

用户模式调试时的安全

即时调试的安全

远程调试时的安全

内核调试时的安全

内核模式时的安全性不是用来保护目标机的。目标机对于调试器来说是完全开放的——这正是调试的正常情况。

如果一个调试连接在引导时就被启用(查看配置目标机的软件),再下一次启动前,它的调试端口总是易受攻击的。

但是,应该要关心主控机的安全性。在理想情况下,调试器是作为一个应用程序在主控机上运行的,但是它不会和计算机上其他程序相互影响。有三种可能出现安全性问题的情况:

  • 如果使用恶意的具有破坏性的扩展DLL,他们可以让调试器产生不希望的行为并作用于主控机。
  • 使用恶意的带破坏性的符号文件,也可能让调试器产生不期望的行为并作用于主控机。
  • 如果运行一个远程调试会话,非预期的客户端可能尝试连接到服务器上。或者预期的客户端会尝试进行不期望的行为。

如果想避免远程用户对主控机进行操作,使用安全模式

关于如何防止非预期的远程连接的建议,查看远程调试的安全性

如果不是进行远程调试,仍然要小心恶意的符号文件和扩展DLL。不要加载不可信任的符号或扩展!

本地内核调试

只有具有调试权限的用户可以开始本地调试会话。如果你是某台机器的管理员,并且存在多个用户帐户,需要意识到任何具有这些权限的用户都可以开始本地调试会话以控制计算机上的所有进程——同时也给予他们访问所有外设的权限。

用户模式调试时的安全

当用户模式调试器激活后,它可以有效的控制计算机中的任何一个进程。

在用户模式调试时可能遇到三种安全问题:

  • 如果使用恶意的具有破坏性的扩展DLL,他们可以让调试器产生不希望的行为并作用于主控机。
  • 使用恶意的带破坏性的符号文件,也可能让调试器产生不期望的行为并作用于主控机。
  • 如果运行一个远程调试会话,非预期的客户端可能尝试连接到服务器上。或者预期的客户端会尝试进行不期望的行为。

关于如何防止非预期的远程连接的建议,查看远程调试的安全性。当远程客户端加入到用户模式调试会话中后,就没有办法约束它对计算机中进程的访问了。

如果不是进行远程调试,仍然要小心恶意的符号文件和扩展DLL。不要加载不可信任的符号或扩展!

即时调试的安全性

只有管理员可以启用即时调试

但是,即时调试是针对整个系统启用的,而不是某个用户。因此,当它被启用后,任何应用程序的崩溃都会激活选定的调试器——即使当前用户没有管理员权限。

同样,即时调试器继承了和崩溃的程序一样的权限。因此,如果类似CSRSS和LSASS这样的Windows服务崩溃了,调试器也会获得非常高的权限。

当准备启用即时调试时,需要意识到这一点。

远程调试时的安全

有两种方式可以增加远程调试时的安全性:限制谁可以连接到会话中和限制已连接上来的人的权限。

控制对调试会话的访问

如果进行通过调试器进行的远程调试或使用 进程服务器KD连接服务器,本地网络上的任何计算机都可以尝试附加到调试会话上。

如果使用TCP、1394、COM或 命名管道,可以要求调试客户端提供密码。但是,密码在传输时是不会加密的,因此这些协议都不安全。

如果想调试服务器变得安全一些,必须使用安全套接字层(SSL)或安全管道(SPIPE)协议。

如果进行通过remote.exe进行的远程调试, 可以通过/u参数来防止未认证用户的连接。

限制客户端的权限

如果设置了一个内核调试会话,可以使用安全模式来限制调试器对主控机的干涉。

在用户模式下是不能使用安全模式的。可以通过使用.noshell (Prohibit Shell Commands) 命令来阻止调试器执行MS-DOS命令或运行外部程序。但是,客户端还是有很多其他方式可以用来干预计算机。

注意安全模式和.noshell都会同时阻止调试客户端和调试服务器的一些特定行为。没有办法只限制客户端而不限制服务器。

遗忘的进程服务器

在远程机器上开启进程服务器时,它是在后台运行的。

如果通过该进程服务器进行了远程调试然后关闭会话,进程服务器会继续运行。

忘记关闭的进程服务器会成为潜在的攻击目标。不再需要的进程服务器都应该关闭。使用Kill.exe实用程序或任务管理器来结束进程服务器。

安全模式

进行内核模式调试时,可以让调试器在安全模式下运行。这样可以避免调试器对主控机的影响,同时也不会显著的降低对目标机调试的自由度。

当允许远程客户端加入到调试会话时,推荐使用安全模式。

本节包含:

安全模式的功能

激活安全模式

安全模式的功能

当安全模式激活时,所有可以作用于主控机的命令都会无效,并且对符号服务器和调试器扩展有一些限制。

安全模式的效果如下:

一旦激活,安全模式不能再被关闭。

激活安全模式

安全模式仅适用于内核模式调试。它必须在调试会话开始之前激活——通过调试器命令行或调试器完全静止并且还没有被作为服务器使用。

要激活安全模式,使用下面的方法之一:

如果已经存在一个内核调试会话,并且需要知道是否处于安全模式下,可以使用不带参数的.secure命令。这可以显示出当前安全模式的状态。

安全模式被激活之后,即使结束调试会话也不能关闭它。只要调试器本身还在运行,安全模式就还存在。

posted @ 2008-06-01 20:15 NetRoc 阅读(369) | 评论 (0)编辑 收藏

WinDbg 文档翻译----38

 

cc682/NetRoc

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

用户模式Dump文件

本节包含:

用户模式Dump文件种类

创建用户模式Dump文件

分析用户模式Dump文件

用户模式Dump文件种类

有各种不同的用户模式崩溃dump文件,但是他们可以分为两类:

完整用户模式Dump

Minidump

他们之间的差别之一是大小。Minidump通常要更加紧凑并且更容易发送给分析者。

注意  通过分析dump文件可以获得很多信息。但是没有任何dump文件能提供比直接使用调试器调试更多的信息。

完整用户模式Dump

完整用户模式dump是基本的用户模式dump文件。

这种dump文件包含进程的完整内存空间、程序本身的可执行映像、句柄表和其他对调试器有用的信息。

可以将一个完整用户模式dump"缩减"为minidump。只需要将dump文件加载进调试器中并使用.dump (Create Dump File)命令来将dump文件保存为minidump格式。

注意  和名字无关,最大的"minidump"文件实际上可以提供比完整用户模式dump更多的信息。例如,.dump /mf.dump /ma将创建比.dump /f 更大更完整的文件。

用户模式下,使用.dump /m[MiniOptions] 是最好的选择。通过这个开关创建的dump文件可以很小也可以很大。通过指定合适的MiniOptions 可以控制究竟需要包含哪些信息。

Minidump

只包含需要的和进程相关的内存信息的用户模式dump文件称为minidump

Minidump的大小和内容由被转储的程序和进行转储的程序共同决定。有时候,minidump可以很大并且包含完整的内存和句柄表。另一些时候,也可以很小——例如,可能只包含单个线程的信息,或者仅包含堆栈中实际引用到的模块的信息。

名字"minidump"实际上容易令人误解,因为最大的minidump 文件实际比"完整"用户模式dump包含更多信息。例如,.dump /mf.dump /ma 会比.dump /f 创建更大更完整的文件。由于这些原因,在创建用户模式dump文件时更加推荐使用.dump /m[MiniOptions] 而不是.dump /f

如果使用调试器创建minidump文件,可以精确选择所包含的信息。简单的.dump /m 命令仅包含进程的已加载模块、线程信息和调用堆栈这些基本信息。可以使用下面这些选项来修改:

.dump选项

dump文件中的作用

/ma

创建一个包含所有附加选项的minidump。/ma 选项和/mfFhut 一样——它将完整的内存数据、句柄数据、已卸载模块信息、基本信息和线程时间信息写入minidump。

/mf

将完整内存数据加入minidump。所有目标程序中已交付的能访问的页面都会包括进去。

/mF

将所有基本内存信息包含进minidump中。这会将一个流加入到包含完整基本内存信息的minidump中,而不单是可使用的内存。这样可以使得调试器能够重建minidump生成时进程的完整虚拟内存布局。

/mh

在minidump中包含和目标进程相关的句柄信息。

/mu

在minidump中包含已卸载模块信息。仅在Windows Server 2003和之后版本的Windows中可用。

/mt

在minidump中包含附加的线程信息。包括可以在调试minidump时使用.ttime (Display Thread Times)进行显示的线程时间。

/mi

在minidump中包含次级内存(secondary memory)。次要内存是由堆栈中的指针或备份存储(backing store)中引用到的任何内存,加上该地址周围的一小段区域。

/mp

在minidump中包含进程环境块(PEB)和线程环境块(TEB)。这在想访问程序的进程和线程相关的Windows系统信息时很有用。

/mw

将所有已交付的可读写的私有页面包含进minidump。

/md

在minidump中包含可执行映像中所有可读写得数据段。

/mc

加入映像中的代码段。

/mr

从minidump中去掉对重建调用堆栈无用的堆栈和存储内存部分。局部变量和其他数据类型值也被删除。这个选项不会使得minidump变小(因为这些内存节仅仅是变成0),但是当想保护其他程序中的机密信息时有用。

/mR

在minidump中去掉完整的模块路径。仅包含模块。如果想保护用户的目录结构时该选项有用。

/mk "FileName"

(仅Windows Vista)在用户模式minidump之外还创建一个内核模式minidump。内核模式minidump的内容仅限于和用户模式minidump中相同的线程。FileName 必须用引号括起来。

 

这些选项可以进行组合。例如,.dump /mfiu 命令可以用来创建一个相当大的minidump,或者.dump /mrR 命令可以用来创建一个能保护用户隐私的minidump。完整的语法细节,查看.dump (Create Dump File)

关于minidump文件内容的详细信息,查看Microsoft Windows SDK中的DbgHelp参考。

创建用户模式Dump文件

有五种不同的工具可以用来创建用户模式dump文件: CDB、WinDbg、Dr. Watson、UserDump和ADPlus。

本节包含:

选择最好的工具

CDB和WinDbg

UserDump

关于使用ADPlus创建用户模式dump文件的更多信息,查看ADPlus

关于使用Dr. Watson 创建用户模式dump文件的更多信息,查看Dr. Watson

选择最好的工具

有五种不同的工具可用来创建用户模式dump文件。大多数情况下,ADPlus是最好的选择。

下表列出了每种工具的功能。

功能

ADPlus

Dr. Watson

CDB
and
WinDbg

UserDump

在程序崩溃时创建dump文件(即时调试)

在程序"挂起"时创建dump文件(停止相应但是未实际崩溃)

遇到异常时创建dump文件

程序正常运行时创建dump文件

对启动时就出现错误的程序创建dump文件

缩减已存在的dump文件

 

CDB和WinDbg

CDB和WinDbg 可以通过很多办法创建用户模式dump文件。

自动创建Dump文件

当应用程序出错时,根据即时调试设置的不同,Windows可以做出各种不同的反应。如果这些设置指示调试工具创建dump文件,则可以创建用户模式内存dump文件。

默认的即时调试设置是使用Dr. Watson 来生成dump。如果希望使用WinDbg作为即时调试器,可以使用下面这个命令来自动配置注册表:

windbg -I 

如果使用CDB作为即时调试器,需要手动配置注册表。详细信息,查看启用即时调试

在调试中创建dump文件

当CDB或WinDbg在调试用户模式程序时,可以使用.dump (Create Dump File)命令来创建dump文件。

这个命令不会造成目标进程终止。通过选择合适的命令选项,可以创建仅包含需要的信息的minidump文件。

缩减已存在的Dump文件

CDB和WinDbg也可以用来缩减dump文件。要这样做可以调试一个已存在的dump文件,然后使用.dump命令来创建尺寸更小的dump文件。

UserDump

UserDump 工具(userdump.exe),也称为用户模式进程转储工具(User-Mode Process Dump),也可以创建用户模式dump文件。

UserDump和它的文档是OEM支持工具包的一部分。

要下载该工具,可以到Knowledge Base Article Q253066站点并根据页面的指示操作。

默认的即时调试使用的转储工具是Dr. Watson。关于如何改变它的详细信息,查看启用即时调试

分析用户模式Dump文件

本节包含:

使用CDB分析用户模式Dump文件

使用WinDbg分析用户模式Dump文件

关于如何使用Dr. Watson 分析用户模式dump文件的信息,查看查阅Dr. Watson日志文件

使用CDB分析用户模式Dump文件

可以使用CDB来分析用户模式内存转储文件。CDB运行的计算机的处理器平台和Windows版本不需要和创建dump文件的机器匹配。

安装符号文件

分析内存转储文件之前,需要首先安装生成dump文件的Windows版本相应的符号文件。选择用来分析dump文件的调试器需要使用这些文件。关于如何安装合适的符号文件的信息,查看安装Windows符号文件

还需要安装产生该dump文件的程序或系统服务的用户模式进程对应的符号文件。如果是自己编写的代码,这些符号文件应该在编译和链接代码时一起生成了。如果是商业代码,可以在产品CD-ROM中查找或联系供应商获得特定符号文件。

启动CDB

使用-z 命令行选项启动CDB来分析dump文件:

cdb -y SymbolPath -i ImagePath -z DumpFileName 

-v 选项(详细模式)也很有用。完整的选项列表,查看CDB命令行选项

也可以在调试器运行之后通过.opendump (Open Dump File)命令后跟g (Go)命令来打开dump文件。这使得可以同时调试多个dump。

可以同时调试多个dump文件。通过在命令行中包含多个-z 开关(每个后跟一个不同的文件名),或者使用.opendump 将更多的dump文件作为调试目标。关于如何控制多目标调试会话的信息,查看调试多个目标

Dump文件一般是以.dmp.mdmp扩展名结尾的。内存dump文件名可以使用网络共享或通用命名约定(Universal Naming Convention (UNC))。

Dump文件也经常被打包为CAB文件。如果在-z选项或.opendump 命令后指定了文件名(包含.cab扩展名),调试器可以直接从CAB中读取dump文件。但是,如果单个CAB包中存在多个dump文件,调试器一次只能读取它们中的一个。调试器不会在CAB中读取任何其他文件,即使有和dump文件关联的符号文件或其他文件。

分析完整用户模式Dump文件

分析完整用户模式dump文件和分析活动的调试会话类似。查看调试器命令参考来获得可在用户模式调试dump文件时使用的命令。

分析Minidump文件

对用户模式minidump 的分析和完整dump一样。但是,由于保存的内存要少很多,进行的操作可能受到很大限制。尝试访问内存的命令根据minidump文件内容的不同可能不能正常工作。

其他技术

关于从dump文件中读取特定种类信息的技术,查看从Dump文件获取信息

用WinDbg分析用户模式Dump文件

可以使用WinDbg分析用户模式内存转储文件。WinDbg运行的计算机的处理器平台和Windows版本不需要和创建dump文件的机器匹配。

安装符号文件

分析内存转储文件之前,需要首先安装生成dump文件的Windows版本相应的符号文件。选择用来分析dump文件的调试器需要使用这些文件。关于如何安装合适的符号文件的信息,查看安装Windows符号文件

还需要安装产生该dump文件的程序或系统服务的用户模式进程对应的符号文件。如果是自己编写的代码,这些符号文件应该在编译和链接代码时一起生成了。如果是商业代码,可以在产品CD-ROM中查找或联系供应商获得特定符号文件。

启动WinDbg

使用-z 命令行选项启动WinDbg来分析dump文件:

windbg -y SymbolPath -i ImagePath -z DumpFileName 

- v 选项(详细模式)也很有用。完整的选项列表,查看(R) WinDbg命令行选项

如果WinDbg已经在运行并且处于静止模式,可以通过File | Open Crash Dump菜单命令或按下CTRL+D 快捷键打开dump文件。Open Crash Dump对话框出现时,在File name文本框输入崩溃dump文件的完整路径和文件名,或者直接在对话框中选择合适的路径和文件名。 选定文件之后,点击Open

可以在调试器运行起来之后使用.opendump (Open Dump File) 命令后跟g (Go)命令来打开dump文件。

可以同时调试多个dump文件。通过在命令行中包含多个-z 开关(每个后跟一个不同的文件名),或者使用.opendump 将更多的dump文件作为调试目标。关于如何控制多目标调试会话的信息,查看调试多个目标

Dump文件一般是以.dmp.mdmp扩展名结尾的。内存dump文件名可以使用网络共享或通用命名约定(Universal Naming Convention (UNC))。

Dump文件也经常被打包为CAB文件。如果在-z选项或.opendump 命令后指定了文件名(包含.cab扩展名),调试器可以直接从CAB中读取dump文件。但是,如果单个CAB包中存在多个dump文件,调试器一次只能读取它们中的一个。调试器不会在CAB中读取任何其他文件,即使有和dump文件关联的符号文件或其他文件。

分析完整用户模式Dump文件

分析完整用户模式dump文件和分析活动的调试会话类似。查看调试器命令参考来获得可在用户模式调试dump文件时使用的命令。

分析Minidump文件

对用户模式minidump 的分析和完整dump一样。但是,由于保存的内存要少很多,进行的操作可能受到很大限制。尝试访问内存的命令根据minidump文件内容的不同可能不能正常工作。

其他技术

关于从dump文件中读取特定种类信息的技术,查看从Dump文件获取信息

posted @ 2008-05-30 15:47 NetRoc 阅读(1256) | 评论 (0)编辑 收藏

WinDbg 文档翻译----37

cc682/NetRoc

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

内存转储文件

本节包含:

内核模式Dump文件

用户模式Dump文件

内核模式Dump文件

当发生内核模式错误时,Microsoft Windows的默认行为是显示一个蓝色的屏幕和错误检查数据。

但是,也可以选择一些其它的方式:

  • 可以连接一个内核调试器(例如WinDbg和KD)。
  • 写入一个内存dump文件。
  • 系统可以自动重起。
  • 先写入一个内存dump文件,然后重起系统。

本节包含创建和分析内核模式内存转储文件的方法。有三种不同的崩溃转储文件。但是,当系统出错时,没有任何转储文件比直接附加到系统上的内核调试器更加有效和通用。

本节包含:

各种不同的内核模式Dump文件

创建内核模式Dump文件

分析内核模式Dump文件

各种不同的内核模式Dump文件

有三种不同的内核模式dump文件:

完整内存转储

内核转储

小内存转储

内核转储(Kernel-Memory Crash Dump)小内存转储(Small Memory Dump)仅在Windows 2000和之后的系统上支持。

这些dump文件的不同点之一在于大小。完整内存转储包含最多信息,内核转储要小一些,小内存转储只有64 KB大小。

大文件的好处在于,由于包含更多信息,所以更可能找到崩溃的原因。

小文件的优点在于更小也能够更快的写入。速度经常是很有价值的;如果运行的是服务器,可能希望它在崩溃之后能尽快重起,而dump文件写完之前是不能进行重起的。

完整内存转储或内核转储创建之后,还可以从大一些的dump文件创建小内存转储文件。查看.dump (Create Dump File)命令获取详细信息。

注意  通过分析内核模式dump文件可以获得很多信息。但是没有任何内核模式dump文件能够获得像直接进行内核调试一样多的信息。

完整内存Dump

完整内存dump是最大的内核模式dump文件。这种文件包含发生错误时机器物理内存的所有信息。

该dump文件要求引导驱动器上的页面文件至少有主系统内存那么大:它需要保存大小为整个RAM加上1MB的文件。

完整内存Dump文件默认写入到%SystemRoot%\Memory.dmp

如果发生第二次错误检查并且创建了另一个完整内存dump(或内核dump),前一个文件会被覆盖掉。

内核Dump

内核Dump包含崩溃时被内核所使用的所有内存。

这种dump文件比完整内存dump要小很多。一般它只有系统物理内存的1/3大小。当然,大小根据不同的情况会有所不同。

该dump文件不会包含未分配的内存,或 任何分配给用户模式程序的内存。它仅包含分配给Windows内核和硬件抽象层(HAL),以及内核模式驱动和其他内核模式程序的内存。

大多数情况下这种崩溃dump是最有用的。它比完整内存dump要小很多,但是只省略了那些不太可能造成崩溃的内存内容。

由于这类dump文件没有包含崩溃时存在的任何用户模式可执行文件的映像,所以如果他们很重要的话,需要设置可执行映像路径。

内核Dump默认写入%SystemRoot%\Memory.dmp

如果第二次错误检查创建了另一个内核Dump(或完整内存dump),前一个文件会被覆盖掉。

调试内核Dump时要避免显示页面丢失错误的信息,可以使用.ignore_missing_pages 命令。

小内存转储

小内存转储比其他两种内核模式崩溃转储文件都要小很多。它的大小为64 KB,并且只需要引导驱动器上有64 KB的页面文件大小。

这种dump文件包含下面内容:

  • 错误检查信息和参数,这和蓝屏时的信息一样。
  • 崩溃的处理器的处理器环境(PRCB)。
  • 崩溃的进程信息和内核环境(EPROCESS)。
  • 崩溃的线程的信息和内核环境 (ETHREAD)。
  • 产生崩溃的线程的内核模式调用堆栈。如果它大于16 KB,则只会包含顶部的16 KB的数据。
  • 加载的驱动的列表。

在Windows XP和之后版本的Windows中,还会包含以下内容:

  • 已加载和卸载的模块列表。
  • 调试器数据块。这包含系统的基本调试信息。
  • 任何Windows认为对调试错误有帮助的内存页面。包括崩溃发生时寄存器指向的数据页面和出错模块明确请求的页面。
  • (仅Intel Itanium 处理器) 备份存储(backing store)。
  • (Windows Server 2003 和之后的系统) Windows SKU——例如"Professional" 或"Server"。

当磁盘空间很有限时这种dump文件是有用的。但是,由于仅包含很有限的数据,当错误不是直接由当前线程引起时,分析这种文件可能找不到错误。

由于这种dump文件没有包含崩溃时内存中的任何可执行映像,可能也需要设置可执行映像路径。

如果第二次错误检查发生并且创建了另一个小内存转储文件,前一个文件仍然存在。每个新文件都会有不同的名字,文件名中包含崩溃发生的时间。例如mini022900-01.dmp 是在2000年2月29日产生的第一个内存转储文件。小内存转储文件的列表存放在%SystemRoot%\Minidump 目录中。

创建内核模式Dump文件

有三种创建内核模式dump文件的方法:

  1. 在控制面板启用dump文件,然后等系统自己崩溃。
  2. 在控制面板启用dump文件,并强制系统崩溃。
  3. 通过调试器在不让系统崩溃的情况下创建dump文件。

本节包含:

启用内核模式Dump文件

强制系统崩溃

不使系统崩溃的情况下创建Dump文件

验证内核模式Dump文件的创建

使用NMI开关

也可以使用NMI开关来生成崩溃dump文件。联系硬件供应商来确认机器是否具有这个开关。

本文档不包含NMI开关的使用方法。

启用内核模式Dump文件

系统崩溃时,Windows崩溃转储设置会决定是否创建一个dump文件,以及需要创建哪种大小的dump文件。

Windows控制面板可以控制内核模式崩溃转储的设置。只有系统管理员可以修改这些设置。

要改变这些设置,在控制面板中点击系统(System)图标。选择高级(Advanced)选项卡。在Windows NT 4.0和Windows 2000中,点击启动和恢复(Startup and Recovery)。在Windows XP和之后版本的Windows中,在启动和故障恢复(Startup and Recovery)中点击设置(Settings)按钮。

可以看到下面的对话框:

控制面板:启动和故障恢复对话框

写入调试信息(Write Debugging Information)中,可以选择默认生成哪种dump文件。每次崩溃时只能创建一个dump文件。默认使用的是小内存转储。查看各种不同的内核模式Dump文件获取三种文件类型的说明。

选好了dump文件大小后,可以使用默认路径和文件名也可以修改掉。

也可以选中或取消将事件写入系统日志(Write an event to the system log)发送管理警报(Send an administrative alert)自动重新启动(Automatically reboot)选项。

如果做出了任何改变,点击确定(OK)后系统会重新启动。

这里选择的设置会应用到所有系统崩溃产生的内核模式dump文件,而不管崩溃是由错误造成的还是由调试器产生的。查看强制系统崩溃获得主动造成崩溃的信息。

但是,这些设置不影响使用.dump 命令创建的dump文件。查看不造成系统崩溃的情况下创建Dump文件获取关于使用该命令的详细信息。

强制系统崩溃

当内核模式dump文件启用后,大多数系统崩溃都会显示蓝屏并 创建一个崩溃转储文件进行写入。

但是,有时候系统会冻结起来而不能进入内核崩溃状态。可能的一些表现为:

  • 鼠标指针可以移动,但是不能做任何事。
  • 所有的画面被冻结,鼠标指针不能移动,但是分页仍然继续。
  • 鼠标和键盘没有任何反应,并且未使用磁盘。

如有存在有经验的调试技术人员,他/她可以接上一个内核调试器来分析问题。关于在这种情况下需要寻找什么东西的提示,可以查看调试停止的系统

但是,如果没有技术人员,可能想要创建一个内核dump文件并发送给其他地方的技术员。该dump文件可以用来分析错误的原因。

有两种方法可以主动产生系统崩溃:

从调试器强制系统崩溃

从键盘强制系统崩溃

从调试器强制系统崩溃

如果使用KD或WinDbg进行内核调试,则可以强制发生系统崩溃。可以在命令提示符输入.crash (Force System Crash)命令。(如果目标及没有马上崩溃,可以再使用一个g (Go)命令。)

使用了该命令后,系统会调用KeBugCheck 并且产生bug check 0xE2 (MANUALLY_INITIATED_CRASH)。如果崩溃转储没有禁用,这时会创建出一个崩溃转储文件。

崩溃转储文件写入之后,会通知主控机上的内核调试器,这时可以对崩溃的目标机进行活动的调试。

从键盘强制崩溃

可以直接通过键盘造成系统崩溃。在Windows XP中,该功能在使用i8042prt 端口键盘(PS/2 键盘)时可用,而在Windows Vista和之后的系统在USB键盘上也可用。可以通过注册表键来对按键进行完全的配置。

之前先要做两个预备工作:

  1. 如果希望创建崩溃转储文件,必须先启用dump文件,选择路径和文件名,并选择dump文件的大小。详细信息查看启用内核模式Dump文件
  2. 使用PS/2键盘,必须先在注册表中启用键盘产生的崩溃。在注册表键HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\i8042prt\Parameters下,创建一个名为CrashOnCtrlScroll的值,并设置为REG_DWORD 0x1 (或其他任何非0值)。
  3. 使用USB键盘,必须在注册表键HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\kbdhid\Parameters下创建一个名为 CrashOnCtrlScroll的值,并设置为REG_DWORD 0x1 (或其他任何非0值)。

    注意  Kbdhid.sys允许从USB键盘产生一次内存转储过程的功能有一个限制。如果系统在高的中断请求优先级(IRQL)上停止相应的话,CTRL+SCROLL LOCK+SCROLL LOCK 快捷键就不起作用了。该限制是由于Kbdhid.sys 驱动是在比i8042prt.sys 更低的IRQL工作造成的。关于通过USB键盘使用这个功能的更多信息,查看文章Generate a memory dump file by using the keyboard

必须重起系统这些修改才能生效。

这样做完之后,就可以用下面的方法来从键盘造成崩溃了。按住最右边的CTRL 键,然后安下SCROLL LOCK键两次。

如果CTRL+SCROLL LOCK+SCROLL LOCK 按键序列没有起效,系统可能会冻结起来。但是,这是非常少见的。CTRL+SCROLL LOCK+SCROLL LOCK产生崩溃即使在很多时候CTRL+ALT+DELETE不能工作时依然起效。

系统之后会调用KeBugCheck并产生bug check 0xE2 (MANUALLY_INITIATED_CRASH)。如果没有禁用崩溃转储,这时会创建一个dump文件。

如果有内核调试器附加到冻结中的机器上,崩溃转储文件写入完成后会中断到内核调试器。

不造成系统崩溃的情况下创建Dump文件

如果使用KD或WinDbg进行内河模式调试,可以在不造成目标计算机的系统崩溃的情况下创建内核模式Dump文件。

这可以是完整内存转储或小内存转储文件。这种情况下控制面板中的设置不起作用。

和由崩溃产生的dump文件不同,这种dump文件是写入主控机中的。

详细信息,查看.dump (Create Dump File) 命令。

验证内核模式Dump文件的创建

如果有一台已经中断到调试器的机器,但是不确定崩溃转储文件是否成功写入了,可以执行下面的命令:

dd nt!IopFinalCrashDumpStatus L1

这会显示IopFinalCrashDumpStatus变量的值。

如果值为0,则写入过程完成。如果是-1(0xFFFFFFFF),表明转储进程还没有开始。

其他任何值都表明转储过程出现了错误。

分析内核模式Dump文件

本节包含:

使用KD分析内核模式Dump文件

使用WinDbg分析内核模式Dump文件

使用KAnalyze分析内核模式Dump文件

安装符号文件

不管使用哪种工具,都需要安装产生该dump文件的系统版本的符号文件。用来分析dump文件的调试器需要使用这些文件。关于如何正确安装符号文件,查看安装Windows符号文件

DumpExam

DumpExam 工具已经作废了。分析崩溃dump文件时不再需要它。

使用KD分析内核模式Dump文件

可以使用KD来分析内核模式内存转储文件。运行KD的处理器平台和Windows版本不需要和生成dump文件的机器一样。

启动KD

-z 命令行选项一起启动KD来分析dump文件:

kd -y SymbolPath -i ImagePath -z DumpFileName 

-v (详细模式)选项也是有用的。关于选项的完整列表,查看KD命令行选项

可以在运行调试器之后用.opendump (Open Dump File) 后跟g (Go)命令来打开dump文件。

可以同时调试多个dump文件。可以通过在命令行中包含多个-z 开关(每个后跟一个不同的文件名),或者使用.opendump 将更多的dump文件作为调试目标。关于如何控制多目标调试会话的信息,查看调试多个目标

Dump文件一般是以.dmp.mdmp扩展名结尾的。可以使用网络共享或通用命名约定(Universal Naming Convention (UNC))的名字来命名内存dump文件。

Dump文件也经常被打包为CAB文件。如果在-z选项或.opendump 命令后指定了文件名(包含.cab扩展名),调试器可以直接从CAB中读取dump文件。但是,如果单个CAB包中存在多个dump文件,调试器一次只能读取它们中的一个。调试器不会在CAB中读取任何其他文件,即使有和dump文件关联的符号文件或其他文件。

分析Dump文件

如果分析内核Dump或小内存Dump,需要设置可执行映像路径以指向所有在崩溃时加载到内存中的可执行文件。查看可执行映像路径获取详细信息。

分析dump文件和分析其他活动调试会话类似。查看调试器命令参考小节来获得调试内核模式dump文件时可用命令的详细信息。

大多数情况下,应该首先使用!analyze。这个扩展命令可以对dump文件进行自动分析,并且常常会给出很多有用信息。

.bugcheck (Display Bug Check Data) 显示错误检查代码和它的参数。查看错误检查代码参考获得关于特定错误的信息。

下面这些调试器扩展命令对于分析内核模式崩溃转储也非常有用:

!drivers

!kdext*.locks

!memusage

!vm

!errlog

!process 0 0

!process 0 7

关于从dump文件中读取特定种类信息的技术,查看从Dump文件中获取信息

用WinDbg分析内核模式Dump文件

可以使用WinDbg来分析内核模式内存转储文件。运行WinDbg的处理器平台和Windows版本不需要和生成dump文件的机器一样。

启动WinDbg

-z 命令行选项一起启动WinDbg来分析dump文件:

windbg -y SymbolPath -i ImagePath -z DumpFileName 

-v选项(详细模式)也很有用。关于这些选项的完整列表,查看WinDbg命令行选项

如果WinDbg已经在运行并且处于静止模式,可以通过File | Open Crash Dump菜单命令或按下CTRL+D快捷键来打开dump文件。当Open Crash Dump 对话框出现后,在File name 文本框输入dump文件的全路径和名字,或使用对话框来选择合适的路径和文件名。选定需要的文件后,点击Open

可以在调试器已经运行之后使用.opendump (Open Dump File) 命令后跟g (Go)命令来打开dump文件。

可以同时调试多个dump文件。可以通过在命令行中包含多个-z 开关(每个后跟一个不同的文件名),或者使用.opendump 将更多的dump文件作为调试目标。关于如何控制多目标调试会话的信息,查看调试多个目标

Dump文件一般是以.dmp.mdmp扩展名结尾的。可以使用网络共享或通用命名约定(Universal Naming Convention (UNC))的名字来命名内存dump文件。

Dump文件也经常被打包为CAB文件。如果在-z选项或.opendump 命令后指定了文件名(包含.cab扩展名),调试器可以直接从CAB中读取dump文件。但是,如果单个CAB包中存在多个dump文件,调试器一次只能读取它们中的一个。调试器不会在CAB中读取任何其他文件,即使有和dump文件关联的符号文件或其他文件。

分析Dump文件

如果分析内核Dump或小内存Dump,需要设置可执行映像路径以指向所有在崩溃时加载到内存中的可执行文件。查看可执行映像路径获取详细信息。

分析dump文件和分析其他活动调试会话类似。查看调试器命令参考小节来获得调试内核模式dump文件时可用命令的详细信息。

大多数情况下,应该首先使用!analyze。这个扩展命令可以对dump文件进行自动分析,并且常常会给出很多有用信息。

.bugcheck (Display Bug Check Data) 显示错误检查代码和它的参数。查看错误检查代码参考获得关于特定错误的信息。

下面这些调试器扩展命令对于分析内核模式崩溃转储也非常有用:

!drivers

!kdext*.locks

!memusage

!vm

!errlog

!process 0 0

!process 0 7

关于从dump文件中读取特定种类信息的技术,查看从Dump文件中获取信息

使用KAnalyze分析内核模式Dump文件

内核内存空间分析器(KAnalyze, kanalyze.exe)是另一个可以用来分析内核模式dump文件的工具。

KAnalyze和它的文档是OEM支持工具包的一部分。

要下载该工具,可以到Knowledge Base Article Q253066页面并根据指示操作。

posted @ 2008-05-29 16:43 NetRoc 阅读(1098) | 评论 (0)编辑 收藏

WinDbg 文档翻译----36

cc682/NetRoc

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

符号无效或丢失

符号无效或丢失是最常见的调试器问题的原因。遇到很多问题时,需要找出是否有符号问题。

某些情况下,解决方案就是获得正确的符号文件。另一些情况下,只需要对调试器进行简单的配置,以使得它能正确识别已有的符号文件。但是如果不能获得正确的符号文件,只能带着这些问题使用有限制的功能对目标进行调试。

先使用公有符号然后又切换成使用私有符号的情况并不经常需要,但是当存在不同的导出符号拥有相同地址时,可能存在问题。这种情况下,可以设置两个断点:一个在公有符号上,第二个在私有符号上。

本节包含:

验证符号

使用页面换出的文件头读取符号

不使用符号调试用户模式进程

验证符号

符号问题会以各种方式表现出来。可能堆栈回溯显示错误信息,或者不能显示堆栈中的函数名。也可能调试器命令不能识别模块、函数、变量、结构或数据类型的名字。

如果猜测没有正确加载符号,可以通过几个步骤来确认问题。

首先,使用lm (List Loaded Modules) 命令来显示已加载模块和符号信息的列表。该命令最有用的形式如下:

0:000> lml 

如果使用WinDbg, Debug | Modules菜单命令也可以看到这些信息。

对这些输出中的注释或缩写要特别注意。详细说明查看符号状态缩写

如果没有看到是当的符号文件,首先应该做的是检查符号路径:

0:000> .sympath
Current Symbol Path is: d:\MyInstallation\i386\symbols\retail

如果符号路径错误,则修正它。如果正在使用内核调试器,要确认本地%WINDIR%在符号路径中。

然后使用.reload (Reload Module)命令重新加载符号:

0:000> .reload ModuleName 

如果符号路径正确,可以激活详细模式(noisy mode)来查看dbghelp加载了什么符号文件。然后重新加载模块。查看设置符号选项来获得激活详细模式的方法。

这是一个"详细"重加载Microsoft Windows符号的例子:

kd> !sym noisy
kd> .reload nt
 1: Kernel Version 2081 MP Checked
 2: Kernel base = 0x80400000 PsLoadedModuleList = 0x80506fa0
 3: DBGHELP: FindExecutableImageEx-> Looking for D:\MyInstallation\i386\ntkrnlmp.exe...mismatched timestamp
 4: DBGHELP: No image file available for ntkrnlmp.exe
 5: DBGHELP: FindDebugInfoFileEx-> Looking for
 6: d:\MyInstallation\i386\symbols\retail\symbols\exe\ntkrnlmp.dbg... no file
 7: DBGHELP: FindDebugInfoFileEx-> Looking for
 8: d:\MyInstallation\i386\symbols\retail\symbols\exe\ntkrnlmp.pdb... no file
 9: DBGHELP: FindDebugInfoFileEx-> Looking for d:\MyInstallation\i386\symbols\retail\exe\ntkrnlmp.dbg... OK
10: DBGHELP: LocatePDB-> Looking for d:\MyInstallation\i386\symbols\retail\exe\ntkrnlmp.pdb... OK
11: *** WARNING: symbols checksum and timestamp is wrong 0x0036a4ea 0x00361a83 for ntkrnlmp.exe

符号处理器首先查找和即将加载的模块匹配的映像(第3和第4行)。映像本身并不总是需要的,但是如果存在一个不正确的,符号处理器常常会失败。这几行表明调试器找到了一个映像D:\MyInstallation\i386\ntkrnlmp.exe ,但是它的时间戳并不匹配。由于时间戳不匹配,所以继续进行搜索。然后,调试器查找匹配加载的映像的.dbg.pdb文件。从第6到第10行表明,虽然符号加载了,但是和映像的时间戳并不匹配(即符号是错误的)。

如果符号搜索遇到灾难性的错误,会看到这样的信息:

ImgHlpFindDebugInfo(00000000, module.dll, c:\MyDir;c:\SomeDir, 0823345, 0) failed

这可以由文件系统错误、网络错误和错误的.dbg文件造成。

诊断符号加载错误

在噪声模式时,调试器不能加载某个符号文件时会打印出错误码。.dbg文件相关的错误码在winerror.h 中列出。.pdb 的错误代码由另一个源获得,并且通常以英文文本的形式输出出来。

一些常见的winerror.h 中的.dbg 文件错误代码如下:

0xB

ERROR_BAD_FORMAT

0x3

ERROR_PATH_NOT_FOUND

0x35

ERROR_BAD_NETPATH

有可能不能加载符号文件的原因是网络错误。如果从网络上另一台机器上加载符号并看到ERROR_BAD_FORMAT 或ERROR_BAD_NETPATH 错误,可以尝试将符号文件复制到本地计算机,并将它的路径加入符号路径。然后重新加载符号。

验证搜索路径和符号

假设符号路径中有"c:\MyDir;c:\SomeDir"Let "。应该从何处查找调试信息呢?

假设二进制文件和Windows发行版一样已经剥离了调试信息,首先会在以下位置查找.dbg文件:

c:\MyDir\symbols\exe\ntoskrnl.dbg
c:\SomeDir\symbols\exe\ntoskrnl.dbg
c:\MyDir\exe\ntoskrnl.dbg
c:\SomeDir\exe\ntoskrnl.dbg
c:\MyDir\ntoskrnl.dbg
c:\SomeDir\ntoskrnl.dbg
current-working-directory\ntoskrnl.dbg

然后,在以下位置查找.pdb文件:

c:\MyDir\symbols\exe\ntoskrnl.pdb
c:\MyDir\exe\ntoskrnl.pdb
c:\MyDir\ntoskrnl.pdb
c:\SomeDir\symbols\exe\ntoskrnl.pdb
c:\SomeDir\exe\ntoskrnl.pdb
c:\SomeDir\ntoskrnl.pdb
current-working-directory\ntoskrnl.pdb

注意,在搜索.dbg文件时,调试器交替的搜索MyDirSomeDir 目录,但是对.pdb的搜索不是这样。

Windows XP和之后版本的Windows不使用.dbg符号文件。详细信息查看符号文件:概述

版本不匹配

在一台经常升级的机器上最常出现的调试问题是来自不同版本的不匹配的符号。该问题的三个普遍原因是:指向错误的版本,使用私有版本的二进制文件但是没有适合的符号,在多处理器机器上使用单处理器硬件抽象层(HAL)和内核符号。前两个问题只需要使用和二进制文件匹配的符号;第三个问题可以通过将hal*.dbgntkrnlmp.dbg 重命名为hal.dbgntoskrnl.dbg来解决。

要知道目标机上安装的Windows版本,可以使用vertarget (Show Target Computer Version) 命令:

kd> vertarget 
Windows XP Kernel Version 2505 UP Free x86 compatible
Built by: 2505.main.010626-1514
Kernel base = 0x804d0000 PsLoadedModuleList = 0x80548748
Debug session time: Mon Jul 02 14:41:11 2001
System Uptime: 0 days 0:04:53 

测试符号

测试符号要困难一些。它涉及到验证调试器的堆栈跟踪和查看调试输出是否正确。这里有一个例子:

kd> u videoprt!videoportfindadapter2
Loading symbols for 0xf2860000     videoprt.sys ->   videoprt.sys

VIDEOPRT!VideoPortFindAdapter2:
f2856f42 55               push    ebp
f2856f43 8bec             mov     ebp,esp
f2856f45 81ecb8010000     sub     esp,0x1b8
f2856f4b 8b4518           mov     eax,[ebp+0x18]
f2856f4e 53               push    ebx
f2856f4f 8365f400         and     dword ptr [ebp-0xc],0x
f2856f53 8065ff00         and     byte ptr [ebp-0x1],0x0
f2856f57 56               push    esi

u命令反汇编videoprt.sys 中的videoportfindadapter 字符串。调试器上的符号是正确的,因为常用的类似pushmov这样的堆栈指令被显示出来。大多数函数都以对基指针(ebp)或堆栈指针(esp)的加、减或压栈操作开头。

当符号工作不正常时一般都容易发现。Glintmp.sys在本例子中没有符号,因为Glintmp边上没有显示出函数名:

kd> kb
Loading symbols for 0xf28d0000     videoprt.sys ->   videoprt.sys
Loading symbols for 0xf9cdd000      glintmp.sys ->   glintmp.sys
*** ERROR: Symbols could not be loaded for glintmp.sys
ChildEBP RetAddr  Args to Child
f29bf1b0 8045b5fa 00000001 0000a100 00000030 ntoskrnl!RtlpBreakWithStatusInstruction
f29bf1b0 8044904e 00000001 0000a100 00000030 ntoskrnl!KeUpdateSystemTime+0x13e
f29bf234 f28d1955 f9b7d000 ffafb2dc f9b7d000 ntoskrnl!READ_REGISTER_ULONG+0x6
f29bf248 f9cde411 f9b7d000 f29bf2b0 f9ba0060 VIDEOPRT!VideoPortReadRegisterUlong+0x27
00000002 00000000 00000000 00000000 00000000 glintMP+0x1411 [No function listed.] 

这个堆栈跟踪中加载了错误版本的符号。注意前两个函数调用中没有列出函数名。堆栈回溯看起来像win32k.sys 绘制矩形的错误一样:

1: kd> 
1: kd> kb                      [Local        9:50 AM]
Loading symbols for 0xf22b0000       agpcpq.sys ->   agpcpq.sys
*** WARNING: symbols checksum is wrong 0x0000735a 0x00000000 for agpcpq.sys
*** ERROR: Symbols could not be loaded for agpcpq.sys
Loading symbols for 0xa0000000       win32k.sys ->   win32k.sys
*** WARNING: symbols checksum is wrong 0x00191a41 0x001995a9 for win32k.sys
ChildEBP RetAddr  Args to Child
be682b18 f22b372b 82707128 f21c1ffc 826a70f8 agpCPQ+0x125b [No function listed.]
be682b4c a0140dd4 826a72f0 e11410a8 a0139605 agpCPQ+0x372b [No function listed.]
be682b80 a00f5646 e1145100 e1cee560 e1cee560 win32k!vPatCpyRect1_6x6+0x20b
00000001 00000000 00000000 00000000 00000000 win32k!RemoteRedrawRectangle+0x32 

这是正确的调用堆栈。真正的问题是AGP440.sys 造成的。一般出现在调用堆栈中的第一项就是错误出现的地方。注意这里没有win32k.sys 的矩形绘制错误了:

1: kd> kb                      [Local        9:49 AM]
ChildEBP RetAddr  Args to Child
be682b18 f22b372b 82707128 f21c1ffc 826a70f8 agpCPQ!AgpReleaseMemory+0x88
be682b30 f20a385c 82703638 e183ec68 00000000 agpCPQ!AgpInterfaceReleaseMemory+0x8b
be682b4c a0140dd4 826a72f0 e11410a8 a0139605 VIDEOPRT!AgpReleasePhysical+0x44
be682b58 a0139605 e1cee560 e11410a8 a00e5f0a win32k!OsAGPFree+0x14
be682b64 a00e5f0a e1cee560 e11410a8 e1cee560 win32k!AGPFree+0xd
be682b80 a00f5646 e1145100 e1cee560 e1cee560 win32k!HeapVidMemFini+0x49
be682b9c a00f5c20 e1cee008 e1cee008 be682c0c win32k!vDdDisableDriver+0x3a
be682bac a00da510 e1cee008 00000000 be682c0c win32k!vDdDisableDirectDraw+0x2d
be682bc4 a00da787 00000000 e1843df8 e1843de8 win32k!PDEVOBJ__vDisableSurface+0x27
be682bec a00d59fb 00000000 e1843de8 00000000 win32k!PDEVOBJ__vUnreferencePdev+0x204
be682c04 a00d7421 e1cee008 82566a98 00000001 win32k!DrvDestroyMDEV+0x30
be682ce0 a00a9e7f e1843e10 e184a008 00000000 win32k!DrvChangeDisplaySettings+0x8b3
be682d20 a008b543 00000000 00000000 00000000 win32k!xxxUserChangeDisplaySettings+0x106
be682d48 8045d119 00000000 00000000 00000000 win32k!NtUserChangeDisplaySettings+0x48
be682d48 77e63660 00000000 00000000 00000000 ntkrnlmp!KiSystemService+0xc9 

有用的命令和扩展命令

下面的命令和扩展命令可能对查找符号问题很有帮助:

lm (List Loaded Modules)

列举所有模块并且显示这些模块的符号的加载状态。

!dh image-header-base

显示以image-header-base 开头的已加载映像的头信息。

.reload /n

重新加载所有内核符号。

.reload [image-name]

(仅CDB 或WinDbg) 重新加载名为image-name 的映像的符号。如果没有指定image-name,则重新为所有映像加载符号。 (在修改符号路径之后需要重新加载符号。)

!sym noisy

打开符号加载的详细模式。这可以用来获得模块加载的信息。查看设置符号选项获得详细说明。

.sympath [new-symbol-path]

设置新的符号路径,或显示当前符号路径。查看符号路径获得详细信息。

如果内核符号是正确的,但是没有获得完整调用堆栈,下面的命令可能会很有用:

X *!

这会列出当前加载了符号的模块。在内核符号正确的时候很有用。

.reload /user

尝试重新加载所有用户模式符号。这在进行内核调试,某个进程正在运行的时候加载了符号,并且之后另一个进程中触发了断点时需要。这种情况下,从新进程而来的用户模式符号在执行该命令之前都不会被加载起来。

X wdmaud!*start*

这会列出wdmaud 模块中包含"start"字符串的符号。这样有一个好处是可以强制重新加载wdmaud 中的所有符号,但是只显示包含"start"的。(这意味着列表更短,但是由于很可能一些符号包含了"start",还是会发生一些验证。)

另一个验证符号的有用技术是对代码进行反汇编。大多数函数以对基指针(ebp)或堆栈指针(espsp)的加、减或压栈操作开头。可以尝试对堆栈中的一些函数(从0偏移开始)进行反汇编(U <funct>)来验证符号。

网络和端口问题

当连接到调试器时可能出现符号文件的问题。在遇到这些问题时需要在头脑中保留这些东西:

  • 确认调试电缆连接到测试系统的哪个COM端口上。
  • 检查测试系统的boot.ini 设置。查看/debug 开关并检查波特率和COM端口设置。
  • 当通过网络访问符号文件时,调试时可能遇到网络问题。
  • 相同名字的.dll.sys文件 (例如 − mga64.sysmga64.dll) 如果他们没有分布在不同的符号目录树中,会搞乱调试器。
  • 内核调试时用私有符号文件替换版本符号文件并不总是好的。检查符号路径几次并对表现不正常的符号使用.reload <filename>!dlls 命令有时候很有用。

问题和误解

Q: 我成功加载了符号,但是调用堆栈看起来是错的。调试器坏了吗?

A: 不一定。这个问题最可能的原因是使用了错误的符号。使用本节中上面的步骤来检查是否加载了错误的符号。一些东西工作正常不能假定拥有了正确的符号。例如,在没有正确的符号是很可能可以成功的执行dd nt!ntbuildnumberu nt!KeInitializeProcess。使用上面描述的步骤来验证符号的正确性。

Q: 调试器可以使用不正确的符号工作吗?

A: 可以说是也可以说不是。常常可以摆脱符号没有严格匹配的问题。例如,前一个Windows版本的符号常常在某些情况下也可以使用,但是它什么时候又用,什么时候没用是不确定的。

Q: 我在内核调试器中中断下来,并且想查看用户模式进程中的符号。可以这样做吗?

A: 通常可以。对这种情况的支持不多,因为内核调试器并没有保留足够信息用来跟踪每个进程的模块加载,但是有合理的替代方法。要加载用户模式模块的符号,可以执行.reload –user命令。他可以加载当前上下文的用户模式模块。

Q: 下面这条消息是什么意思?

*** WARNING: symbols checksum and timestamp is wrong 0x0036d6bf 0x0036ab55 for ntkrnlmp.exe

A: 这意味着ntkrnlmp.exe 的符号是错误的。

使用页面换出的文件头读取符号

内核调试器必须读取每个已加载模块的映像头部来确定匹配该模块的符号。

如果模块的头部被换页到磁盘上,调试器就不能加载该模块的符号。如果这发生在被调试进程的核心模块上,就会成为严重问题。

下面是用来解决该问题的步骤。

获得换出的文件头的符号

  1. 制作一个内核本身的拷贝。将它放到网络共享上可能是最方便的。
  2. 将该共享的根目录加入符号路径。查看符号路径获得修改符号路径的方法。
  3. 使用.reload (Reload Module) 命令。
  4. 使用!sym noisy扩展命令来查看详细输出。如果这样,就可以哪些符号是从目标机上的模块映像加载,哪些是从内核模块的拷贝加载的。

这种技术需要小心的使用,因为调试器没有办法验证这个拷贝文件是否和原始文件真正匹配。所以目标机和网络共享上的Windows版本匹配是至关重要的。

该技术仅用于内核调试。用户模式调试时,系统会负责将所有需要的头换页进内存(除非包含页面文件的磁盘被卸载 (dismounted)或者不能访问)。

这是使用该技术的一个例子:

kd> .reload
Connected to Windows XP 2268 x86 compatible target, ptr64 FALSE
Loading Kernel Symbols
..........Unable to read image header for dmload.sys at fe0be000 - NTSTATUS 0xC0000001
..........Unable to read image header for dmboot.sys at fda93000 - NTSTATUS 0xC0000001
.....................................Unable to read image header for fdc.sys at fdfc2000 - NTSTATUS 0xC0000001
...Unable to read image header for flpydisk.sys at fde4a000 - NTSTATUS 0xC0000001
.Unable to read image header for Fs_Rec.SYS at fe0c8000 - NTSTATUS 0xC0000001
.Unable to read image header for Null.SYS at fe2c4000 - NTSTATUS 0xC0000001
...................Unable to read image header for win32k.sys at a0000000 - NTSTATUS 0xC0000001
..Unable to read image header for dxg.sys at a0194000 - NTSTATUS 0xC0000001
.......Unable to read image header for ati2draa.dll at a01a4000 - NTSTATUS 0xC0000001
..Unable to read image header for ParVdm.SYS at fe116000 - NTSTATUS 0xC0000001
.......
Loading unloaded module list
..............
Loading User Symbols
Unable to retrieve the PEB address. This is usually caused
by being in the wrong process context or by paging

注意很多映像没有可访问的头。检查某个文件的符号(本例中为fs_rec.sys):

kd> x fs_rec!*
*** ERROR: Module load completed but symbols could not be loaded for fs_rec.sys

头部明显被换出了。所以需要将合适的映像加入到符号路径中:

kd> .sympath+ \\myserver\myshare\symbols\x86fre\symbols
Symbol search path is: symsrv*symsrv.dll*c:\localcache*http://msdl.microsoft.com/download/symbols;\\myserver\myshare\symbols\x86fre\symbols

kd> .reload
Connected to Windows XP 2268 x86 compatible target, ptr64 FALSE
Loading Kernel Symbols
..........Unable to read image header for dmload.sys at fe0be000 - NTSTATUS 0xC0000001
..........Unable to read image header for dmboot.sys at fda93000 - NTSTATUS 0xC0000001
.....................................Unable to read image header for fdc.sys at fdfc2000 - NTSTATUS 0xC0000001
...Unable to read image header for flpydisk.sys at fde4a000 - NTSTATUS 0xC0000001
.Unable to read image header for Fs_Rec.SYS at fe0c8000 - NTSTATUS 0xC0000001
.Unable to read image header for Null.SYS at fe2c4000 - NTSTATUS 0xC0000001
...................Unable to read image header for win32k.sys at a0000000 - NTSTATUS 0xC0000001
..Unable to read image header for dxg.sys at a0194000 - NTSTATUS 0xC0000001
.......Unable to read image header for ati2draa.dll at a01a4000 - NTSTATUS 0xC0000001
..Unable to read image header for ParVdm.SYS at fe116000 - NTSTATUS 0xC0000001
.......
Loading unloaded module list
..............
Loading User Symbols
Unable to retrieve the PEB address. This is usually caused
by being in the wrong process context or by paging

会出现同样的警告,但是符号本身已经可用了:

kd> x fs_Rec!*
fe0c8358  Fs_Rec!_imp___allmul
fe0c8310  Fs_Rec!_imp__IoCreateDevice
fe0c835c  Fs_Rec!_imp___allshr
........
fe0c8360  Fs_Rec!ntoskrnl_NULL_THUNK_DATA
fe0c832c  Fs_Rec!_imp__KeSetEvent
fe0c9570  Fs_Rec!_NULL_IMPORT_DESCRIPTOR

不使用符号调试用户模式进程

在启动调试器调试用户模式错误之前获得符号文件是很重要的。但是有时候调试器在没有符号的情况下启动起来。如果问题很容易重现,可以复制符号再来一次。但是如果问题难以重现,还是可以搜集一些错误的信息:

  1. 要计算出地址的意义,需要有一台和出问题的机器一样的计算机。他需要有相同的平台 (x86、Intel Itanium或x64)并且加载相同版本的Windows。
  2. 配置好计算机后,将用户模式符号和二进制文件复制到用于调试的新机器上。
  3. 在没有符号的机器上启动CDB或WinDbg。
  4. 如果不知道无符号及其上哪个程序出错了,可以使用| (Process Status) 命令。如果这样不能知道名字,在无符号机器上中断到KD,并执行!process 0 0,查找CDB命令中给出的进程ID。
  5. 设置好了两个调试器之后——一个有符号但是没有遇到错误,另一个遇到错误但是没有符号——在无符号机器上执行k (Display Stack Backtrace)命令。
  6. 在有符号机器上,对每个无符号机器上调用堆栈显示出来的地址执行u (Unassemble) 命令。这样就可以得到无符号机器上的错误的调用堆栈。

通过查看调用堆栈,可以找到调用相关的模块和函数。

posted @ 2008-05-28 13:27 NetRoc 阅读(1956) | 评论 (2)编辑 收藏

仅列出标题
共10页: First 2 3 4 5 6 7 8 9 10 

导航

统计

常用链接

留言簿(7)

随笔档案(99)

文章分类(35)

文章档案(32)

Friends

Mirror

搜索

最新评论

阅读排行榜

评论排行榜