Windows高级调试 调试工具简介

第一部分         

1   调试工具简介

许多技术性的书籍和文章都指出了在正确的软件设计和软件工程原则中包含的重要性。有些书侧重于介绍在方法与实践之间的均衡性,而有些书则注重对方法的描述。一些书讨论了面向对象设计、设计模式以及模块化编程等方法,这些方法都能帮助我们编写出更强大的软件。毫无疑问,正确的软件开发方法是所有软件项目获得成功的必要条件。然而,它们却并不是软件项目获得成功的惟一因素。无论我们把软件设计得如何完美,把开发进度安排得如何精确,在软件开发过程中总是出现各种不期而至的问题使我们感到苦恼。例如,不切实际的进度安排、复杂的组件间交互,以及遗留代码等,这些因素使我们无法仅通过一些优秀的开发方法就能做出正确的预测并解决所有的问题。除了这些重要的开发方法之外,我们还必须掌握如何以快速有效的方式来诊断复杂的问题。

本章将介绍一些非常有价值的工具,这些工具不仅在问题的诊断过程中能够带来很大的帮助,而且在处理大多数一般性的问题上也能节省时间和资金。本书讨论的大多数问题都曾因为它们的复杂性而使开发人员们倍感沮丧。有时候,即使开发人员知道如何解决某个具体的问题,但也要付出巨大的努力来跟踪并找出这个问题。然而,大多数开发人员并不知道:其实有一些辅助工具能够在跟踪和解决这些问题时为开发人员带来极大的帮助。除了有助于解决问题之外,这些工具所提供的解决方案也是非常高效的。

本章将介绍在本书中使用到的所有工具。我们将对每种工具给出详细的说明,其中包括一些重要的信息,例如应用场合、安装说明以及关于工作原理的一些背景知识。然而,本章在对工具的介绍中并没有涵盖工具的所有应用场合,而只是给出了这些工具的总体介绍。在这里列出的每个工具分别在本书其他章节中用于解决一些实际的问题。本章可以视作对这组工具的一个初步介绍,在随后的章节中将对这些工具的实际应用进行补充说明。

需要注意的是,本章所介绍的工具都是在撰写本书时的最新版本。当你阅读本章时,有些工具可能已经发布了更新的版本。但这并不会带来问题,因为这些工具的一般行为基本上保持不变。

1.1   泄漏诊断工具

应用场合    内存泄漏检测

当前版本    1.25

下载地址    ftp://ftp.microsoft.com/PSS/Tools/Developer Support Tools/LeakDiag

分析机制    日志文件

泄漏诊断工具(Leak Diagnosis ToolLeakDiag)是一种用于检测内存泄漏的工具。它不仅包含了一些基本的功能,例如显示在进程中存在着多少内存泄漏,而且还能提供一些详细的信息,例如执行内存分配的栈回溯(Stack Trace)信息以及内存分配统计信息。

LeakDiag的安装过程非常简单。从下载地址下载leakdiag125.msi文件,并且在安装过程中选择默认选项。在默认情况下,程序将被安装到C:\LEAKDIAG目录下,并且可以以两种模式运行。在程序中包含一个命令行版本和一个图形用户界面(GUI)版本。命令行版本的程序叫做ldcmd.exeGUI版本的程序叫做leakdiag.exe。这两个版本既可以从命令行启动,也可以通过点击“Start”按钮,然后依次选择“All Programs”、“LeakDiag”来启动。

LeakDiag的功能是UMDH.exe(参见1.3节)功能的超集。UMDH只能显示标准堆管理器的分配信息,而LeakDiag除了能够显示这些信息外,还能显示COM分配信息(包括外部的和内部的)、虚拟内存分配信息以及其他的一些分配信息。总而言之,在目前的LeakDiag版本中共支持6种不同的分配器(Allocator):

?虚拟分配器

?堆分配器[默认支持]

?MPHeap分配器

?COMAllocatorCoTaskMem分配器

?COM的私有分配器

?C运行时分配器

由于LeakDiag支持上述所有分配器,这使得它在检测内存泄漏时成为一种非常灵活的工具。与其他内存泄漏检测工具相比,LeakDiag的一个重要不同之处在于,它能够收集与内存相关的行为。LeakDiag在记录内存分配的栈回溯时不需要依赖操作系统的支持,而是通过Microsoft Detours技术来拦截对内存分配器的调用。通过这种方式,在使用LeakDiag时就无需启用操作系统的栈回溯支持。

在图1-1中给出的GUI版本的LeakDiag界面截图。在LeakDiag界面中包含两个主要部分:当前正在运行的所有进程,以及可用的内存分配器和相应的动作按钮。要启动内存分配跟踪,只需选择其中某个进程以及想要跟踪的内存分配器,然后点击“Start”按钮,之后再点击“Log”按钮。当内存泄漏问题重现后,再次点击“Log”按钮。LeakDiag将所有信息输出为XML格式的日志文件。在默认情况下,日志文件将被写入到C:\LeakDiag\logs目录下,并且LeakDiag在命名日志文件时将确保每次产生一个惟一的文件名。

