![]() |
|
Spaces home netroc的共享空间ProfileFriendsBlogMore ![]() | ![]() |
netroc的共享空间 |
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
感谢访问! |
August 18 WinDbg 文档翻译----91cc682/NetRoc http://netroc682.spaces.live.com/ !evlog!evlog 扩展命令用于显示、修改或者备份事件日志(event log)。 语法!evlog addsource [-d] [-s Source] [-t Type] [-f MsgFile] 参数addsource 将一个事件源(event source)加入到注册表中。默认情况下,只会添加来自DebuggerExtensions 的事件(用于支持!evlog report)。 backup 对指定的事件日志创建一个备份,并且写入到文件中。 clear 清除指定的事件日志,并且选择性的创建一个文件用于保存它的旧内容。 info 显示事件日志的摘要信息。 option 设置默认的搜索选项。这些选项用于之后的!evlog read 命令。 read 显示记录到指定的事件日志中的事件清单。输出的详细程度 — 例如要显示的记录条数和排序方式 — 可以通过!evlog read 的参数或者之前使用!evlog option 来控制。 report 将某个事件记录写入应用程序事件日志(application event log)中。 -d 指定要使用的所有默认值。-d 选项仅在省略了其他所有参数时需要使用。但是,和!evlog option 一起使用时可以用来显示已存在的默认设置。 -! 和!evlog option一起使用来重置为默认选项。和!evlog clear一起使用 阻止创建备份文件。 Source 指定事件源。默认值为DebuggerExtensions。 Type 指定成功类型(success type)。可能的Type值有 1 (Error)、 2 (Warning)、 4 (Information)、 8 (Audit_Success)、或者16 (Audit_Failure)。值为0表示成功。对于 !evlog read 和!evlog report,默认是成功Success (0)。对于!evlog addsource,可以结合使用这些位,并且默认设置了所有位(31)。 MsgFile 指定消息文件的路径和文件名。如果省略路径,则使用当前Uext.dll所在目录。 EventLog 对于!evlog read、!evlog backup、和!evlog clear,EventLog 指定要读取哪个事件日志。可能的值有Application、System、和Security。默认为Application。 对于!evlog option, EventLog 指定要设置最大数量(maximum count)的事件日志。可能的值有All、Application、System和 Security。默认为All。 BackupFile 指定备份文件的路径和文件名。默认位置是当前目录。默认文件名是EventLog_backup.evt,EventLog 是在该命令中使用的事件日志。如果文件已经存在,命令会终止执行。 Count 指定要获取的记录的最大数量。默认为20。 -+ 指定用后面的!evlog read命令获取的最大记录数量作为当前最大记录数量。(换句话说,只要前面没有进行过搜索就不会显示出记录来。) RecordBound 指定之后的!evlog read 命令能获取的最大记录数量。如果指定0,则不会有限制 — 这是默认。 Record 如果没有包含-n Count,-r Record 用于指定要获取的记录条数。如果包含了-n Count,Record用于指定显示从第几条记录开始。 Order 指定搜索顺序,可以是Forwards 或Backwards。默认为Forwards。反向搜索会从最近一次记录到事件日志中的记录开始,并且反方向进行搜索直到找到匹配项。 Width 指定数据显示的宽度,以字符为单位。这是在Data部分的显示宽度。默认为8个字符。 ID 指定事件之前要显示的前缀。可以使用的值有 0 (no prefix)、 1000 (Information)、2000 (Success)、 3000 (Warning)、和 4000 (Error)。默认为0。 Category 指定事件种类。可使用的值有0 (no category)、 1 (Devices)、 2 (Disk)、 3 (Printers)、 4 (Services)、 5 (Shell)、6 (System_Event)和 7 (Network)。默认为0。 Message 指定要添加到事件描述中的文本消息。 Option 指定要显示某个!evlog 选项的帮助文本。 -? 在调试器命令窗口中显示该扩展命令的简短帮助。 DLL
!evlog 扩展只能在活动调试时使用。 注释使用!evlog addsource 在注册表中添加了事件源之后,可以使用!dreg命令来查看它的值。例如: 0:000> !dreg hklm\system\currentcontrolset\services\eventlog\Application\<source>!* !evlog option 命令用于为!evlog read 设置新的默认值。这可以避免在重复使用!evlog read 时每次都需要输入所有参数。使用-+参数或者-r Records 参数可以为搜索进行限制,在搜索了指定数量的记录之后终止命令。如果仅对某个事件之后的记录感兴趣,那么这种限制是很有用的。 使用!evlog report前,应该用!evlog addsource 来在注册表中配置事件源。这种配置之后,事件查看器就可以识别各种事件ID了。 下面是!evlog info 扩展命令的示例: 0:000> !evlog info -? !findstack!findstack 扩展命令用于在所有调用堆栈中定位包含指定符号或模块的位置。 语法!findstack Symbol [DisplayLevel] 参数Symbol 指定符号或者模块。 DisplayLevel 指定显示中要包含的内容。可以是下面这些值中的一个,默认值是1。 0 仅显示每个包含Symbol的线程的ID。 1 显示包含Symbol的每个线程的ID和frame。 2 显示每个包含Symbol的线程的整个调用堆栈。 -? 在调试器命令窗口中显示该扩展命令的简单帮助。 DLL
注释内核模式下的!stacks命令可以显示所有线程的调用堆栈和状态摘要信息。 下面是该扩展命令输出的示例: 0:023> !uext.findstack wininet 附加信息关于堆栈回溯和显示调用堆栈的其他方式的信息,查看查看调用堆栈和k, kb, kd, kp, kP, kv (Display Stack Backtrace) 命令。 !gatom!gatom 扩展用于显示全局atom表(global atom table)。 语法!gatom DLL
附加信息关于全局atom表的信息,查看Microsoft Windows SDK文档。 !igrep!igrep 扩展命令在反汇编中搜索指定的模板。 语法!igrep [Pattern [StartAddress]] 参数Pattern 指定要搜索的模板。如果省略,则使用前一次的Pattern。 StartAddress 指定开始搜索的16进制地址。如果省略,则使用当前程序计数器。 DLL
!locks (!ntsdexts.locks)Ntsdexts.dll中的!locks 扩展命令显示当前进程关联的临界区(critical section)的清单。 该扩展命令不要和!kdext*.locks 命令混淆。 语法!locks [Options] 参数Options 指定要显示的信息数量。可以是下面这些选项的任意组合: -v 显示所有临界区,包括当前没有被持有的那些。 -o (Windows XP和之后) 仅显示孤立的信息(orphaned information)(没有指向合法的临界区的指针)。 DLL
注释该扩展命令会显示所有通过调用RtlInitializeCriticalSection 初始化的临界区。如果没有临界区,那么不会产生输出。 示例如下: 0:000> !locks 附加信息关于可以显示临界区信息的其他命令和扩展命令,查看显示临界区。关于临界区的信息,查看Microsoft Windows SDK文档、Windows Driver Kit (WDK)文档,以及Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals。 !runaway!runaway扩展命令显示每个线程消费的时间。 语法!runaway [Flags] 参数Flags 指定要显示哪些信息。Flags 可以是下面这些位的任意组合。默认值为0x1: Bit 0 (0x1) 让调试器显示每个线程消耗的用户模式时间(user time)。 Bit 1 (0x2) 显示每个线程消耗的内核时间(kernel time)。 Bit 2 (0x4) 显示每个线程从创建开始经历了多少时间。 DLL
!runaway 扩展命令只能在活动调试时,或者调试通过.dump /mt 或.dump /ma创建的dump文件时使用。 注释该扩展命令可以用来快速找出哪些线程循环失去控制消耗了太多CPU时间。 输出中以调试器的内部线程号和16进制线程ID来标识每个线程。还会显示调试器ID。 下面是示例:
附加信息关于用户模式下线程的信息,查看控制进程和线程。关于对进程和线程进行分析的信息,查看Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals。 !threadtoken!threadtoken 扩展命令显示当前线程的模拟状态(impersonation state)。 语法!threadtoken DLL
注释!threadtoken 扩展命令在Windows XP和之后版本中已经废除。使用!token 来替代。 如果当前线程处于模拟状态下(impersonating),那么会显示它使用的令牌(token)。 否则,会出现"Thread is not impersonating"信息。并且显示进程的令牌。 令牌的显示的格式和使用!handle 来显示令牌句柄时一样。 下面是示例: 0:000> ~ 附加信息关于线程和模拟的信息,查看线程和模拟(impersonation)的信息,查看Microsoft Windows SDK 文档,以及Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals。 !uniqstack!uniqstack 扩展命令显示当前进程中所有线程的调用堆栈,除开重复的那些。 语法!uniqstack [ b | v | p ] [ n ] 参数b 显示中包含传递给每个函数的前3个参数。 v 显示帧指针省略信息(frame pointer omission (FPO) information)。在x86处理器上,还会显示调用约定的信息。 p 显示调用堆栈中每个函数的完整参数。会列出每个参数的数据类型、名字和值。需要完整符号信息。 n 显示帧序号(frame number)。 DLL
注释除了不显示重复的调用堆栈之外,该命令和k, kb, kd, kp, kP, kv (Display Stack Backtrace) 命令类似。 例如: 0:000> !uniqstack 附加信息关于堆栈回溯的更多信息和其它显示调用堆栈的方法,查看查看调用堆栈。 !vadump!vadump 扩展命令显示所有的虚拟内存区域以及它们对应的保护信息。 语法!vadump [-v] 参数-v 显示中还包含每个原始分配区域(original allocation region)的信息。由于每个区域中的不同地址在分配之后可能改变成了自己的保护属性(例如使用VirtualProtect),所以大区域的原始保护属性可能和内部的子区域不一样。 DLL
注释下面是示例: 0:000> !vadump 输出重,State 行显示从BaseAddress 开始的内存范围的状态。可能的状态值有MEM_COMMIT、MEM_FREE和MEM_RESERVE。 Protect 行显示内存区域的保护状态。可能的值有PAGE_NOACCESS、PAGE_READONLY、PAGE_READWRITE、PAGE_EXECUTE、PAGE_EXECUTE_READ、PAGE_EXECUTE_READWRITE、PAGE_WRITECOPY、PAGE_EXECUTE_WRITECOPY和PAGE_GUARD。 Type 行显示内存种类。可能的值有MEM_IMAGE、MEM_MAPPED和MEM_PRIVATE。 下面是使用-v参数的示例: 0:000> !vadump -v 使用-v时,AllocationProtect行显示整个区域被创建时的默认保护属性。Protect行显示指定地址处实际的保护属性。 附加信息要查看单个虚拟地址的内存保护信息,可以使用!vprot。关于内存保护的信息,查看Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals。 !vprot!vprot 扩展命令显示虚拟内存保护信息。 语法!vprot [Address] 参数Address 指定要查看内存保护状态的16进制地址。 DLL
注释!vprot 扩展命令可以用于活动调试和dump文件调试。 下面是示例: 0:000> !vprot 30c191c 输出中, AllocationProtect 行显示整个区域被创建时设置的默认保护属性。注意该区域中各个单独的地址可能在之后更改了保护属性(例如调用了VirtualProtect)。Protect行显示指定地址处实际的保护属性。保护属性的值有PAGE_NOACCESS、PAGE_READONLY、PAGE_READWRITE、PAGE_EXECUTE、 PAGE_EXECUTE_READ、PAGE_EXECUTE_READWRITE、PAGE_WRITECOPY、PAGE_EXECUTE_WRITECOPY和 PAGE_GUARD。 State行对应传递给 !vprot 的虚拟地址。可能的状态有MEM_COMMIT、MEM_FREE、和MEM_RESERVE。 Type行显示内存类型。可能的值有MEM_IMAGE、MEM_MAPPED和 MEM_PRIVATE。 附加信息要查看目标进程拥有的所有内存区域的保护信息,可以使用!vadump。关于内存保护的信息,查看Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals。 August 12 WinDbg 文档翻译----90cc682/NetRoc http://netroc682.spaces.live.com/ 用户模式扩展命令本小节中的参考用于描述主要在用户模式调试时使用的扩展命令。 调试器会自动加载这些扩展命令的适当版本。如果不是自己已经加载了一个不同的版本,那么就不需要关心所使用的DLL版本。查看使用调试器扩展命令获得默认模块搜索顺序的说明。查看加载调试器扩展DLL获得关于加载扩展模块的说明。 每个扩展命令的参考部分都列出了导出该命令的DLL。可以用下面的规则来判断扩展DLL是从什么地方加载的:
另外,和操作系统不相关的那些用户模式扩展放在winext\Uext.dll中。 !avrf!avrf扩展用于控制Application Verifier的设置,并且显示由Application Verifier产生的各种输出。 语法!avrf 参数-a Address 指定一个地址。会显示包含这个地址的内存分配记录、以这个地址为开始的内存释放操作记录。如果该选项前面没有 –cs、 -hp或者 –vs,那么会搜索light heap。 -cs 显示临界区(critical section)的删除日志。详细信息查看Application Verifier 文档中的"Critical Section Delete Logs"。 -hp 显示堆操作日志。详细信息查看Application Verifier 文档中的"Heap Operation Logs"。 -vs 显示虚拟地址空间(virtual space)操作日志。详细信息,查看Application Verifier 文档中的"Virtual Space Operation Logs"。 -dlls 显示DLL的加载/卸载日志。详细信息查看Application Verifier 文档中的"DLL Load/Unload Logs"。 -ex 显示异常日志。详细信息查看Application Verifier 文档中的"Exception Logs"。 Length 指定要显示的记录数量。如果使用了-dlls 或者-ex 选项,则可以省略Length来显示所有的DLL 加载/卸载操作或者所有异常记录。 -cnt 显示全局计数器(global counter)的清单。 -trm 显示所有终止和挂起线程的日志。 -threads 显示目标进程中线程的信息。对于子线程,还会显示堆栈大小和由父线程指定的CreateThread 标志。 ThreadID 指定要显示的线程ID。省略时显示所有线程。 -trace TraceIndex 显示指定的TraceIndex 的调用堆栈。一些结构用到了这个16位索引来标识调用堆栈。这个索引指向调用堆栈数据库(stack trace database)中的位置。如果正在分析这样的结构,那么这个选项非常有用。 -brk 表明这是一个break-event命令。不带参数适用 !avrf -brk 时,会显示break event设置。可以在 文档的 "Requesting Breaks on Certain Events" 中查看示例。 BreakEventType 指定break event 的type number 。查看Application Verifier 文档的"Requesting Breaks on Certain Events"获得可用type的列表。 -flt 表示这是一个fault-injection 命令。不带参数使用!avrf –flt时,显示当前的fault injection 设置。查看Application Verifier 文档中的"Choosing Which Events to Fault"获得示例。 EventType 指定event的type number。查看Application Verifier 文档中的"Choosing Which Events to Fault"获得可能的type的列表。 Probability 指定该event将会失败的频率。可以是从0到100(0x64)之间的任意整数。 break 让每次该fault 被inject时,Application Verifier 都中断到调试器中。这种中断的示例,查看Application Verifier 文档中的"Choosing Which Events to Fault"。 stacks 显示最近一次fault-injected 操作的调用堆栈。查看Application Verifier 文档的"Choosing Which Events to Fault"获得示例。 -trg 表明这是一个target range 命令。 不带参属使用 –trg时,显示当前的target range。详细信息查看Application Verifier 文档中的"Choosing Where to Fault"。 -skp 表示这是一个exclusion range 命令。不带参数使用-trg时,显示当前的target range。详细信息查看Application Verifier 文档中的"Choosing Where to Fault"。 Start 指定target range 或者exclusion range 的开始地址。 End 指定target range 或者exclusion range 的结束地址。 Module 指定要targeted 或者excluded 的模块名。Module是完整的模块名,包括.exe 或.dll 扩展名。不能含有路径信息。 all 使得所有的target range或者exclusion range重置。 Time 恢复执行后的Time毫秒内消除任何fault。 DLL
注释不带参数使用!avrf 扩展时,会显示当前的Application Verifier选项。如果已经启用了Full page heap 或者Fast fill heap选项,那么还会显示active page heap的信息。查看Application Verifier 文档中的 "Heap Operation Logs"获得示例。 如果发生了Application Verifier Stop,不带参数的!avrf 扩展会显示停止的类型以及原因。查看Application Verifier 文档中的"Debugging Application Verifier Stops" 获得示例。 如果没有ntdll.dll 和verifier.dll 的符号,那么!avrf 扩展会产生错误信息。关于如何定位这种问题的信息,查看Application Verifier 文档中的"Setting Up a Debugger for Application Verifier"。 附加信息关于如何下载和安装Application Verifier ,以及它的文档的信息,查看Application Verifier。 !critsec!critsec 扩展命令显示某个临界区(critical section)。 语法!critsec Address 参数Address 指定临界区的16进制地址。 DLL
注释如果不知道该临界区的地址,可以使用!ntsdexts.locks 扩展。它会显示由调用RtlInitializeCriticalSection 来初始化的所有临界区。 下面是示例: 0:000> !critsec 3a8c0e9c 附加信息关于其他可以显示临界区信息的命令,查看显示临界区。关于临界区的信息,查看Microsoft Windows SDK文档、Windows Driver Kit (WDK) 文档,以及Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals。 !dp (!ntsdexts.dp)Ntsdexts.dll中的!dp 扩展命令显示一个CSR进程。 不要将该命令和dp (Display Memory) 命令或者 !kdext*.dp扩展命令混淆。 语法!dp [v] [ PID | CSR-Process ] 参数v 详细模式。显示中包含结构和线程列表。 PID 指定CSR进程的进程ID。 CSR-Process 指定CSR进程的16进制地址。 DLL
注释该命令会显示进程地址、进程ID、序号(sequence number)、标志(flags)和引用计数。如果选择了详细模式,还会显示更多细节以及每个进程的线程信息。 如果没有指定进程,则会显示所有进程。 参见!dphdump!dphdump 扩展命令显示debug page heap。 语法!dphdump Address 参数Address 指定堆的基地址或者堆句柄。 DLL
注释如果在Windows 2000(Service Pack 1或之后)、Windows XP或之后版本Windows中查看page heap,应该使用!heap 扩展命令。 参见!dphfind!dphfind 扩展命令查找包含指定地址的debug page heap。 语法!dphfind Address 参数Address 指定debug page heap必须包含的16进制地址。 DLL
注释Address一般是应用程序尝试访问从debug page heap中分配的内存时出错的地址。 如果在Windows 2000(Service Pack 1或之后)、Windows XP或之后版本Windows中查看page heap,应该使用!heap 扩展命令。 参见!dphflags!dphflags 扩展命令显示或设置global page heap flags。 语法!dphflags [FLAGS] 参数FLAGS 可以是下面这些位的任意组合: Bit 0 (0x1) 使得调试器启用page heap。(99%的情况下都会希望设置这一位。如果为0,则使用标准堆。) Bit 1 (0x2) 使得调试器搜集调用堆栈。(一般只在checked build上面才会设置。) Bit 2 (0x4) 让调试器最小化对内存的影响。 Bit 3 (0x8) 指定最小化(minimization)方法。如果设置了这一位,最小化是随机进行的。如果为0,则基于大小范围(size range)进行最小化。(如果没有设置bit 2(0x4),则这个设置被忽略。) Bit 4 (0x10) 让调试器捕获反向溢出(backward overrun)。 Bits 15 to 8 指定可用内存的百分比(相对于总内存),低于可以从标准堆中进行分配的大小。仅当设置了bit 2(0x4)时起效。 Bits 31 to 16 指定在page heap中分配的机率。只有当bit 2(0x4)和bit 3(0x8)设置时起效。需要指定两个大小:小一点的位于bit 31到bit 24,大一点的在bit 23到bit 16。大小处于这两个值之间的内存分配将从page heap中分配。 DLL
注释如果在Windows 2000(Service Pack 1或之后)、Windows XP或之后版本Windows中查看page heap,应该使用!heap 扩展命令。 这里有一些示例。下面的命令在free build上启用调用堆栈的搜集。(默认情况下不会): !dphflags 0x03 下面的命令将不可访问的页面放到分配(allocation)的开始位置。并且启用调用堆栈的跟踪: !dphflags 0x13 下面的命令使得有48%可能性从page heap中分配。同样,如果可用内存低于48%,则所有分配都会从标准堆中进行: !dphflags 0x3000300F 参见!dphhogs!dphhogs 扩展用于显示debug page heap hogs。 语法!dphhogs Address [count] [reset] 参数Address 指定堆的基地址或者堆句柄。 count 列表按照count来排序(而不是按字节)。 reset 所有的allocation counts重置为0。 DLL
注释这个命令只能用于运行在x86处理器上的checked版本Windows NT 4.0。 如果在Windows 2000(Service Pack 1或之后)、Windows XP或之后版本Windows中查看page heap,应该使用!heap 扩展命令。 参见!dreg!dreg 扩展命令显示注册表信息。 语法!dreg [-d|-w] KeyPath[!Value] 参数-d 二进制数据显示为DWORD。 -w 二进制数据显示为WORD。 KeyPath 指定注册表路径。可以使用下面这些缩写: hklm HKEY_LOCAL_MACHINE hkcu HKEY_CURRENT_USER hkcr HKEY_CLASSES_ROOT hku HKEY_USERS 如果没有使用缩写,则假定使用HKEY_LOCAL_MACHINE。 Value 指定要显示的注册表值。星号(*)可以代表任何值。如果省略Value,则显示所有子键。 DLL
注释!dreg 扩展用于在用户模式调试时显示注册表。 在远程调试时由于可以查看远程机器的注册表,所以非常有用。从内核调试器控制用户模式调试器时也很有用,因为目标机冻结的时候是不能运行标准的注册表编辑器的。(这时也可以使用.sleep 命令。查看从内核调试器控制用户模式调试器获得详细信息。) 由于信息是按照容易阅读的格式显示的,所以本地调试时也有用。 如果在内核模式调试时使用!dreg结果显示的是主控机上面的,而不是目标机上的。要显示目标机上的原始注册表信息,可以使用!reg扩展命令来替代。. 这里有一些示例。下面这个显示指定的注册表键下面所有子键: !dreg hkcu\Software\Microsoft 下面显示指定的注册表键下面所有值: !dreg System\CurrentControlSet\Services\Tcpip!* 这条命令显示指定的注册表键下面的Start键值: !dreg System\CurrentControlSet\Services\Tcpip!Start 不带参数使用!dreg 会在调试器命令窗口中显示该命令的简单帮助。 附加信息关于注册表的信息,查看Windows Driver Kit (WDK) 文档,以及Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals。 !dt!dt 扩展命令显示某个CSR线程的信息。 该命令不能和dt (Display Type)命令混淆。 语法!dt [v] CSR-Thread 参数v 详细输出。 CSR-Thread 指定CSR线程的16进制地址。 DLL
注释该扩展命令显示CSR线程关联的线程、进程、client ID、标志和引用计数。如果使用了详细模式,输出中还包含list pointer、线程句柄和等待块(wait block)。 参见August 11 WinDbg 文档翻译----89cc682/NetRoc http://netroc682.spaces.live.com/ !vm!vm扩展命令显示目标系统中虚拟内存使用统计的摘要信息。 语法Windows NT 4.0的语法 !vm Windows 2000和之后的语法 !vm [Flags] 参数Flags (Windows 2000和之后) 指定命令输出中要显示哪些信息。可以是下面这些位的任意的和。默认值是0,会显示系统范围的内存使用统计,以及每个进程的内存统计。 Bit 0 (0x1) 不显示进程相关的统计。 Bit 1 (0x2) 显示内存管理线程的调用堆栈。 Bit 2 (0x4) (Windows XP和之后) 显示终端服务器(terminal server)的内存使用情况。 Bit 3 (0x8) (Windows XP和之后) 显示页面文件写日志(page file write log)。 Bit 4 (0x10) (Windows XP和之后) 显示工作集所有者线程的调用堆栈(working set owner thread stacks)。 Bit 5 (0x20) (Windows XP和之后) 显示内核的虚拟内存使用情况。 DLL
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||