NetRoc's Blog

N-Tech

 

WinDbg 文档翻译----72

cc682/NetRoc

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

!help

!help 命令显示扩展DLL中的扩展命令的帮助文本。

不要将该命令和? (Command Help).help (Meta-Command Help)混淆。

语法

![ExtensionDLL.]help [-v] [CommandName

参数

ExtensionDLL

显示指定的扩展DLL的帮助。使用不带.dll扩展名的文件名。如果该DLL不在扩展搜索路径 (使用.chain (List Debugger Extensions)来显示)中,则需要包含路径。例如,要显示uext.dll的帮助,需要输入!uext.help!Path\winext\uext.help

如果省略ExtensionDLL,调试器将显示已加载的扩展DLL列表中第一个的帮助文本。

-v

尽可能显示最详细的帮助文本。该功能可能不是每个DLL都支持。

CommandName

仅显示指定命令的帮助文本。不是所有DLL都支持该功能。

DLL

大多数扩展DLL都支持这条命令。

注释

一些命令本身也可以在使用/?或者-? 参数时显示帮助文本。

!homedir

!homedir 设置符号服务器和源码服务器使用的默认目录。

语法

!homedir Directory 
!homedir 

参数

Directory

指定要设置为主目录的新目录。

DLL

Windows NT 4.0

Dbghelp.dll

Windows 2000

Dbghelp.dll

Windows XP 和之后

Dbghelp.dll

注释

如果不带参数使用!homedir ,则显示当前的主目录。

如果没有特别指定的话,符号服务器的缓存位于主目录下的src 子目录。符号服务器的下游存储默认是在主目录下的sym子目录。

WinDbg启动时,主目录是Windows调试工具包安装目录。!homedir可以用来改变这个值。

!htrace

!htrace 扩展用于显示一个或多个句柄的堆栈回溯信息。

语法

用户模式语法

!htrace [Handle [Max_Traces]] 
!htrace -enable [Max_Traces]
!htrace -snapshot
!htrace -diff
!htrace -disable
!htrace -? 

内核模式语法

!htrace [Handle [Process [Max_Traces]]] 
!htrace -? 

参数

Handle

指定要显示堆栈回溯的句柄。如果Handle 为0 或者省略,则显示进程中所有句柄的堆栈回溯。

Process

(仅内核模式) 指定要显示句柄的进程。如果Process 为0或者省略,则使用当前进程。用户模式下总是使用当前进程。

Max_Traces

指定要显示的堆栈回溯的最大层数。用户模式下如果省略该参数,则显示目标进程中的所有堆栈回溯。

-enable

(仅用户模式) 启用句柄跟踪,并且为-diff 选项使用的初始状态产生第一次句柄信息的快照。

-snapshot

(仅用户模式) 抓取当前的句柄信息的快照用作-diff 选项的初始状态。

-diff

(仅用户模式) 将当前的句柄信息和上一次句柄快照的信息进行对比。显示所有仍然打开的句柄。

-disable

(仅用户模式;仅Windows Server 2003和之后的系统) 禁止句柄跟踪。在Windows XP中,只有结束目标进程才能禁用句柄跟踪。

-?

在调试器命令窗口中显示一些简要的帮助文本。

DLL

Windows NT 4.0

不可用

Windows 2000

不可用

Windows XP 和之后

Kdexts.dll
Ntsdexts.dll

注释

!htrace 能够使用之前,必须针对目标进程激活应用程序验证器(Application Verifier),并且必须选择 Detect invalid handle usage选项。通过激活应用程序验证器,进程每次打开句柄、关闭句柄或者饮用非法句柄时,都会保存堆栈回溯的信息。这就是!htrace 显示出来的那些堆栈回溯。详细信息,查看应用程序验证器

下面的例子显示了进程0x81400300中所有句柄的信息:

kd> !htrace 0 81400300
Process 0x81400300
ObjectTable 0xE10CCF60

--------------------------------------
Handle 0x7CC - CLOSE:
0x8018FCB9: ntoskrnl!ExDestroyHandle+0x103
0x801E1D12: ntoskrnl!ObpCloseHandleTableEntry+0xE4
0x801E1DD9: ntoskrnl!ObpCloseHandle+0x85
0x801E1EDD: ntoskrnl!NtClose+0x19
0x010012C1: badhandle!mainCRTStartup+0xE3
0x77DE0B2F: KERNEL32!BaseProcessStart+0x3D
--------------------------------------
Handle 0x7CC - OPEN:
0x8018F44A: ntoskrnl!ExCreateHandle+0x94
0x801E3390: ntoskrnl!ObpCreateUnnamedHandle+0x10C
0x801E7317: ntoskrnl!ObInsertObject+0xC3
0x77DE23B2: KERNEL32!CreateSemaphoreA+0x66
0x010011C5: badhandle!main+0x45
0x010012C1: badhandle!mainCRTStartup+0xE3
0x77DE0B2F: KERNEL32!BaseProcessStart+0x3D
--------------------------------------
Handle 0x7DC - BAD REFERENCE:
0x8018F709: ntoskrnl!ExMapHandleToPointerEx+0xEA
0x801E10F2: ntoskrnl!ObReferenceObjectByHandle+0x12C
0x801902BE: ntoskrnl!NtSetEvent+0x6C
0x80154965: ntoskrnl!_KiSystemService+0xC4
0x010012C1: badhandle!mainCRTStartup+0xE3
0x77DE0B2F: KERNEL32!BaseProcessStart+0x3D
--------------------------------------
Handle 0x7DC - CLOSE:
0x8018FCB9: ntoskrnl!ExDestroyHandle+0x103
0x801E1D12: ntoskrnl!ObpCloseHandleTableEntry+0xE4
0x801E1DD9: ntoskrnl!ObpCloseHandle+0x85
0x801E1EDD: ntoskrnl!NtClose+0x19
0x010012C1: badhandle!mainCRTStartup+0xE3
0x77DE0B2F: KERNEL32!BaseProcessStart+0x3D
--------------------------------------
Handle 0x7DC - OPEN:
0x8018F44A: ntoskrnl!ExCreateHandle+0x94
0x801E3390: ntoskrnl!ObpCreateUnnamedHandle+0x10C
0x801E7317: ntoskrnl!ObInsertObject+0xC3
0x77DE265C: KERNEL32!CreateEventA+0x66
0x010011A0: badhandle!main+0x20
0x010012C1: badhandle!mainCRTStartup+0xE3
0x77DE0B2F: KERNEL32!BaseProcessStart+0x3D

--------------------------------------
Parsed 0x6 stack traces.
Dumped 0x5 stack traces.

附加信息

关于句柄的更多信息,查看Microsoft Windows SDK 文档,以及Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals 。要显示指定句柄的信息,查看!handle扩展命令。

!imggp

!imggp 扩展显示64位映像的全局指针目录中的条目(global pointer (GP) directory entry)的值。

语法

!imggp Address 

参数

Address

指定映像的基地址。

DLL

Windows NT 4.0

Ext.dll

Windows 2000

Ext.dll

Windows XP 和之后

Ext.dll

!imgreloc

!imgreloc 扩展显示每个已加载模块的地址,以及重定位之前它们原本的地址。

语法

!imgreloc Address 

参数

Address

指定映像的基地址。

DLL

Windows NT 4.0

Ext.dll

Windows 2000

Ext.dll

Windows XP 和之后

Ext.dll

注释

下面是一个示例:

0:000> !imgreloc 00400000
00400000 Prymes - at preferred address
010e0000 appvcore - RELOCATED from 00400000
5b2f0000 verifier - at preferred address
5d160000 ShimEng - at preferred address

!kuser

!kuser 扩展显示共享的用户模式页面 (KUSER_SHARED_DATA)。

语法

!kuser 

DLL

Windows NT 4.0

Kdextx86.dll
Ntsdexts.dll

Windows 2000

Kdextx86.dll
Ntsdexts.dll

Windows XP 和之后

Exts.dll

注释

KUSER_SHARED_DATA 页面包含当前登录用户的资源和其他信息。

这里是一个示例。注意例中tick count 使用原始格式和圆括号中的更可读的格式显示了两次。这种可读格式仅在Windows XP和之后的系统中可用。

kd> !kuser
_KUSER_SHARED_DATA at 7ffe0000
TickCount:    fa00000 * 00482006 (0:20:30:56.093)
TimeZone Id: 2
ImageNumber Range: [14c .. 14c]
Crypto Exponent: 0
SystemRoot: 'F:\WINDOWS'

!list

!list 扩展为链表中每个成员都执行指定的调试器命令。

语法

!list -t [Module!]Type.Field -x "Commands" [-a "Arguments"] [OptionsStartAddress 
!list " -t [Module!]Type.Field -x \"Commands\" [-a \"Arguments\"] [OptionsStartAddress " 
!list -h 

参数

Module

用于指定定义该结构的模块的可选参数。如果Type 可能匹配另外的模块中的合法符号,则需要包含Module 来避免混淆。

Type

指定数据结构的名字。

Field

指定包含链表的字段。这实际上可以是以点号分隔的字段序列(即 Type.Field.Subfield.Subsubfield,等等)。

-x "Commands"

指定要执行的命令。可以是任何调试器命令的组合。必须用括号括起来。如果指定了多条命令,需要用分号来分隔它们,并且将整个!list 的参数集合用引号括起来,并且对引号中的其他引号使用转义字符( \ )。如果省略Commands,默认命令是 dp (Display Memory)

-a "Arguments"

指定传递给Commands的参数。必须包含在引号中。Arguments除了不能包含银号之外,可以是允许跟在命令后的任意合法参数的字符串。如果Commands 中包含伪寄存器$extret,可以省略 -a "Arguments" 参数。

Options

可以是任意数量的下面这些选项:

-e

回显对每个成员执行的命令。

-m Max

指定要执行命令的成员的最大个数。

StartAddress

指定第一个数据结构的地址。这可以是结构的首地址,而不一定必须是链表字段的地址。

-h

在调试器命令窗口中显示该扩展命令的简单帮助文本。

DLL

Windows NT 4.0

Ext.dll

Windows 2000

Ext.dll

Windows XP 和之后

Ext.dll

注释

!list 扩展将会遍历列表,并对每个成员执行指定命令。

$extret 伪寄存器的值会设置成每个成员的链表入口(list-entry)的地址。对每个成员,都会执行命令字符串Commands 。该命令字符串可以使用@$extret 语法来引用这个伪寄存器。如果没有在命令字符串中使用它,在执行之前链表入扣的地址会被添加到末尾。如果想控制这个值出现在命令的什么位置,则必须显式指定该伪寄存器。

命令序列会一直运行直到遇到以null指针标识的链表结束位置,或者指向第一个成员的位置。如果链表循环回了非第一个成员的位置,则命令不会 结束。但是,可以在KD和CDB中使用CTRL+C,或者 WinDbg中使用Debug | BreakCTRL+BREAK 来停止。

每次执行命令时,如果命令字符串使用了可选的地址参数,则当前结构的地址会作为默认地址

下面是在用户模式下使用该命令的两个例子。注意内核模式下也可以使用但是语法不同。

首先是简单一点的例子,假设有一个名为MYTYPE 的结构,链表字段是.links.Flink.links.Blink。有一个从0x6BC000处的结构开始的链表。下面的命令会遍历该链表,并对每个成员执行一次dd L2 命令。由于dd 命令没有指定地址,所以会使用链表成员的地址。所以最后显示了每个结构的前两个DWORD。

0:000> !list -t MYTYPE.links.Flink -x "dd" -a "L2" 0x6bc00 

下面是更复杂一些的例子用来说明$extret 的使用。它会遍历RtlCriticalSectionList 的_LIST_ENTRY 类型的链表。对每个成员,显示开头的4个DWORD,然后显示以链表成员的Flink 字段之前8个字节开始的_RTL_CRITICAL_SECTION_DEBUG 结构。

0:000> !list "-t ntdll!_LIST_ENTRY.Flink -e -x \"dd @$extret l4; dt ntdll!_RTL_CRITICAL_SECTION_DEBUG @$extret-0x8\" ntdll!RtlCriticalSectionList"
dd @$extret l4; dt ntdll!_RTL_CRITICAL_SECTION_DEBUG @$extret-0x8
7c97c0c8  7c97c428 7c97c868 01010000 00000080
   +0x000 Type             : 1
   +0x002 CreatorBackTraceIndex : 0
   +0x004 CriticalSection  : (null)
   +0x008 ProcessLocksList : _LIST_ENTRY [ 0x7c97c428 - 0x7c97c868 ]
   +0x010 EntryCount       : 0x1010000
   +0x014 ContentionCount  : 0x80
   +0x018 Spare            : [2] 0x7c97c100

dd @$extret l4; dt ntdll!_RTL_CRITICAL_SECTION_DEBUG @$extret-0x8
7c97c428  7c97c448 7c97c0c8 00000000 00000000
   +0x000 Type             : 0
   +0x002 CreatorBackTraceIndex : 0
   +0x004 CriticalSection  : 0x7c97c0a0
   +0x008 ProcessLocksList : _LIST_ENTRY [ 0x7c97c448 - 0x7c97c0c8 ]
   +0x010 EntryCount       : 0
   +0x014 ContentionCount  : 0
   +0x018 Spare            : [2] 0

!lmi

!lmi 扩展显示某个模块的详细信息。

语法

!lmi Module 

参数

Module

用名字或者基地址指定一个已加载的模块。

DLL

Windows NT 4.0

Dbghelp.dll

Windows 2000

Dbghelp.dll

Windows XP 和之后

Dbghelp.dll

注释

可以使用lm (List Loaded Modules) 命令获得模块基地址。

!lmi 扩展分析模块头,并格式化显示它包含的摘要信息。如果模块头被页换出了,则显示一条错误信息。要查看更多头信息,使用!dh 扩展命令。

该命令会显示很多具有不同标题的字段。某些标题有特殊的意义:

  • Image Name字段显示可执行文件名,包括扩展名。一般来说,用户模式下会包含完整路径,而内核模式下不会。
  • Module 字段显示模块名。它通常是没有扩展名的文件名。但是有些情况下模块名和文件名会有显著的不同。详细信息,查看可执行映像路径
  • Symbol Type 字段显示调试器会尝试用来加载该模块的符号的信息。各种状态值得说明,查看符号状态缩写。如果符号已经加载,则后面会跟符号的文件名。
  • Base Address显示模块的首地址。Size显示模块大小。 因此,如果Base Address 是"faab4000" 并且Size 是"2000",则模块是在0xFAAB4000 到0xFAAB5FFF范围内。

下面是一个例子:

0:000> lm 
start    end        module name
00400000 0042d000   Prymes     C (pdb symbols)              Prymes.pdb
77e80000 77f35000   KERNEL32     (export symbols)           C:\WINNT\system32\KERNEL32.dll
77f80000 77ffb000   ntdll        (export symbols)           ntdll.dll

0:000> !lmi 00400000
Loaded Module Info: [00400000] 
         Module: Prymes
   Base Address: 00400000
     Image Name: Prymes.exe
   Machine Type: 332 (I386)
     Time Stamp: 3c76c346 Fri Feb 22 14:16:38 2002
           Size: 2d000
       CheckSum: 0
Characteristics: 230e stripped 
Debug Data Dirs: Type Size     VA  Pointer
                 MISC  110,     0,   77a00 [Data not mapped]
    Symbol Type: EXPORT   - PDB not found
    Load Report: export symbols

例子中的Characteristics 行显示的缩写的说明,查看符号状态缩写

posted @ 2008-07-15 16:24 NetRoc 阅读(570) | 评论 (0)编辑 收藏

WinDbg 文档翻译----71

     摘要: cc682/NetRoc http://netroc682.spaces.live.com/ !handle !handle 扩展显示目标系统中一个或所有进程拥有的句柄的信息。 语法 用户模式 !handle [Handle [UMFlags [TypeName]]] !handle -?  内核模式 !ha...  阅读全文

posted @ 2008-07-15 16:23 NetRoc 阅读(803) | 评论 (0)编辑 收藏

WinDbg 文档翻译----70_2

     摘要: cc682/NetRoc http://netroc682.spaces.live.com/ !findxmldata !findxmldata 从包含内核模式小内存转储文件的CAB文件中提取XML数据。 语法 !findxmldata [ -d DeviceName | -h HwId ] !fi...  阅读全文

posted @ 2008-07-09 16:27 NetRoc 阅读(1128) | 评论 (0)编辑 收藏

WinDbg 文档翻译----70

cc682/NetRoc

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

!dh

!dh 扩展显示指定映像的头部。

语法

!dh [OptionsAddress 
!dh -h

参数

Options

下面的选项之一:

-f

显示文件头。

-s

显示节头。

-a

显示所有的头信息。

Address

指定映像的16进制地址。

-h

调试器命令窗口中显示该扩展命令的帮助文本。

DLL

Windows NT 4.0

Dbghelp.dll
Kdextx86.dll
Ntsdexts.dll

Windows 2000

Dbghelp.dll
Kdextx86.dll
Ntsdexts.dll

Windows XP和之后

Dbghelp.dll

 

注释

!lmi 扩展取出映像头中最重要的一些信息并且以简单摘要的方式显示出来。这个扩展要比!dh 更常使用一些。

!dlls

!dlls 扩展显示所有已加载模块或者指定线程或进程使用的所有模块。

语法

!dlls [Options] [LoaderEntryAddress
!dlls -h 

参数

Options

指定显示的级别。该参数可以是下面这些值的任意组合:

-f

显示文件头。

-s

显示节头。

-a

显示完整的模块信息(该选项相当于-f –s。)

-c ModuleAddress

(Windows 2000和之后) 显示包含ModuleAddress 的模块。

-i

(Windows 2000和之后) 按初始化顺序排序输出。

-l

(Windows 2000和之后) 按加载顺序排序输出。这是默认情况。

-m

(Windows 2000和之后) 按内存顺序排序输出。

-v

(Windows XP 和之后) 显示版本信息。该信息从每个模块的资源节中获取。

LoaderEntryAddress

指定模块的loader entry 地址。如果包含该参数,调试器只显示指定的模块。

-h

调试器命令窗口中显示该扩展命令的帮助文本。

DLL

Windows NT 4.0

Kdextx86.dll
Ntsdexts.dll

Windows 2000

Kdextx86.dll
Ntsdexts.dll

Windows XP和之后

Exts.dll

注释

模块列表中包含每个模块的入口点。

.dlls 扩展仅在活动调试时工作(分析崩溃转储时不能使用)。

内核模式下,该扩展显示当前的进程上下文的模块。不能对系统进程或空闲进程使用!dlls

下面是如何使用!dlls 扩展的示例。

kd> !dlls -c 77f60000
Dump dll containing 0x77f60000:

0x00091f38: E:\WINDOWS\System32\ntdll.dll
      Base   0x77f60000  EntryPoint  0x00000000  Size        0x00097000
      Flags  0x00004004  LoadCount   0x0000ffff  TlsIndex    0x00000000
             LDRP_IMAGE_DLL
             LDRP_ENTRY_PROCESSED

kd> !dlls -a 91ec0

0x00091ec0: E:\WINDOWS\system32\winmine.exe
      Base   0x01000000  EntryPoint  0x01003e2e  Size        0x00020000
      Flags  0x00005000  LoadCount   0x0000ffff  TlsIndex    0x00000000
             LDRP_LOAD_IN_PROGRESS
             LDRP_ENTRY_PROCESSED

File Type: EXECUTABLE IMAGE
FILE HEADER VALUES
     14C machine (i386)
       3 number of sections
3A98E856 time date stamp Sun Feb 25 03:11:18 2001

       0 file pointer to symbol table
       0 number of symbols
      E0 size of optional header
     10F characteristics
            Relocations stripped
            Executable
            Line numbers stripped
            Symbols stripped
            32 bit word machine

OPTIONAL HEADER VALUES
     10B magic #
    7.00 linker version
    3A00 size of code
   19E00 size of initialized data
       0 size of uninitialized data
    3E2E address of entry point
    1000 base of code
         ----- new -----
01000000 image base
    1000 section alignment
     200 file alignment
       2 subsystem (Windows GUI)
    5.01 operating system version
    5.01 image version
    4.00 subsystem version
   20000 size of image
     400 size of headers
   21970 checksum
00040000 size of stack reserve
00001000 size of stack commit
00100000 size of heap reserve
00001000 size of heap commit
01000100 Opt Hdr
       0 [       0] address [size] of Export Directory
    40B4 [      B4] address [size] of Import Directory
    6000 [   19170] address [size] of Resource Directory
       0 [       0] address [size] of Exception Directory
       0 [       0] address [size] of Security Directory
       0 [       0] address [size] of Base Relocation Directory
    11B0 [      1C] address [size] of Debug Directory
       0 [       0] address [size] of Description Directory
       0 [       0] address [size] of Special Directory
       0 [       0] address [size] of Thread Storage Directory
       0 [       0] address [size] of Load Configuration Directory
     258 [      A8] address [size] of Bound Import Directory
    1000 [     1B0] address [size] of Import Address Table Directory
       0 [       0] address [size] of Reserved Directory
       0 [       0] address [size] of Reserved Directory
       0 [       0] address [size] of Reserved Directory


SECTION HEADER #1
   .text name
    3992 virtual size
    1000 virtual address
    3A00 size of raw data
     400 file pointer to raw data
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
60000020 flags
         Code
         (no align specified)
         Execute Read


Debug Directories(1)
        Type       Size     Address  Pointer

        cv           1c        13d0      7d0    Format: NB10, 3a98e856, 1, winmi
ne.pdb

SECTION HEADER #2
   .data name
     BB8 virtual size
    5000 virtual address
     200 size of raw data
    3E00 file pointer to raw data
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
C0000040 flags
         Initialized Data
         (no align specified)
         Read Write

SECTION HEADER #3
   .rsrc name
   19170 virtual size
    6000 virtual address
   19200 size of raw data
    4000 file pointer to raw data
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
40000040 flags
         Initialized Data
         (no align specified)
         Read Only

!dumpfa

!dumpfa 扩展显示故障分析项(failure analysis entry)的内容。

语法

!dumpfa Address 

参数

Address

指定要显示的故障分析项的地址。

DLL

Windows NT 4.0

Ext.dll

Windows 2000

Ext.dll

Windows XP和之后

Ext.dll

注释

.dumpfa仅在调试!analyze 扩展时有用,下面是示例。

0:000> !dumpfa 0x00a34140
DataUsed 3b0
Type =        DEBUG_FLR_MARKER_BUCKET 00010016 - Size = 9
Type =          DEBUG_FLR_MARKER_FILE 0001000d - Size = 16
Type =      DEBUG_FLR_SYSXML_LOCALEID 00004200 - Size = 4
Type =      DEBUG_FLR_SYSXML_CHECKSUM 00004201 - Size = 4
Type =         DEBUG_FLR_READ_ADDRESS 0000000e - Size = 8
Type =          DEBUG_FLR_FAULTING_IP 80000000 - Size = 8
Type =     DEBUG_FLR_MM_INTERNAL_CODE 00001004 - Size = 8
Type = DEBUG_FLR_CPU_MICROCODE_VERSION 0000301f - Size = 28
Type = DEBUG_FLR_CUSTOMER_CRASH_COUNT 0000300b - Size = 8
Type =    DEBUG_FLR_DEFAULT_BUCKET_ID 00010008 - Size = 12
Type =         DEBUG_FLR_BUGCHECK_STR 00000600 - Size = 5
Type = DEBUG_FLR_LAST_CONTROL_TRANSFER 0000000a - Size = 18
Type =           DEBUG_FLR_TRAP_FRAME c0000002 - Size = 8
Type =           DEBUG_FLR_STACK_TEXT 00010005 - Size = 1fb
Type =        DEBUG_FLR_STACK_COMMAND 00010004 - Size = 17
Type =        DEBUG_FLR_OS_BUILD_NAME 0000301e - Size = 9
Type =          DEBUG_FLR_MODULE_NAME 00010006 - Size = 8
Type =           DEBUG_FLR_IMAGE_NAME 00010001 - Size = c
Type =      DEBUG_FLR_IMAGE_TIMESTAMP 80000002 - Size = 8

还可以使用 !asd 来调试!analyze 扩展。

!elog_str

!elog_str 扩展将一个字符串加入到事件日志中。

语法

!elog_str String 

参数

String

指定要添加到事件日志的字符串。

DLL

Windows NT 4.0

Ext.dll

Windows 2000

Ext.dll

Windows XP和之后

Ext.dll

注释

由于已注册的事件源不会发送String,所以该字符串以没有事件ID的警告形式出现在事件日志中。

!envvar

!envvar 扩展显示指定的环境变量的值。

语法

!envvar Variable 

参数

Variable

指定要显示值的环境变量。Variable 不区分大小写。

DLL

Windows NT 4.0

不可用

Windows 2000

不可用

Windows XP和之后

Exts.dll

注释

!envvar在用户模式和内核模式下都可以使用。但是,内核模式下当前进程是空闲线程(idle thread)时,指向进程环境块(PEB)的指针是NULL,所以该命令会失败。内核模式下!envvar 扩展显示目标机的环境变量,如下。

0:000> !envvar _nt_symbol_path
        _nt_symbol_path = srv*C:\mysyms*http://msdl.microsoft.com/download/symbols

附加信息

关于环境变量的更多信息,查看环境变量和Microsoft Windows SDK 文档。

!error

!error 扩展解码并显示错误码的信息。

语法

!error Value [Flags]

参数

Value

指定下面这些错误码中的一种:

  • Win32
  • Winsock
  • NTSTATUS
  • NetAPI

Flags

如果Flags 为1,则错误码被当作NTSTATUS代码。

DLL

Windows NT 4.0

Ext.dll

Windows 2000

Ext.dll

Windows XP和之后

Ext.dll

注释

下面的例子说明如何使用!error

0:000> !error 2
Error code: (Win32) 0x2 (2) - The system cannot find the file specified.
0:000> !error 2 1
Error code: (NTSTATUS) 0x2 - STATUS_WAIT_2

!exchain

!exchain 扩展显示当前的异常处理器链。

语法

!exchain [Options

参数

Options

下面这些值之一:

/c

显示调试C++ try/catch 异常相关的信息,如果检测到这种异常的话。

/C

即使没有检测到C++ try/catch 异常,也会显示它的相关的信息。

/f

显示通过遍历CRT函数表获得的信息,即使没有发现CRT异常处理器。

DLL

Windows NT 4.0

Ext.dll

Windows 2000

Ext.dll

Windows XP和之后

Ext.dll

!exchain 扩展仅在x86的机器上可用。

注释

!exchain 扩展显示当前线程的异常处理器列表。

列表以链中的第一个处理器开始(被给予异常的首个处理机会的处理器),并且继续直到结束。下面是该命令的一个示例。

0:000> !exchain
0012fea8: Prymes!_except_handler3+0 (00407604)
  CRT scope  0, filter: Prymes!dzExcepError+e6 (00401576)
                func:   Prymes!dzExcepError+ec (0040157c)
0012ffb0: Prymes!_except_handler3+0 (00407604)
  CRT scope  0, filter: Prymes!mainCRTStartup+f8 (004021b8)
                func:   Prymes!mainCRTStartup+113 (004021d3)
0012ffe0: KERNEL32!GetThreadContext+1c (77ea1856)

!exr

!exr 命令已经废除。使用.exr (Display Exception Record) 命令替代。

posted @ 2008-07-09 16:26 NetRoc 阅读(507) | 评论 (0)编辑 收藏

WinDbg 文档翻译----69

cc682/NetRoc

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

!chksym

!chksym 扩展测试一个符号文件对某个模块的有效性。

语法

!chksym <Module> [Symbol

参数

Module

用名字或基地址指定模块。

Symbol

指定符号文件名。

DLL

Windows NT 4.0

不可用

Windows 2000

不可用

Windows XP

不可用

Windows Vista和之后

Dbghelp.dll

 

注释

如果没有指定符号,则测试已加载符号。另外,如果指定了一个.pdb 或者.dbg 符号路径,则测试已加载符号和已加载模块。

!chkimg

!chkimg 扩展通过比较可执行文件映像和符号存储或者其他地方的拷贝,来检测其中被改动过的内容。

语法

!chkimg [Options] [-mmw LogFile LogOptions] [Module

参数

Options

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

-p SearchPath

在访问符号服务器之前先在SearchPath中递归搜索文件。

-f

修正映像中的错误。当检测到内存映像和符号存储中的文件有不同时,会将符号存储中的文件内容覆盖掉内存映像中的。如果在进行活动调试,可以在执行!chkimg -f 之前先创建一个dump文件。

-nar

避免符号服务器上文件的映射的映像被移动。默认情况下,当文件的拷贝位于符号服务器上并且被映射到内存中时,!chkimg 会移动符号服务器上的文件的映像。但是,如果使用了-nar 选项,则不会移动服务器上的文件映像。

已经在内存中的可执行映像(即被扫描的那个)会被移动,因为调试器总是会重定位它所加载的映像。这仅在操作系统已经移动了原始映像时有用。如果映像还没有被移动过,则!chkimg 和调试器会移动它。

一般都不需要使用这个开关。

-ss SectionName

将扫描限制在名字包含字符串SectionName 的节中。会扫描名字中包含该字符串的任何不可丢弃的节。SectionName 区分大小写,并且不能超过8个字符。

-as

扫描映像中除了可丢弃节之外的所有节。默认情况下,(如果没有使用-as或者-ss),扫描会跳过可写的节、不可执行的节、名字中有"PAGE"的节、以及可丢弃的节。

-r StartAddress EndAddress

将扫描限制在从StartAddress 开始,EndAddress 结尾的范围内。在该范围中,任何可以被扫描的节都会扫描。如果某个节和该范围只是部分重叠,则只扫描范围中的那部分。即使使用了-as或者-ss 开关,扫描还是被限制在指定范围中。

-nospec

使得扫描包括Hal.dllNtoskrnl.dll 中的保留节。默认情况下, !chkimg 不会检查这些文件的这部分节。

-noplock

显示相应的字节值分别为0x90(nop指令)和0xF0(lock指令)的位置。默认情况下,这些部位不会被显示出来。(详见注释部分,— 译者)

-np

使得被修改过的指令能被识别出来。Causes patched instructions to be recognized. .

-d

扫描时显示不匹配的区域的摘要信息。该摘要文本的详细信息,查看注释部分。

-db

以类似db 调试器命令的格式显示不匹配的区域。因此,每个显示行的开头是该行第一个字节的地址,后面跟最多16个16进制字节值。字节值后面跟相应的ASCII值。所有的不可打印字符,如回车和换行,都显示为点号(.)。不匹配的字节以星号(*)标识。

-lo lines

-d-db 显示的最大行数限制为lines

-v

显示详细信息。

-mmw

创建一个日志文件,并记录!chkimg 的活动情况。日志文件的每一行都对应单个不匹配的项。

LogFile

指定日志文件的完整路径。如果指定相对路径,则是相对于当前路径的。

LogOptions

指定日志文件的内容。LogOptions 是由各个字母组合起来的字符串。日志文件的每一行都包含由逗号分隔的几个列。这些列包含由选项字母指定的项,按照这些字母在LogOptions 中出现的顺序。可以包含下面这些选项多次,但是必须至少包含一个选项。

日志选项

日志文件中包含的信息

v

不匹配的内容的虚拟地址

r

不匹配内容在模块中的偏移(相对地址)

s

和不匹配内容地址对应的符号

S

包含不匹配内容的节的名字

e

不匹配位置的原始值

w

不匹配位置的当前值

 

LogOptions 也可以包含下面这些附加选项的一个、多个或者0个。

日志选项

作用

o

如果LogFile 名字的文件已经存在,则覆盖该文件。默认情况下,调试器会将新信息添加到已存在的文件末尾。

tString

在日志文件中添加一个额外的列。该列中每一项都包含StringtString 选项在将新信息添加到已存在的日志文件时,可以用来和旧的纪录区分开。在tString之间不能有空格。如果使用tIString选项,它必须是LogOptions 的最后一个选项,因为String包括下一个空格之前的所有字符。

 

例如,如果 LogOptionsrSewo,则日志中每一行包括不匹配项的相对地址、节名、该地址的原始值和实际值,并且任何先前的文件都会被覆盖。如果想创建多个具有不同选项的日志文件,可以使用-mmw多次。一次最多创建10个日志文件。

Module

指定要检查的模块。Module 可以是模块名、模块的开始地址,或者包含在模块中的任何地址。如果省略Module,调试器使用包含当前指令指针的模块。

DLL

Windows NT 4.0

Ext.dll

Windows 2000

Ext.dll

Windows XP和之后

Ext.dll

只能在基于x86的目标机上使用!chkimg 扩展命令。

注释

使用!chkimg时,它会比较内存中的可执行映像和符号存储中的文件拷贝。

文件中除了可抛弃的、可写得、不可执行的、名字中有"PAGE"的或者INITKDBG 中的节之外,所有节都会被比较。可以使用-ss-as、或-r 开关来改变这个行为。

!chkimg 会显示文件和内存映像中所有不匹配的地方,除了下面的例外:

  • 导入表(IAT)占用的地址不会检查。
  • Hal.dllNtoskrnl.exe 中的特定地址不会检查,因为这些节加载时会进行特定的改变。要检查这些地址,使用-nospec 选项。
  • 如果文件中的字节值为0x90,内存中的响应字节为0xF0(或者反过来),这种情况被认为是匹配的。一般来说,符号服务器保存单处理器版本和多处理器版本二进制文件中的一个。在x86处理器上,lock指令是0xF0,而在单处理器版本中响应的指令会是nop (0x90)。如果希望!chkimg 显示这种不匹配的项,使用-noplock 选项。

注意  如果使用了-f选项来修正不匹配的内容,!chkimg 仅修正被认为是不匹配的地方。例如,没有包含-noplock时,!chkimg不会将0x90改为0xF0。

包含-d选项时,!chkimg 显示扫描中遇到的不匹配内容的摘要。每个不匹配位置都显示为两行。第一行包含该位置的起始地址、大小、和起始地址对应的符号名和偏移、以及和上一个错误位置之间有多少个字节(圆括号中)。第二行用中括号括起来,包含原始的16进制值、一个冒号、以及当前映像中实际的16进制值。如果该区域大于8个字节,在冒号前后都只会显示8个字节。下面是一个例子。

be000015-be000016  2 bytes - win32k!VeryUsefulFunction+15 (0x8)
     [ 85 dd:95 23 ]

有时候,驱动程序会通过hook、重定向或其它方法改变Microsoft Windows内核的一部分。即使是不在堆栈上的驱动也可能改变内核。可以使用!chkimg 扩展作为文件比较工具来查看Windows内核(或任何其它映像)被某些驱动改变了,以及具体是怎么改变的。这种比较在完整dump文件上非常有效。

也可以将!chkimg!for_each_module 扩展一起使用来检查所有已加载模块的映像。下面是这种情况的示例。

!for_each_module !chkimg @#ModuleName 

例如,假设遇到了bug check,以使用!analyze开始。

kd> !analyze 
....
BugCheck 1000008E, {c0000005, bf920e48, baf75b38, 0}
Probably caused by : memory_corruption
CHKIMG_EXTENSION: !chkimg !win32k
....

例中 !analyze 的输出提示可能遇到了内存错误,并且包含了一个CHKIMG_EXTENSION 行提示被破坏的模块可能是Win32k.sys。(即使不存在这一行,也应该考虑可能调用堆栈顶部的模块被破坏了。)不带任何参数使用!chkimg ,如下。

kd> !chkimg win32k
Number of different bytes for win32k: 31

下面的例子说明确实有内存错误。使用!chkimg -d 来显示模块Win32k 中的所有错误。

kd> !chkimg win32k -d
    bf920e40-bf920e46  7 bytes - win32k!HFDBASIS32::vSteadyState+1f
        [ 78 08 d3 78 0c c2 04:00 00 00 00 00 01 00 ]
    bf920e48-bf920e5f  24 bytes - win32k!HFDBASIS32::vHalveStepSize (+0x08)
        [ 8b 51 0c 8b 41 08 56 8b:00 00 00 00 00 00 00 00 ]
Number of different bytes for win32k: 31

当尝试反汇编列出来的第二个被破坏的映像位置时,可能会有下面这样的输出。

kd> u  win32k!HFDBASIS32::vHalveStepSize
win32k!HFDBASIS32::vHalveStepSize:
bf920e48 0000             add     [eax],al
bf920e4a 0000             add     [eax],al
bf920e4c 0000             add     [eax],al
bf920e4e 0000             add     [eax],al
bf920e50 7808            js win32k!HFDBASIS32::vHalveStepSize+0x12 (bf920e5a)
bf920e52 d3780c           sar     dword ptr [eax+0xc],cl
bf920e55 c20400           ret     0x4
bf920e58 8b510c           mov     edx,[ecx+0xc]

然后,使用!chkimg –f来修正内存错误。

kd> !chkimg win32k -f
Warning: Any detected errors will be fixed to what we expect!
Number of different bytes for win32k: 31 (fixed)

现在可以反汇编正确的内容并且查看有些什么改变。

kd> u  win32k!HFDBASIS32::vHalveStepSize
win32k!HFDBASIS32::vHalveStepSize:
bf920e48 8b510c           mov     edx,[ecx+0xc]
bf920e4b 8b4108           mov     eax,[ecx+0x8]
bf920e4e 56               push    esi
bf920e4f 8b7104           mov     esi,[ecx+0x4]
bf920e52 03c2             add     eax,edx
bf920e54 c1f803           sar     eax,0x3
bf920e57 2bf0             sub     esi,eax
bf920e59 d1fe             sar     esi,1

!cppexr

!cppexr 扩展显示一个C++ 异常记录的内容。

语法

!cppexr Address 

参数

Address

指定要显示的C++ 异常记录的地址。

DLL

Windows NT 4.0

Ext.dll

Windows 2000

Ext.dll

Windows XP和之后

Ext.dll

注释

!cppexr 扩展显示和目标遇到的C++ 异常相关的信息,包括发生异常处的代码、异常的地址和异常标志。必须是在Msvcrt.dll中定义的标准C++ 异常。

一般可以使用!analyze -v命令来获得address参数。

!cppexr 扩展用来查看C++异常的类型很有用。

附加信息

关于异常的更多信息,查看控制异常和事件、Windows Driver Kit (WDK)文档、 Windows SDK 文档、以及Mark Russinovich和David Solomon编写的Microsoft Windows Internals 。使用.exr 命令来显示其它异常记录。

!cpuid

!cpuid 扩展用来显示系统中的处理器的信息。

语法

!cpuid [Processor

参数

Processor

指定要显示信息的处理器。如果省略该参数,则显示所有处理器。

DLL

Windows NT 4.0

Ext.dll

Windows 2000

Ext.dll

Windows XP和之后

Ext.dll

注释

!cpuid 扩展可以在用户模式或者内核模式活动调试、本地内核调试和调试dump文件时使用。但是,用户模式minidump文件仅包含活动处理器的信息。

如果在用户模式下调试,!cpuid 扩展用于查看目标程序运行的计算机。在内核模式下调试时,用于查看目标机。

下面是该扩展的示例。

kd> !cpuid 
CP  F/M/S  Manufacturer        MHz 
 0  6,5,1  GenuineIntel        700 
 1  8,1,5  AuthenticAMD        700 

CP 列是处理器号。(这些数字总是连续的,以0开始)。 Manufacturer 列显示处理器厂商。MHz 列显示处理器的速度,如果可用的话。

对于x86处理器或者x64处理器, F 列显示处理器的家族号, M 列显示处理器模型号,S 列显示stepping size(流水线长度?)。

对于Itanium处理器,M列显示处理器模型号, R 列显示处理器修订编号(revision number),F列显示处理器家族号, A列显示架构修订编号。

附加信息

关于如何调试多处理器计算机的信息,查看多处理器语法

!cs

!cs 扩展显示一个或多个临界区(critical section)或者整个临界区树。

语法

!cs [-s] [-l] [-o
!cs [-s] [-o] [Address
!cs [-s] [-l] [-oStartAddress EndAddress 
!cs [-s] [-o-d InfoAddress 
!cs [-s-t [TreeAddress
!cs -? 

参数

-s

如果可能的话,显示每个临界区的初始堆栈回溯。

-l

仅显示锁定的临界区。

-o

对所有显示出来的已锁定的临界区,显示所有者的堆栈。

Address

指定要显示的临界区地址。如果省略该参数,调试器显示当前进程中所有临界区。

StartAddress

指定要搜索临界区的地址范围的开头。

EndAddress

指定要搜索临界区的范围的结束地址。

-d

显示和DebugInfo 关联的临界区。

InfoAddress

指示DebugInfo 的地址。

-t

显示临界区树。使用-t 选项之前,必须选择为目标进程激活应用程序验证器(Application Verifier)并且选中Check lock usage 选项。

TreeAddress

指定临界区树的根的地址。如果省略该参数或者指定0,调试器现实当前进程的临界区树。

-?

调试器命令窗口中显示该命令的帮助文本。

DLL

Windows NT 4.0

不可用

Windows 2000

不可用

Windows XP和之后

Exts.dll

注释

!cs 扩展要求被调试进程和Ntdll.dll的完整符号(包含类型信息)。如果没有Ntdll.dll的符号,查看安装Windows符号文件

下面是如何使用!cs的示例。这条命令显示0x7803B0F8地址处的临界区的信息和初始调用堆栈。

0:001> !cs -s 0x7803B0F8
Critical section   = 0x7803B0F8 (MSVCRT!__app_type+0x4)
DebugInfo          = 0x6A262080
NOT LOCKED
LockSemaphore      = 0x0
SpinCount          = 0x0

Stack trace for DebugInfo = 0x6A262080:

0x6A2137BD: ntdll!RtlInitializeCriticalSectionAndSpinCount+0x9B
0x6A207A4C: ntdll!LdrpCallInitRoutine+0x14
0x6A205569: ntdll!LdrpRunInitializeRoutines+0x1D9
0x6A20DCE1: ntdll!LdrpInitializeProcess+0xAE5

下面的命令显示DebugInfo在0x7803B0F8处的临界区信息。

0:001> !cs -d 0x6A262080
DebugInfo          = 0x6A262080
Critical section   = 0x7803B0F8 (MSVCRT!__app_type+0x4)
NOT LOCKED
LockSemaphore      = 0x0
SpinCount          = 0x0

下面的信息显示当前进程中的所有活动临界区的信息。

0:001> !cs
-----------------------------------------
DebugInfo          = 0x6A261D60
Critical section   = 0x6A262820 (ntdll!RtlCriticalSectionLock+0x0)
LOCKED
LockCount          = 0x0
OwningThread       = 0x460
RecursionCount     = 0x1
LockSemaphore      = 0x0
SpinCount          = 0x0
-----------------------------------------
DebugInfo          = 0x6A261D80
Critical section   = 0x6A262580 (ntdll!DeferedCriticalSection+0x0)
NOT LOCKED
LockSemaphore      = 0x7FC
SpinCount          = 0x0
-----------------------------------------
DebugInfo          = 0x6A262600
Critical section   = 0x6A26074C (ntdll!LoaderLock+0x0)
NOT LOCKED
LockSemaphore      = 0x0
SpinCount          = 0x0
-----------------------------------------
DebugInfo          = 0x77fbde20
Critical section   = 0x77c8ba60 (GDI32!semColorSpaceCache+0x0)
LOCKED
LockCount          = 0x0
OwningThread       = 0x00000dd8
RecursionCount     = 0x1
LockSemaphore      = 0x0
SpinCount          = 0x00000000
-----------------------------------------
...

下面的命令现实临界区树。

0:001> !cs -t

Tree root 00bb08c0

Level     Node       CS    Debug  InitThr EnterThr  WaitThr TryEnThr LeaveThr EnterCnt  WaitCnt

-----------------------------------------------------------------------------------------------

    0 00bb08c0 77c7e020 77fbcae0      4c8      4c8        0        0      4c8        c        0
    1 00dd6fd0 0148cfe8 01683fe0      4c8      4c8        0        0      4c8        2        0
    2 00bb0aa0 008e8b84 77fbcc20      4c8        0        0        0        0        0        0
    3 00bb09e0 008e8704 77fbcba0      4c8        0        0        0        0        0        0
    4 00bb0a40 008e8944 77fbcbe0      4c8        0        0        0        0        0        0
    5 00bb0a10 008e8824 77fbcbc0      4c8        0        0        0        0        0        0
    5 00bb0a70 008e8a64 77fbcc00      4c8        0        0        0        0        0        0
    3 00bb0b00 008e8dc4 77fbcc60      4c8        0        0        0        0        0        0
    4 00bb0ad0 008e8ca4 77fbcc40      4c8        0        0        0        0        0        0
    4 00bb0b30 008e8ee4 77fbcc80      4c8        0        0        0        0        0        0
    5 00dd4fd0 0148afe4 0167ffe0      4c8        0        0        0        0        0        0
    2 00bb0e90 77c2da98 00908fe0      4c8      4c8        0        0      4c8       3a        0
    3 00bb0d70 77c2da08 008fcfe0      4c8        0        0        0        0        0        0

!cs -t 的显示中有如下内容:

  • InitThr 是初始化临界区的线程的ID。
  • EnterThr 是最近一次调用EnterCriticalSection 的线程ID。
  • WaitThr 是最近一次因为其他线程拥有临界区而等待的线程的ID。
  • TryEnThr 是最近一次调用TryEnterCriticalSection 的线程的ID。
  • LeaveThr 是最近一次调用LeaveCriticalSection 的线程ID。
  • EnterCntEnterCriticalSection 的次数。
  • WaitCnt是出现争用的次数。

附加信息

关于其他可以显示临界区信息的命令和扩展,查看显示临界区。关于临界区的更多信息,查看Microsoft Windows SDK文档、the Windows Driver Kit (WDK)文档、以及Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals

!cxr

!cxr 扩展命令已经废除。使用.cxr (Display Context Record)命令来替代。

posted @ 2008-07-08 13:52 NetRoc 阅读(865) | 评论 (0)编辑 收藏

WinDbg 文档翻译----68

 

cc682/NetRoc

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

调试器扩展命令

本节描述可以在CDB、KD和WinDbg中使用的各种调试器扩展命令。

每条扩展命令(或者简称为扩展)都有自己的参考主题。以粗体显示的项需要逐字输入,以斜体显示的项表示是在Parameters 节中会进行说明的参数。中括号([ xxx ]) 中的参数是可选的,中括号中的竖线([ xxx | yyy ])表示可以使用其中的一个或者不使用。大括号和竖线({ xxx | yyy })表示必须包含括起来的参数中的一个。

一般来说,扩展命令不支持由调试器命令和元命令支持的完整表达式语法。关于每条命令的语法要求,分别查看它们的参考主题。

本节描述了以下几种类型的扩展命令:

常规扩展

内核模式扩展

用户模式扩展

专用扩展

常规扩展

本节描述在用户模式和内核模式调试中都常常会用到的扩展命令。

调试器会自动加载适当版本的扩展命令。如果不是自己加载不同的版本,则不需要关心使用到哪个DLL。关于默认的模块搜索顺序的更多信息,查看使用调试器扩展命令。关于如何加载扩展模块的更多信息,查看加载调试器扩展DLL

每个扩展命令的参考主题都会列出暴露该命令的DLL。使用下面的规则来判断扩展DLL从哪个目录加载:

  • 如果目标机运行Microsoft Windows XP和之后版本的Windows,使用的是winxp\kdexts.dllwinxp\ntsdexts.dllwinxp\exts.dllwinext\ext.dlldbghelp.dll
  • 如果目标机运行发行版的Windows 2000,则使用w2kfre\kdextx86.dllw2kfre\ntsdexts.dllwinext\ext.dlldbghelp.dll
  • 如果目标机运行调试版的Windows 2000,则使用w2kchk\kdextx86.dllw2kchk\ntsdexts.dllwinext\ext.dlldbghelp.dll
  • 如果目标机运行Windows NT 4.0发行版,使用的是nt4fre\kdextx86.dllnt4fre\ntsdexts.dllwinext\ext.dll或者 dbghelp.dll
  • 如果目标机运行调试版Windows NT 4.0,使用的是nt4chk\kdextx86.dllnt4chk\ntsdexts.dllwinext\ext.dlldbghelp.dll

!acl

!acl 扩展命令格式化并显示某个访问控制列表(access control list (ACL))的内容。

语法

Microsoft Windows XP和之后版本的语法

!acl Address [Flags

Windows NT 4.0和Windows 2000的语法

!acl Address 

参数

Address

指定ACL的16进制地址。

Flags

(Windows XP 和之后版本) 如果Flags的值为1,显示ACL的友好名称。友好名中包含安全标识符(SID)以及SID的域和用户名。

DLL

Windows NT 4.0

Kdextx86.dll

Windows 2000

Kdextx86.dll

Windows XP 和之后

Exts.dll

 

注释

下面是一个!acl 扩展的示例。

kd> !acl e1bf35d4 1
ACL is:
ACL is: ->AclRevision: 0x2
ACL is: ->Sbz1       : 0x0
ACL is: ->AclSize    : 0x40
ACL is: ->AceCount   : 0x2
ACL is: ->Sbz2       : 0x0
ACL is: ->Ace[0]: ->AceType: ACCESS_ALLOWED_ACE_TYPE
ACL is: ->Ace[0]: ->AceFlags: 0x0
ACL is: ->Ace[0]: ->AceSize: 0x24
ACL is: ->Ace[0]: ->Mask : 0x10000000
ACL is: ->Ace[0]: ->SID: S-1-5-21-518066528-515770016-299552555-2981724 (User: MYDOMAIN\myuser)

ACL is: ->Ace[1]: ->AceType: ACCESS_ALLOWED_ACE_TYPE
ACL is: ->Ace[1]: ->AceFlags: 0x0
ACL is: ->Ace[1]: ->AceSize: 0x14
ACL is: ->Ace[1]: ->Mask : 0x10000000
ACL is: ->Ace[1]: ->SID: S-1-5-18 (Well Known Group: NT AUTHORITY\SYSTEM)

附加信息

关于访问控制列表的更多信息,查看!sid!sd、以及获得对象的ACL。 另外,可以查看Microsoft Windows SDK 文档、Windows Driver Kit (WDK) 文档、以及Mark Russinovich 和David Solomon 编写的Microsoft Windows Internals

!address

!address 扩展显示目标进程或目标机使用的内存信息。

语法

用户模式

!address Address 
!address -summary 
!address -Filter 
!address -? 

内核模式

!address Address 
!address 

参数

Address

只显示地址空间中包含Address的区域。

-summary

仅显示摘要信息。

Filter

只显示指定的区域。Filter 的值不区分大小写。

下面这些可能的Filter 值按照目标进程使用内存的方式来指定内存区域。

Filter

显示的内存区域

RegionUsageIsVAD

"busy" 区域。包括所有 虚拟分配块、SBH堆、自定义内存分配器(custom allocators)的内存、以及地址空间中所有属于其他分类的内存块。

RegionUsageFree

目标的虚拟地址空间中所有可用内存。包括所有非提交(committed)和非保留(reserved)的内存。

RegionUsageImage

用来映射二进制映像的内存区域。

RegionUsageStack

用作目标进程的线程的堆栈的内存区域。

RegionUsageTeb

用作目标进程中所有线程的线程环境块(TEB)的内存区域。

RegionUsageHeap

用作目标进程的堆的内存区域。

RegionUsagePageHeap

用作目标进程的整页堆(full-page heap)的内存区域。

RegionUsagePeb

目标进程的进程环境块(PEB)的内存区域。

RegionUsageProcessParametrs

用作目标进程启动参数的内存区域。

RegionUsageEnvironmentBlock

用作目标进程的环境块的内存区域。

 

下面这些Filter值按照内存类型来指定内存。

Filter

显示的内存类型

MEM_IMAGE

映射的文件属于可执行映像一部分的内存。

MEM_MAPPED

映射的文件不属于可执行映像一部分的内存。这种内存包含哪些从页面文件映射的内存。

MEM_PRIVATE

私有的(即不和其他进程共享)并且未用来映射任何文件的内存。

 

下面的Filter 值按照状态来指定内存:

Filter

显示的内存状态

MEM_COMMIT

当前已提交给目标使用的所有内存。已经在物理内存或者页面文件中为这些内存分配了物理的存储空间。

MEM_RESERVE

所有为目标以后的使用保留的内存。这种内存还没有分配物理上的存储空间。

MEM_FREE

目标虚拟地址空间中所有可用内存。包括所有未提交并且未保留的内存。该Filter 值和RegionUsageFree一样。

 

-?

调试器命令窗口中显示该命令的简短帮助。

DLL

Windows NT 4.0

不可用

Windows 2000

Ext.dll

Windows XP 和之后

Ext.dll

注释

不带任何参数时,!address 扩展命令显示整个地址空间和使用摘要的信息。!address -summary 命令仅显示摘要信息。

内核模式下,该命令仅搜索内核内存,即使使用了.process (Set Process Context) 来指定某个进程的虚拟地址空间。用户模式下,!address 扩展总是引用目标进程拥有的内存。

用户模式下,!address Address 显示包含指定地址的区域的特征。不带参数时,!address 显示所有内存区域的特征。包括内存类型、内存状态和内存的使用方式。关于这些信息的含义,查看前面对Filter 进行说明的表格。

下面是!address的例子。

0:000> !address 7c571234
    7c570000 : 7c571000 - 00059000
                    Type     01000000 MEM_IMAGE
                    Protect  00000020 PAGE_EXECUTE_READ
                    State    00001000 MEM_COMMIT
                    Usage    RegionUsageImage
                    FullPath C:\WINNT\system32\KERNEL32.dll

该例子使用的Address 值为0x7C571234。输出表明这是以地址0x7C570000开头的一个大的内存区域。 该区域中包含一个以0x7C571000 开头,大小为0x59000的小一些的区域。因此,这个小区域是从0x7C571000 到0x7C5C9FFF。它的内存类型为MEM_IMAGE、状态为 MEM_COMMIT、使用方式为RegionUsageImage。 (这些值的含义,查看前面的表格。) 此外,该内存是可读可执行,但是不可写的。最后,该内存是在属于Kernel32.dll 模块的空间中的。

一般要查看某个地址的信息,使用方式的信息常常是最重要的。知道使用方式后,可以用其他的扩展命令来查看更多信息。例如,如果使用方式是 RegionUsageHeap,可以用!heap 扩展命令来查看更多。

内核模式下!address的输出类似,但是包含的信息要少一些。下面是这种情况的例子。

kd> !address
  804de000 - 00235000                           
          Usage       KernelSpaceUsageImage
          ImageName   ntoskrnl.exe

  80c00000 - 001e1000
          Usage       KernelSpaceUsagePFNDatabase

....

  f85b0000 - 00004000
          Usage       KernelSpaceUsageKernelStack
          KernelStack 817b4da0 : 324.368

  f880d000 - 073d3000
          Usage       KernelSpaceUsageNonPagedPoolExpansion

"usage"的含义和用户模式下一样。"ImageName"表示该地址关联的模块、"KernelStack"中会显示线程的ETHREAD块的地址(0x817B4DA0)、 进程ID (0x324)、以及线程ID(0x368)。

附加信息

关于如何显示和搜索内存的更多信息,查看读写内存。显示内存属性的其他扩展命令,查看!vm (内核模式) 和!vprot (用户模式)。

!analyze

!analyze 扩展显示当前异常或bug check的信息。

语法

用户模式

!analyze [-v] [-f | -hang] [-D BucketID
!analyze -c [ -load KnownIssuesFile | -unload | -help ]

内核模式

!analyze [-v] [-f | -hang]  [-D BucketID
!analyze -c [ -load KnownIssuesFile | -unload | -help ]
!analyze -show BugCheckCode [BugParameters

参数

-v

显示详细输出。

-f

生成!analyze 的异常输出。即使调试器未检测到异常时也可以使用该参数来查看异常分析。

-hang

生成!analyze 的挂起程序输出。也可以在目标经历了bug check或者异常之后使用该参数,但是用于进行挂起状态分析会和问题相关性更高。内核模式下,!analyze -hang 会调查系统持有的锁并且扫描DPC队列。用户模式下,!analyze -hang 对线程堆栈进行分析,以查看是否某些线程阻塞了其他线程。

在用户模式下运行该扩展之前,要考虑将当前线程变为被认为停止响应(即,挂起)的那个线程,因为异常可能造成当前线程改变。

-D BucketID

仅显示和指定的BucketID 相关的项。

-show

显示指定的bug check代码的信息。

-c

当调试器遇到已知问题时,继续执行。如果该问题不是"已知"的,则调试器仍然保持中断目标的状态。

-c选项可以和下面的子参数一起使用。这些子参数可以配置已知问题的列表。它们本身不会造成执行。至少执行!analyze -c -load 一次, !analyze -c 才会起作用。

-load KnownIssuesFile

加载指定的已知问题文件。KnownIssuesFile 指定该文件的路径和名字。这个文件必须是XML格式的。可以在调试器安装目录的sdk\samples\analyze_continue 子目录中找到示例文件。 (必须完整安装Windows调试工具包才能包含该文件。完整安装的更多信息,查看安装调试器。)

KnownIssuesFile 文件中的已知问题列表将会用于之后的所有!analyze -c 命令,直到使用!analyze -c –unload,或者再次使用 !analyze -c -load (这时,新数据会覆盖掉旧的数据)。

-unload

卸载当前的已知问题列表。

-help

调试器命令窗口中显示!analyze –c扩展命令的帮助文本。

BugCheckCode

指定要显示的bug check代码。

BugParameters

指定最多4个bug check参数。以空格分隔这些参数。这些参数使得以后的搜索更加精练。

DLL

Windows NT 4.0

Ext.dll

Windows 2000

Ext.dll

Windows XP 和之后

Ext.dll

注释

用户模式下,!analyze!analyze -v 扩展显示当前异常的信息。

内核模式下,它们显示最近的bug check的信息。如果发生了bug check,会自动产生!analyze 的显示。可以使用!analyze -v 来显示更多信息。如果只需要查看基本的bug check 参数,可以使用.bugcheck (Display Bug Check Data)命令。

可以使用!analyzebugcheck -show 扩展命令来单独显示bug check 代码的信息。这些信息不受目标机当前状态的影响。

这是一个断点中断时的!analyze 结果示例。

0:000> !analyze
Last event: Hit breakpoint 10000

附加信息

用户模式异常和内核模式停机错误(即崩溃)的示例分析、以及!analyze 如何使用triage.ini 文件的更多信息,查看使用!analyze 扩展

!asd

!asd 扩展用来显示从指定地址开始的数据缓存中的指定个数的错误分析条目。

语法

!asd Address DataUsed

参数

Address

指定要显示的第一个错误分析条目的地址。

DataUsed

指定要显示的标记(token)个数。

DLL

Windows NT 4.0

Ext.dll

Windows 2000

Ext.dll

Windows XP 和之后

Ext.dll

注释

!asd 扩展仅在调试!analyze 扩展时有用。

可以用!dumpfa 来调试!analyze扩展。

!atom

!atom 扩展显示指定的atom或者当前进程的所有atom的原子表(atom table)。

语法

!atom [Address

参数

Address

指定要显示的atom的16进制虚拟地址。如果省略该参数或者为0,则显示当前进程的atom table。该列表中包含进程的所有atom。

DLL

Windows NT 4.0

Kdextx86.dll
Ntsdexts.dll

Windows 2000

Kdextx86.dll
Ntsdexts.dll

Windows XP 和之后

Ext.dll

附加信息

关于atom和atom table的更多信息,查看Microsoft Windows SDK 文档。

!bitcount

!bitcount 扩展统计内存范围中为"1"的位的个数。

语法

!bitcount StartAddress TotalBits

参数

StartAddress

指定要统计为"1"的位个数的开始地址。

TotalBits

指定内存范围的大小,以位为单位。

-?

调试器命令窗口中显示该命令的帮助文本。

DLL

Windows NT 4.0

不可用

Windows 2000

不可用

Windows XP 和之后

Exts.dll

posted @ 2008-07-07 11:31 NetRoc 阅读(694) | 评论 (0)编辑 收藏

WinDbg 文档翻译----67

cc682/NetRoc

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

控制键

本参考节讨论能够在调试器中使用的各种控制键。

这些控制键可以在KD中使用,有时候可以在CDB中。有一些也可以在WinDbg中使用 (使用CTRL+ALT键而不仅是CTRL)。

WinDbg 也可以使用CTRL、ALT和F键作为菜单的快捷键。查看快捷键获得它们的意义的列表。

CTRL+A (Toggle Baud Rate)

CTRL+A 键切换内核调试连接使用的波特率。

用法

KD 用法

CTRL+A  ENTER 

WinDbg 用法

CTRL+ALT+A 

环境

调试器

仅KD和WinDbg

模式

仅内核模式

目标

仅活动目标

平台

所有

 

注释

这个控制键会在内核调试连接可以使用的波特率间循环切换。

可以支持的波特率有19200、38400、57600和115200。每次使用该控制键时,会选中下一个波特率。如果已经是115200,则又会返回到19200。

在WinDbg中,也可以通过Debug | Kernel Connection | Cycle Baud Rate菜单实现。

这个控制键并不能用来改变实际调试的波特率。主控机和目标机的波特率必须匹配,而目标机必须重起才能改变它。因此,只有在两台计算机试图以不同波特率连接时才应该进行切换。这种情况向,必须改变波特率来匹配目标机。

要改变目标机的波特率,查看配置目标机的软件

CTRL+B (Quit Local Debugger)

CTRL+B 键使得调试器强制退出。这不会结束远程调试会话。

用法

CTRL+B  ENTER 

环境

调试器

仅CDB和KD

模式

用户模式、内核模式

目标

活动目标、崩溃转储

平台

所有

注释

CDB中,应该使用q (Quit) 命令来退出。CTRL+B 只应该在调试器停止相应时使用。

在KD中,q 命令会结束调试会话并保持目标机被锁定。如果想保持调试会话(所以新的调试器可以连接上去),或者想让目标机继续运行,可以使用CTRL+B。

在WinDbg中,等效的命令是File | Exit 或ALT+F4。

附加信息

其他退出调试器或停止对目标附加的方法,查看结束调试会话

CTRL+C (Break)

CTRL+C 键中断到调试器,停止目标程序或目标机,并且取消调试器命令。

用法

CDB 用法

CTRL+C 

KD 用法

CTRL+C 

目标机用法

SYSRQ 
ALT+SYSRQ 
F12 

环境

调试器

仅CDB和KD

模式

用户模式、内核模式

目标

活动目标、崩溃转储

平台

所有

注释

使用CDB时:

用户模式下,CTRL+C 键使得目标程序中断到调试器中。目标程序会冻结而调试器开始活动,这时可以输入调试器命令。

如果调试器已激活,CTRL+C不会作用于目标程序。但是,它可以用来终止调试器命令。例如,如果产生了一个很长的输出并且不再想继续看下午,可以使用CTRL+C 来终止显示并返回到调试器命令提示符。

使用CDB进行远程调试时,CTRL+C可以在主机的键盘上使用。如果想从目标机键盘上产生中断,可以在x86机器上使用CTRL+C。

F12可以用来当被调试程序很忙时获得命令提示符。将焦点放到目标程序的窗口上并且在目标机上按下F12。

使用KD时:

内核模式下,CTRL+C 键使得目标机中断到调试器中。这会锁定目标机并唤醒调试器。

调试正在运行的系统时,必须在主机键盘上按下CTRL+C才能获得初始的命令提示符。

如果调试器已激活,CTRL+C不会作用于目标机。但是,它可以用来终止调试器命令。例如,如果产生了一个很长的输出并且不再想继续看下午,可以使用CTRL+C 来终止显示并返回到调试器命令提示符。.

CTRL+C也可以用来在当产生了很长的输出或者目标机很忙时获取命令提示符。调试x86机器时,在主控机或目标机键盘上都可以使用。

SYSRQ (或者增强键盘的ALT+SYSRQ)有类似作用。它在运行于任何处理器的主控机和目标机键盘都能工作。但是,只有当之前至少使用CTRL+C获取过命令提示符一次以上时才起效。

SYSRQ 键可以通过编辑注册表禁用。在注册表键

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\i8042prt\Parameters

创建一个名为BreakOnSysRq的值,并设置为DWORD 0x0。然后重新启动。之后在目标机键盘上按下SYSRQ就不会中断到内核调试器中了。

当KD和CDB一起使用时:

如果使用KD和CDB一起调试,CTRL+C将会由主机试器(CDB)来响应。要 中断到目标调试器(KD)中,需要使用CTRL+F

注意  在WinDbg中, CTRL+C 是用来从窗口中复制文本的快捷键。要在WinDbg中执行中断命令,可以使用CTRL+BREAK 或选择菜单的 Debug | Break

附加信息

关于执行该命令的其他方法和相关命令的概述,查看控制目标机

CTRL+D (Toggle Debug Info)

CTRL+D 键用来切换调试器内部信息流打开和关闭。这在调试器通信故障时用来重置目标机和主控机之间的连接。

用法

KD 用法

CTRL+D  ENTER 

WinDbg 用法

CTRL+ALT+D 

环境

调试器

仅KD和WinDbg

模式

仅内核模式

目标

仅活动调试

平台

所有

注释

当打开时,调试器会输出主控机和目标机之间通信的信息。

这个快捷键可以用来测试调试器是否崩溃了。如果怀疑调试器或者目标已经停止,可以使用它。如果看到数据包发送,则目标仍然在工作。如果看到超时信息,则目标已停止响应。如果没有任何信息,则调试器已崩溃。

如果目标不响应,使用CTRL+R ENTER CTRL+C。如果继续出现超时信息,则目标已经崩溃了(或者调试器配置错误)。

这在调试KD调试器本身时也有用。

CTRL+F (Break to KD)

CTRL+F 键取消命令或者中断到调试器。(这在使用CDB来调试KD本身时特别有用。)

用法

CTRL+F  ENTER 

环境

调试器

CDB、KD

模式

用户模式 、内核模式

目标

活动目标、崩溃转储

平台

所有

注释

在典型情况下, CTRL+F 和标准的中断命令 (KD和CDB的CTRL+C,WinDbg中的 Debug | BreakCTRL+BREAK)一样。

但是,如果使用KD和CDB一起调试,这两种控制键作用不同。CTRL+C 将会由主机调试器(host debugger (CDB))处理,而CTRL+F 由目标机调试器(target debugger (KD))处理。

参见

.breakin (Break to the Kernel Debugger)

CTRL+K (Change Post-Reboot Break State)

CTRL+K 键改变调试器自动中断目标机的条件。

用法

KD 用法

CTRL+K  ENTER 

WinDbg 用法

CTRL+ALT+K 

环境

调试器

仅KD和WinDbg

模式

仅内核模式

目标

仅活动目标

平台

所有

注释

该控制键使得内核调试器在下面三个状态之间循环切换:

No break

这种状态下,如果没有按下CTRL+C,调试器不会中断目标机。

Break on reboot

调试器在目标机重起后内核初始化完成后中断。这相当于以-b 命令行选项启动KD或WinDbg。

Break on first module load

调试器在目标机重起后第一个内核模块加载完毕时中断。(这个中断比Break on reboot 选项要。) 这相当于以 -d 命令行选项启动KD或WinDbg。

CTRL+K使用后会显示新的状态。

WinDbg中,也可以通过选择Debug | Kernel Connection | Cycle Initial Break来完成。

附加信息

相关命令的概述和重起过程如何作用于调试器的说明,查看崩溃和重起目标机

CTRL+P (Debug Current Debugger)

CTRL+P 键创建一个新的CDB示例,新调试器将会把当前调试器作为目标。

用法

CTRL+P  ENTER 

环境

调试器

CDB、KD

模式

用户模式 、内核模式

目标

活动目标、崩溃转储

平台

所有

注释

这和通过remote.exe 实用程序启动新的CDB,并且用它来调试已运行的调试器一样。

CTRL+P和.dbgdbg (Debug Current Debugger)命令类似。但是 ,.dbgdbg要更加通用,因为除了KD和CDB之外还可以在WinDbg中使用,并且可以用来调试远程计算机上的调试服务器。

CTRL+R (Re-synchronize)

CTRL+R 键用来和目标机同步。

用法

KD 用法

CTRL+R  ENTER 

WinDbg 用法

CTRL+ALT+R 

环境

调试器

仅KD和WinDbg

模式

仅内核模式

目标

仅活动目标

平台

所有

注释

尝试让主控机和目标机同步。目标停止响应时可以使用这个键。

如果使用1394内核连接,重新同步可能并不总是成功。

附加信息

关于和目标重新建立联系的其他方法,查看同步目标机

CTRL+V (Toggle Verbose Mode)

CTRL+V 键切换详细模式的打开和关闭。

用法

CDB / KD 用法

CTRL+V  ENTER 

WinDbg 用法

CTRL+ALT+V 

环境

调试器

CDB、KD、WinDbg

模式

用户模式 、内核模式

目标

活动目标、崩溃转储

平台

所有

注释

打开详细模式时,一些显示命令(例如寄存器转储)会产生更详细的输出。发送给调试器的每个模块加载操作都会显示出来。并且操作系统每次加载驱动或者DLL时也会提示。

在WinDbg中,也可以通过选择 View | Verbose Output来实现。

CTRL+W (Show Debugger Version)

CTRL+W 键显示调试器和所有已加载扩展DLL的版本信息。

用法

CDB / KD 用法

CTRL+W  ENTER 

WinDbg 用法

CTRL+ALT+W 

环境

调试器

CDB、KD、WinDbg

模式

用户模式 、内核模式

目标

活动目标、崩溃转储

平台

所有

注释

这和 version (Show Debugger Version) 命令有相同作用,除了后者还会显示Windows操作系统版本之外。

在WinDbg中,还可以通过选择 View | Show Version查看。

参见

version (Show Debugger Version), vertarget (Show Target Computer Version)

posted @ 2008-07-06 12:36 NetRoc 阅读(570) | 评论 (0)编辑 收藏

WinDbg 文档翻译----65

     摘要: cc682/NetRoc http://netroc682.spaces.live.com/ .readmem (Read Memory from File) .readmem 命令从指定文件中读取原始二进制数据并复制到目标机内存中。 语法 .readmem FileName Range  参数 FileName 指定要读取的文件名。可以...  阅读全文

posted @ 2008-07-03 16:19 NetRoc 阅读(632) | 评论 (0)编辑 收藏

WinDbg 文档翻译----66

     摘要: cc682/NetRoc http://netroc682.spaces.live.com/ .srcfix, .lsrcfix (Use Source Server) .srcfix 和.lsrcfix 命令自动设置源码路径以指示使用了源码服务器。 语法 .srcfix[+] [Paths] .lsrcfix[+] [Paths]  ...  阅读全文

posted @ 2008-07-03 16:19 NetRoc 阅读(1174) | 评论 (0)编辑 收藏

WinDbg 文档翻译----64

     摘要: cc682/NetRoc http://netroc682.spaces.live.com/ .netuse (Control Network Connections) .netuse 命令添加一个到网络共享的连接。 语法 .netuse /a "[Local]" "Remote" "[User]" "[Password]"&n...  阅读全文

posted @ 2008-07-01 14:09 NetRoc 阅读(918) | 评论 (0)编辑 收藏

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

导航

统计

常用链接

留言簿(7)

随笔档案(99)

文章分类(35)

文章档案(32)

Friends

Mirror

搜索

最新评论

阅读排行榜

评论排行榜