与大多数内存检测工具一样,LeakDiag的工作原理是基于不同时刻内存快照之间的比较。LeakDiag按照指定的时间间隔来抓取内存分配操作的快照,并且通过比较两次内存快照之间的差异来找出那些没有被释放的内存(潜在的内存泄漏)。你可以通过“Log”按钮来抓取快照。

LeakDiag包含了一些选项来定制默认的行为。选择“Tools”菜单中的“Options”选项,将弹出“Options”对话框,如图1-2所示。

在“Options”对话框中,你可以修改日志文件的存放路径,指定符号(Symbol)文件的路径等。与许多栈回溯工具一样,LeakDiag需要借助正确的符号来产生有用的栈回溯信息。如果没有正确地指定符号文件的路径或者符号文件是错误的,那么在栈回溯信息中将只能看到每个栈帧(Frame)的地址。还要指出的是,栈回溯的记录过程是一项开销较高的操作,它将极大地影响程序执行的速度。事实上,有时候这种对执行速度的影响将会使得某些内存泄漏无法被重现出来(如果这个内存泄漏与并发或者时间等因素相关)。幸运的是,你可以通过一个选项来指定在记录时禁止对符号进行解析。在“Allocation size filter”中可以指定想要记录的内存分配大小。最后,在“Max stack depth”中可以指定将每个栈回溯中的多少个栈帧输出到日志文件中。

在第9章中将对LeakDiag的命令行模式以及日志文件的格式进行详细描述,并且将通过LeakDiag来分析和找出一个真实的内存泄漏问题。

Microsoft Detours

Microsoft Detours是一种在二进制级别上对现有代码进行修改或者增强的解决方案。通常,如果想修改或者增强现有的功能,往往需要对源代码进行修改并且重新编译。然而,在目前的商业开发领域中,你几乎无法获得某个组件或者产品的源代码。你可以首先通过Microsoft Detours来拦截二进制函数,然后提供自己的函数来替换原来的函数或者在调用原来的函数之前增加一些代码(通过Trampoline技术)。这种技术的实现原理是,将原来函数起始位置上的若干指令替换为一条无条件跳转到新函数的指令。需要注意的是,这个替换过程是在运行时动态进行的,而不是持久化的,这就意味着你可以对同一程序的不同实例采用相同的技术,并且每个实例都是相互独立的。

1.2   Windows调试工具集

应用场合    一组调试器和工具

当前版本    6.6.0007.5

下载地址    http://www.microsoft.com/whdc/ddk/debugging/

Windows调试工具集(Debugging Tools for Windows)是一个内容丰富的软件包,它包含了一些功能强大的调试器和工具,可以极大地提高开发人员的工作效率。

在下载地址中可以选择32位或者64位(Itaniumx64)等不同版本。软件包的安装过程非常简单,选择“Express”安装模式将安装所有必要的工具。这里需要提醒一点:如果你打算开发定制的调试扩展(Debugger Extension,我们将在第11章中看到相关的内容),那么必须选择“Custom”安装模式,并且选中安装SDK。在表1-1中给出了这个软件包的所有工具。

显然,最重要的工具就是调试器本身。在第2章和第3章中,我们将详细阐述调试器的工作原理、配置过程,以及最有效的使用方式。

在本章中,我们将详细介绍在本书中使用的所有工具。如果在工具的“下载地址”列中包含的信息是“Windows调试工具集的一部分”,那么就表示需要安装Windows调试工具集。

1-1   Windows调试工具集的工具

程序名        

agestore.exe     一个很方便的文件删除工具,它能够根据最近访问日期来删除文件

cdb.exe      基于控制台(Console)的用户态调试器。基本上等同于NTSD

dbengprx.exe     一个轻量级的代理服务器,用于在两台不同的机器之间转发数据

dbgrpc.exe   用于查询和显示Microsoft远程过程调用(Remote Procedure CallRPC)信息的工具

dbgsrv.exe   用于远程调试的进程服务器

dumpchk.exe  用于验证内存转储文件(Dump File)的工具

gflags.exe   用于启用或者禁止系统配置信息的工具

kd.exe   一个内核态的调试器

kdbgctrl.exe     用于控制和配置内核态调试连接的工具

kdsrv.exe    在内核态调试中使用的连接服务器

kill.exe     一个基于控制台的工具,用于终止进程

logger.exe   记录进程行为(例如函数调用)的工具

logviewer.exe    用于查看logger.exe生成的日志文件的工具

ntsd.exe     一个基于控制台的用户态调试器。基本上等同于CDB

remote.exe   用于远程操纵控制台程序的工具

rtlist.exe   远程进程列表查看器

symchk.exe   用于验证符号文件或者从符号服务器下载符号文件的工具

symstore.exe     用于创建和维护符号库的工具

tlist.exe    列出所有正在运行的进程的工具

umdh.exe     用于检测内存泄漏的工具

windbg.exe   带有图形用户界面的用户态和内核态调试器

请注意,在撰写本书的时候,Windows调试工具集的最新版本为6.6.0007.5。在你阅读本书时,很可能已经发布了一个更新的版本。尽管版本可能不同,但在调试器的输出结果中可能只是存在细微的差异,因此本书的所有内容仍然是适用的。在调试器的下载地址中还包含了一组之前的版本(前23个版本)。如果你希望使用与本书中相同的版本,那么可以下载版本号为6.6.0007.5Windows调试工具集。

1.3   UMDH

应用场合    内存泄漏检测

当前版本    6.0.5457.0

下载地址    Windows调试工具集的一部分

分析机制    日志文件

UMDH是另一个内存泄漏检测工具,它包含了LeakDiag的一个功能子集。LeakDiag能够跟踪来自各种分配器的内存,而UMDH只能跟踪来自堆管理器的内存。此外,在使用UMDH时需要启动操作系统对用户态栈回溯的支持。

在第9章中给出了如何通过UMDH来跟踪内存泄漏的示例。

1.4   Microsoft 应用程序验证器

应用场合    应用程序的一般性故障检测

当前版本    3.3

下载地址    http://www.microsoft.com/downloads/details.aspx? FamilyID = bd02c19c-1250-433c-8c1b-2619bd93b3a2&DisplayLang=en

分析机制    日志文件和调试器

每个有经验的开发人员都应该知道应用程序验证器(Application Verifier)这个工具。通过在进程中启用应用程序验证器,你可以捕捉所有的常规编程错误。这些错误包括无效的句柄、锁、文件路径等。一种良好的编程习惯是,在开发过程中为所有的相关进程启用应用程序验证器。然而,在应用程序验证器中的某些测试设置(Test Setting)可能极大地影响程序的执行速度,这可能使得一些与时间相关的问题无法暴露出来。解决这个问题的方法之一就是让应用程序验证器始终处于启用的状态,然后选择在特定的时刻禁用它,并且再次运行完整的测试集合以确保与时间相关的问题彻底消失。启用应用程序验证器的另一个最佳时机就是在修改软件产品中的错误(bug)时。通过启用应用程序验证器,你可以确保在修改错误时不会引入新的问题。

应用程序验证器的安装过程非常简单,只需使用默认的安装选项。在安装完成之后,你可以通过点击“Start”按钮,然后依次选择“All Programs”、“Application  Verifier”来启动程序。在图1-3中给出了应用程序验证器的启动界面。

1-3   应用程序验证器的启动界面

在“Applications”面板中显示了当前正在执行验证的应用程序。你可以通过“File”菜单中的“Add Application”来增加应用程序。反之,你还可以通过“File”菜单中的“Delete Application”来移除应用程序。

要改变某个应用程序的设置,首先在左边的面板中选择该应用程序,然后选择“View”菜单中的“Property Window”。这将在启动窗口的底部增加一个属性设置区,在属性设置区中可以控制以下行为:

?Propagate:当前映像(Image)的测试设置是否应该传递到子进程。如果设置了这个属性,那么当前映像的测试设置将被传递到子进程。

?AutoClr:如果设置了这个属性,那么当应用程序验证器开始运行时,将禁止在这个映像上的所有测试设置。

?AutoDisableStop:如果设置了这个属性,那么对于给定的问题,应用程序验证器只会报告一次。

?LoggingWithLocksHeld:如果设置了这个属性,那么应用程序验证器将记录DLL的加载和卸载等事件。需要注意的是,这将给应用程序带来一些问题,因为记录事件的动作需要在执行DllMain函数期间进行I/O操作。

要想获得每个测试设置的简短描述,可以将鼠标停在相应的测试设置上,直到出现一个提示信息。这个提示信息将告诉你是否需要通过调试器来查看这些测试的结果。

要想获得每个测试设置的详细描述,可以在测试设置上点击鼠标右键,然后选择以下两个选项之一:

?Properties:允许你控制所选测试设置的属性。例如,在Handles上选择“Properties”,可以指定在句柄跟踪时记录的信息数量。需要注意的是,并非所有的测试设置都有“Properties”选项。

?Verifier Stop Options:允许你控制所选测试设置的选项。在图1-4中给出了在Handles测试设置上选择“Verifier Stop Options ”时弹出的对话框。

上述对话框可以分为几个部分:

?在“Verifier Stop”中包含了该测试设置能够执行的所有验证停顿(Verifier Stop)。在图1-4中的“Verifier Stop”部分中显示了,在验证句柄时有6个可用的验证停顿。在这个窗口中的所有其他内容都是与所选中的验证停顿码(Verifier Stop Code)相关的。

?在“Description”中给出了对所选中的验证停顿的详细描述。

?Inactive”复选框控制着是否激活所选中的验证停顿。

?在“Severity”中控制验证停顿的严重程度。这个选项将直接影响验证停顿的表现形式。例如,如果将验证停顿00000300设置为“Ignore”,那么当这个停顿被触发时将不会中断到调试器(Break Into Debugger)。

?在“Error Reporting”中可以进一步指定在验证停顿被触发时发生的行为。复选框包括是否采取记录行为(例如是否被记录到某个文件中)以及是否生成栈回溯。单选按钮将指定当触发验证停顿时调试器的行为。你可以选择触发一个断点,抛出一个异常或者不发生任何中断。

?在“Miscellaneous”中可以指定验证停顿的触发频率。如果选中了复选框“Stop Once”,那么这个验证停顿只有在第一次遇到时才会触发。如果选中了复选框“Non Continuable”,那么当验证停顿被触发时将中断到调试器中,并且不能从验证停顿中恢复过来—这实际上就是使进程不能继续执行。

在启动界面中的Tests面板(参见图1-3)中给出了所有的测试设置。如果选中了某个复选框,那么将为在“Applications”面板中选中的进程启用相应的测试设置。在“Tests”面板正下方是关于测试设置的一个简短描述。

当对某个应用程序启用验证后,你可以启动这个程序,而应用程序验证器将在后台运行。根据测试设置的配置方式,你可以通过两种方式来查看应用程序验证器的运行结果。第一种方式就是查看相应的日志文件,首先选择菜单“View”下的“Logs”选项,然后再选择想要查看的应用程序日志文件。需要指出的是,并非所有的测试设置都是通过日志文件来报告结果。有些测试设置需要通过调试器来查看生成的结果。要想知道哪些测试设置需要通过调试器来查看结果,可以通过将鼠标悬停在测试设置上来获得帮助信息。如果某个测试设置需要使用调试器,那么你必须在调试器下运行程序以查看结果。

当应用程序验证器要求将调试器附加到进程上时,输出结果将遵循以下的格式:

VERIFIER STOP <stop-code> : <process-PID> : <message>

parameter -1: <description>

parameter -2: < description >

parameter -3: < description >

parameter -4: < description >

其中“stop-code”表示发生了指定的验证违例事件,“PID”表示发生故障进程的ID,“message”则是对故障的简单文本描述。参数列表取决于被执行的验证类型。

例如,在下面的输出结果给出了当进程试图关闭一个无效句柄时应用程序验证器所报告的信息。

=======================================

VERIFIER STOP 00000300 : pid 0xFF0: Invalid handle exception for current stack trace.

    C0000008 : Exception code.

    0007FBD4 : Exception record. Use .exr to display it.

    0007FBE8 : Context record. Use .cxr to display it.

    00000000 : Not used.

=======================================

This verifier stop is continuable.

After debugging it use 'go' to continue.

=======================================

通过GUI模式来为程序启用测试是非常方便的,但有时候我们需要以自动的方式来启动测试。例如,软件产品是在每天晚上构建的,并且在构建完成之后立即启动自动测试。作为测试过程的一部分,质量保证小组要求在测试期间启用应用程序验证器。此时,测试人员无需通过GUI版本的应用程序验证器在每天晚上手动启动测试过程,而是可以编写一个脚本并通过控制台版本的应用程序验证器来启动测试。应用程序验证器的默认安装路径为:

C:\windows\system32\appverif.exe

如果在启动appverif.exe时使用了/?开关时,那么你将看到以下输出:

Application Verifier 3.3.0045

Copyright (c) Microsoft Corporation. All rights reserved.

Application Verifier Command-Line Usage:

    -enable TEST ... -for TARGET ... [-with [TEST.]PROPERTY=VALUE ...]

    -disable TEST ... -for TARGET ...

    -query TEST ... -for TARGET ...

    -configure STOP ... -for TARGET ... -with PROPERTY=VALUE...

    -verify TARGET [-faults [PROBABILITY [TIMEOUT [DLL ...]]]]

    -export log -for TARGET -with To=XML_FILE [Symbols=SYMBOL_PATH]

[StampFrom=LOG_STAMP] [StampTo=LOG_STAMP] [Log=RELATIVE_TO_LAST_INDEX]

    -delete [logs|settings] -for TARGET ...

    -stamp log -for TARGET -with Stamp=LOG_STAMP [Log=RELATIVE_TO_LAST_INDEX]

    -logtoxml LOGFILE XMLFILE

    -installprovider PROVIDERBINARY

Available Tests:

    Heaps

    Handles

    Locks

    Memory

    TLS

    Exceptions

    DirtyStacks

    LowRes

    DangerousAPIs

    TimeRollOver

    Threadpool

    LuaPriv

    HighVersionLie

    FilePaths

    KernelModeDriverInstall

    InteractiveServices

    PrintAPI

    PrintDriver

(For descriptions of tests, run appverif.exe in GUI mode.)

Examples:

    appverif -enable handles locks -for foo.exe bar.exe

        (turn on handles locks for foo.exe & bar.exe)

    appverif -enable heaps handles -for foo.exe -with heaps.full=false

        (turn on handles and normal pageheap for foo.exe)

    appverif -enable heaps -for foo.exe -with full=true dlls=mydll.dll

        (turn on full pageheap for the module of mydll.dll in the foo.exe

    appverif -enable * -for foo.exe

        (turn on all tests for foo.exe)

    appverif -disable * -for foo.exe bar.exe

        (turn off all tests for foo.exe & bar.exe)

    appverif -disable * -for *

        (wipe out all the settings in the system)

    appverif -export log -for foo.exe -with to=c:\sample.xml

        (export the most recent log associated with foo.exe to c:\sample.xml)

    appverif /verify notepad.exe /faults 5 1000 kernel32.dll advapi32.dll

        (enable fault injection for notepad.exe. Faults should happen with

        probability 5%, only 1000 msecs after process got launched and only

        for operations initiated from kernel32.dll and advapi32.dll)

要想为指定的程序启用所有的测试设置,可以使用下面的命令行:

appverif.exe -enable * -for myexecutable.exe

除了为指定的程序启用测试设置之外,还可以从调试器中控制应用程序验证器。扩展命令!avrf正是用于从调试器中控制应用程序验证器。完整的测试设置列表请参见附录A,“应用程序验证器的测试设置”。

1.5   全局标志

应用场合    配置信息

当前版本    6.6.0007.5

下载地址    Windows调试工具集的一部分

可执行文件  gflags.exe

全局标志(Global Flagsgflags)是Windows调试工具集的一部分,可执行程序(gflags.exe)位于默认的安装路径下。例如,在我的系统上,我通常使用以下的命令行来启动gflags

C:\gflags.exe

在本书中使用的大部分工具都需要依赖Windows的支持才能正确地工作。例如,UMDH要求启用“Create User Mode Stack Trace Database”这个选项。全局标志(或者说gflags)是一种对各个选项的集中式配置工具。

GUI模式

大多数的选项要么是针对整个系统(即所有正在运行的进程),要么是针对单个进程。在图1-5中给出了gflags的主界面。

在“System Registry”标签页中包含的是针对整个系统的选项,在“Image File”标签页中包含的则是针对单个进程的选项。如果你修改了针对整个系统的设置,那么往往需要重启系统。在“Kernel Flags”标签页中包含的是只对内核产生影响的选项。对于针对单个进程的设置修改,只有在重启进程之后才能发挥作用。

gflags中的选项包含了操作系统中各个方面的配置信息,这些信息被保存在什么地方以及如何对它们进行解析?答案是:注册表。根据你所修改的设置是针对整个系统还是针对单个进程,相应的信息被保存在注册表中的不同位置上:

?针对整个系统的设置:HKEY_LOCAL_ MACHINE\ SYSTEM\ Current ControlSet\ Control \SessionManager\GlobalFlag

?针对单个进程的设置:HKEY_LOCAL_MACHINE\SOFTWARE\ Microsoft\ Windows NT\ Current Version\Image File Execution Options\<映像文件名>\GlobalFlag

在针对单个进程的注册表路径中,有一些值得我们注意的属性。除了在GlobalFlag中存储全局标志外,还可以存放一些其他的设置。例如,如果想要调试某个不是由你直接启动的进程(例如由服务控制管理器启动的一个服务),那么你可以通过以下的注册表键来启动这个进程的调试:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\Current Version\Image File

Execution Options\<映像文件名>\Debugger

你可以在这个注册表项中指定随进程一起启动的调试器。我们将在第2章中看到这个功能的详细使用。

在“Image File”标签页中包含的是针对单个进程的选项。在图1-6中给出了可用的选项。

当你第一次进入这个标签页时,所有的选项都处于“灰色”的状态,直到你在“Image”文本框中指定了一个映像名并且按下Tab键。

命令行模式

除了GUI模式之外,还可以通过命令行模式来运行gflags。在命令行中的选项与GUI模式中的选项是类似的:

usage: GFLAGS [-r [<Flags>]] |

    [-r +spp TAG | -r +spp SIZE |

    -r -spp |

    [-k [<Flags>]] |

    [-i <ImageFileName> [<Flags>]] |

    [-i <ImageFileName> -tracedb <SizeInMb>] |

    [-p <PageHeapOptions>] (use `-p ? for help) |

以下给出了每个选项的一些解释:

?-r控制针对整个系统的选项(类似于GUI模式中的System Registry标签页)。

?-k控制针对当前内核的选项(类似于GUI模式中的Kernel Flags标签页)。

?-i控制针对单个进程的选项(类似于GUI模式中的Image File标签页)。

?-p 控制页堆(Pageheap)选项。

上面的每个开关既可以显示当前的设置,也可以根据指定的标志来修改设置。如果你只是想要看看当前的设置,那么在使用开关(例如-i notepad.exe)时不指定任何标志。如果你想要启用这些设置,那么必须通过十六进制格式或者表示gflags选项的缩写形式来指定相应的标志。在表1-2中给出了gflags选项的缩写形式。

1-2   gflags选项的缩写形式

缩写形式            缩写形式          

soe 出现异常时停止  d32 启用对Win32子系统的调试

sls 显示加载器快照  ksl 允许加载内核调试符号

dic 调试初始命令    dps 禁止对内核栈分页

shg 如果GUI挂起则停止  scb 启用紧急系统中断

htc 启用堆尾部检查  dhc 在释放堆块时禁止合并

hfc 启用堆释放检查  ece 启用关闭异常

hpc 启用堆参数检测  eel 启用异常日志

hvc 调用时进行堆的验证  eot 启用对象句柄类型标记

vrf 启用应用程序验证器  hpa 启用页堆

ptg 允许内存池标记  dwl 调试WINLOGON

htg 允许堆标记  ddp 禁用内核态的DbgPrint输出

(续)

缩写形式            缩写形式          

ust 创建用户态的栈回溯数据库    cse 提前创建临界区事件

kst 创建内核态的栈回溯数据库    ltd 以自顶向下的方式加载DLL

otl 为每个类型维护一个对象列表  bhd 启用无效句柄检测

htd 通过DLL启用堆标记  dpd 禁止对受保护DLL进行验证

dse 禁用栈扩展  lpg 尽可能使用大内存页来加载映像

要设置某个选项,可以使用 +<选项的缩写形式>;要去掉某个选项,可以使用-<选项的缩写形式>。例如,如果你想为notepad.exe创建用户态的栈回溯数据库,那么可以使用下面的命令:

C:\> gflags /i notepad.exe +ust

Current Registry Settings for notepad.exe executable are: 00001000

    ust - Create user mode stack trace database

反之亦然,如果你想取消这个选项,那么可以使用以下命令:

C:\> gflags /i notepad.exe -ust

Current Registry Settings for notepad.exe executable are: 00000000

如果你只是想查看某个映像的设置信息,那么可以使用以下命令:

C:\> gflags /i notepad.exe

Current Registry Settings for notepad.exe executable are: 00000000

要想查看哪些选项可用于页堆和应用程序验证器,可以使用以下命令

C:> gflags.exe /p /?

以及

C:> gflags.exe /v /?

最后一个重要的开关是-tracedb,它用来指定栈回溯数据库的大小。如果在系统中存在着非常多的行为,那么很容易超出数据库的最大限制。你可以通过这个开关来定制数据库的大小。

本章不会讨论gflags中各个选项的含义,而只是对这个工具做一些简单的介绍。在第二部分中,我们将详细介绍gflags中的各个选项,以及如何利用它们来跟踪一些有趣的难题。

1.6   进程浏览器

应用场合    分析系统和进程的健康状态

当前版本    10.2

下载地址    http://www.microsoft.com/technet/sysinternals/ Processes AndThreads / ProcessExplorer.mspx

可执行文件  procexp.exe

进程浏览器(Process Explorer)最初是由SysInternals公司的团队开发出来的,现在这家公司已被Microsoft收购并被归属于TechNet。进程浏览器很容易被认为是Windows任务管理器(Task Manager)的一个增强版本。它给出了当前在系统中运行的所有进程的详细信息。进程浏览器的功能主要包括:

?句柄的使用信息,包括句柄的类型以及名字。此外,它还提供了每个句柄的详细信息,包括引用计数(Reference Count)、信号状态等。

?强大的搜索能力,你可以在所有进程之间通过名字或者类型来搜索句柄,或者搜索加载了特定文件的所有进程。

?详细的进程信息,例如线程的使用情况、性能历史数据、安全性等。

这个工具的功能非常强大,大部分用户在使用了这个工具后都不会再使用传统的Windows任务管理器。事实上,在进程浏览器中有一个选项就是“Replace Task Manager”(替代任务管理器)。

这个工具的安装包是一个zip文件,你只需将其解压到指定的位置即可。可执行文件的名字是procexp.exe。在图1-7中给出了第一次启动进程浏览器时的界面。

在默认情况下,在进程浏览器中包含两个主要的窗口。在顶部的窗口中列出了当前在系统中运行的所有进程,而在底部的窗口中则给出了在进程中打开的所有句柄(以及句柄的名字)。要想定制顶部窗口中的显示列,可以首先在列的状态条上点击右键,然后选择“Columns”(列)菜单项。底部窗口中的显示内容可以由显示进程中的句柄修改为显示进程中的DLL,这需要在菜单“View”的子菜单“Lower Pane View”中选择“DLLs”选项。

1-7   进程浏览器的GUI界面

我们将在第9章中通过进程浏览器来跟踪资源泄漏问题。

进程监视器   进程监视器(Process Monitor)是一个最近才发布的工具,它与进程浏览器是相关的。进程监视器是一个高级监测工具,它能够显示文件系统、注册表以及进程/线程行为等信息。本书的一些章节将用到这个工具。这个工具是免费的,下载地址为http://www. microsoft. com/ technet/ sysinternals/utilities/processmonitor.mspx

1.7   Windows驱动程序开发包

应用场合    一般性的开发

当前版本    WDK 6000

下载地址    http://www.microsoft. com/whdc/DevTools/WDK/WDKpkg.mspx

Windows驱动程序开发包(Windows Driver KitWDK)是一个功能强大的完整开发环境,可以用于开发驱动程序产品。这个工具的特别之处在于包括了大量功能强大的开发工具(包括编译器和链接器)。

WDK支持在所有的Windows版本中构建程序,从Windows XP一直到Windows Vista。因此,在开发目标平台中包括了x86x64以及Itanium等架构。

WDK的安装过程非常简单,通常只需选择默认的安装选项就足够了。在开始安装WDK时,你需要预先安装一些其他的软件包(例如.NET框架2.0)。在安装完这些软件包后,就可以开始安装WDK

在图1-8中给出了安装过程中的各种选项。

在默认情况下,“build environment”、“documentation”、“tools”以及“samples”等组件将被安装。

WDK的默认安装路径为:

%systemdrive%\WINDDK\6000

1-8   WDK的安装选项

在前面已经提到过,“documentation”在默认情况下将被安装。除非是硬盘空间有限或者你对WDK了如指掌,否则你最好还是保留这个选项。

最后,在“tools”选项中可以选择想要安装的工具。

在“tools”选项中的大多数工具都是特定于某种设备驱动程序的开发人员,但有些工具(例如命令行的注册表工具)也是非常有用的,它们并不局限于特定的设备驱动程序开发人员,而是适用于所有类型的开发工作。

在安装过程结束后,需要打开一个WDK的命令行窗口来构建源代码,首先点击“Start”按钮,然后依次选择“All Programs”、“Windows Driver Kits”、“WDK 6000”和“Build Environments”,最后选择目标平台。在WDK中包含了两种构建环境,分别为freecheckedfree版本通常是产品的最终版本,它包含的是高度优化的代码。而checked版本则是方便开发人员在开发过程中诊断问题。在checked版本中通常只有最少甚至根本没有任何优化,这使得开发人员更容易调试代码。

打开一个Windows XP Checked x86 Build Enviroment窗口,并且跳转到以下目录:

C:\AWD\Chapter1

在这个目录下包含了一个非常小的控制台应用程序。要构建这个应用程序,可以输入命令build /ZCc,如下所示:

C:\AWD\Chapter1>build /ZCc

BUILD: Adding /Y to COPYCMD so xcopy ops won hang.

BUILD: Object root set to: ==> objchk_wxp_x86

BUILD: Compile and Link for i386

BUILD: Examining c:\awd\chapter1 directory for files to compile.

BUILD: Compiling (NoSync) c:\awd\chapter1 directory

Compiling - sample.cpp for i386

BUILD: Linking c:\awd\chapter1 directory

Linking Executable - objchk_wxp_x86\i386\sample.exe for i386

BUILD: Done

    2 files compiled

    1 executable built

这个命令在成功执行后将生成sample.exe文件,这个文件位于以下目录:

C:\AWDBIN\WinXP.x86.chk

运行这个程序将输出以下结果:

C:>C:\AWDBIN\WinXP.x86.chk\01sample.exe

Welcome to Advanced Windows Debugging!!!

需要注意的是,在构建时生成的目录名遵循以下的命令规范:

obj<flavor>_<platform>_<architecture1>\<architecture2>\<target executable>

其中,“flavor”可以是以下值:

?chk:对应于checked版本的构建

?fre:对应于free版本的构建

platform”可以是以下值:

?wnet:对应于Windows Server 2003

?wxp:对应于Windows XP

architecture1”可以是以下值:

?x86:对应于Intel 32位处理器

?amd64:对应于AMD 64位处理器

architecture2”可以是以下值:

?I386:对应于Intel 32位处理器

?AMD64:对应于AMD 64位处理器

本书的所有示例程序都是通过WDK来构建的;这些示例程序也可以在Visual Studio环境中编译,但我们没有对在Visual Studio环境中生成的构建进行测试。

本书并没有详细介绍WDK的各个方面,而只是使用了WDK来构建示例程序以说明一些问题的调试过程,我们在软件开发中经常会遇到这些问题。关于WDK更为详细信息请参考相关的文档。

1.8   Wireshark

应用场合    网络协议分析器

当前版本    0.99

下载地址    http://www.wireshark.org/download.html

分析机制    网络跟踪信息

Wireshark是一个功能强大的开源网络协议分析器,它可以用来诊断在跨机器调用中的问题。Wireshark既可以捕捉并且分析来自某个活跃网络的数据,也可以分析在之前捕捉并保存下来的数据。

在安装Wireshark过程中可以选择“Typical”安装选项。

在第8章的一些示例中将介绍如何通过Wireshark来分析和跟踪代码中的进程间通信问题。

1.9   DebugDiag

应用场合    定位进程中问题的(内存泄漏以及崩溃等)

当前版本    1.0

下载地址    IIS诊断工具集(IIS Diagnostics Toolkit)的一部分, http://www.

    microsoft.com/downloads/details.aspx?familyid=9BF

    A49BC-376B-4A54-95AA-73C9156706E7&

    displaylang=en

分析机制    调试器、日志文件

DebugDiag最初是为了帮助分析IIS的性能问题而开发的,它同样可以用于任何其他的进程。它主要包括以下的功能:

?进程崩溃数据收集:这一点非常像Windows调试器,DebugDiag将附加到一个进程,并且在程序崩溃或者发生异常时生成转储文件。

?内存泄漏:DebugDiag工具将一个DLL注入到需要检测内存泄漏的进程中,并且监测进程中的内存分配情况。然后,它将生成一个转储文件,而开发人员可以对这个文件进行分析以找出发生泄漏的代码。根据在程序中使用的不同内存分配模式,这个工具可以计算泄漏概率(Leak Probability)。

?一个功能强大的可扩展对象模型(基于COM):它可以提供一些在分析内存泄漏和进程崩溃时需要的信息。

在安装IIS诊断工具集时可以选择“Typical”安装选项。

14章将介绍如何通过DebugDiag来分析和跟踪内存泄漏和进程崩溃。

1.10   小结

在本章中介绍的所有工具可以说是开发人员的最佳拍档。这些工具使你不再需要通过反复试验的方法来找出问题,因此可以极大地减少在查找和跟踪问题上所花的时间,此外它们还能够发现一些在测试中可能无法发现的问题。考虑到这些工具都是可以免费下载的,我们没有任何理由拒绝将这些工具集成到开发过程中(把它们作为开发工具的一种补充)。如果想要在调试时变得更为高效,那么掌握这些工具是非常关键的。在本书的剩余部分中,我们将通过这些工具来跟踪一些困难和常见的问题,并以此来教会你如何掌握这些工具。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
platform-tools_r31.0.3-windows.zip platform-tools是很多刷机的朋友都会用到的工具包,Android SDK其中的platform-tools包可以对安卓设备进行调试,包括解锁、刷机等操作都可以使用这个工具包来进行,其中包含开发app的平台依赖的开发和调试工具,包括 adb、fastboot等,有需要的赶快下载吧!功能介绍platform-tools包含开发app的平台依赖的开发和调试工具,包括 adb、fastboot等android sdk里的各目录作用AVD Manager.exe:虚拟机管理工具,用于建立和管理虚拟机。SDK Manager.exe:sdk管理工具,用于管理、下载sdk、sdk工具,能及扩展工具tools目录:包括测试调试、第三方工具。模拟器、数据管理工具等。build-tools目录:编译工具目录,包含了转化为davlik虚拟机的编译工具。包括aapt(Android Asset Packaging Tool):编译应用程序的资源文件(包括AndroidManifest.xml和你的Activities的xml文件),生成R.java文件,这样你就可以从你的java代码中引用资源。aidl:把.aidl 接口转换成java接口.dx:转化.class中间代码为dvlik中间代码,所有经过java编译的生成.class文件都需要此工具进行转换,最后打包进apk文件中.dexdump:dump devlik中间代码platform-tools目录:包含开发app的平台依赖的开发和调试工具。包括adb:android调试工具fastboot:boot工具platforms/目录:包括android的平台。包含在android.jar库中。你必须指一个平台为你的编译目标。system-images目录:编译好的系统映像。模拟器可以直接加载。sources目录:android sdk的源码目录samples目录:sdk例子
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值