var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-333696-1']); _gaq.push(['_trackPageview']); _gaq.push(['_trackPageLoadTime']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })();
  • 2008年02月28日

    Windows泄漏诊断工具

    分类:

    LeakDiag是一个在内存泄漏过程中使用的工具,可以用来精确地找到内存泄露一直到代码行。LeakDiag拦截指定内存分配的调用并跟踪各种调用栈,它报告已分配但尚未释放的内存,这一信息允许一个人排除一个内存泄露问题,以精确查看哪些组件进行了该分配。使用正确的调试符号,甚至请求分配的代码行能看见。它使用微软的Detours技术

     LeakDiag支持5种不同的分配:

    l  虚拟分配

    l  堆分配[默认]

    l  线程局部存储(Thread Local StorageTLS指允许一个进程的多个线程存储每个线程所独有的数据的一种Win32机制)分配

    l  COM分配(外部和内部)

    l  C运行时分配

     

    Debugging Tools for Windows是一个全面的,免费包,它包含强大的调试和帮助开发者在他们的日常工作变得更有效率的工具。

    该包中的部分工具列表

    映像

    说明

    agestore.exe

    方便的文件删除工具,根据上次访问日期删除文件。

    cdb.exe

    基于控制台的用户模式调试程序。几乎完全跟NTSD相同。

    dbengprx.exe

    轻量级代理服务器,中继两个不同的计算机之间的数据。

    dbgrpc.exe

    用于查询并显示微软远程过程调用(RPC)信息的工具。

    dbgsrv.exe

    用于远程调试的进程服务器。

    dumpchk.exe

    用于验证内存转储文件的工具。

    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

    用户模式和内核模式调试器使用图形用户界面。

     

    UMDH是另一种形式的内存泄漏检测工具,是Debugging Tools for Windows一部分,它包括LeakDiag功能的一个子集。LeakDiag能够从各种分配跟踪内存,然而UMDH只能够跟踪来自堆管理器的内存。此外,它要求用户模式栈跟踪在操作系统中被启用。

     

    Microsoft Application Verifier是一个运行时对非托管代码的验证工具,来帮助查找细微的编程错误,这些错误可能很难确认一般应用程序测试。

     

    Global Flags应用程序(gflags.exe)是Debugging Tools for Windows一部分,是为所有可能选项的一站式配置工具。

     

    Process Explorer是最容易被描述为Windows任务管理器一个强大替代。它提供有关所有当前运行在系统上进程的详细信息,能非常直观地显示新创建/终止的进程。

     

    Process Monitor是一个Windows高级监控工具,能显示实时文件系统、注册和进程/线程活动。

     

    Microsoft Spy++Visual Studio工具中的一个,提供系统进程、线程、窗口和窗口消息的图形视图,能帮助查看窗口属性、相互关系,查找出错进程,记录窗口消息传递。

     

    Windows Driver Kits(WDK) 是一个功能强大和完整的构建环境可用于生产开发。此开发环境是真正了不起,因为它包含了大量的功能强大的开发工具(包括编译器和连接器),并免费提供来自微软。

     

    Ethereal是一个功能强大、开源的网络协议分析工具,可用于帮助解决跨计算机调用故障。Ethereal可以让你捕捉和分析来自一个实时网络的数据或分析以前创建的捕获文件。

     

    DebugDiagIIS诊断工具包的一部分,最初设计为帮助分析IIS性能问题,但它同样可以很好用于任何进程。它有下列特性:

    l  进程崩溃/挂起数据收集:附加到一个进程并在崩裂或异常发生时生成转储文件。

    l  内存泄漏:将一个DLL注入到要监视的进程,为泄漏和监视随着时间推移的内存分配。

    l  一个功能强大的可扩展对象模型 (基于COM):这个出现信息需要分析内存泄漏和进程崩溃/挂起。

     

    调试的两种基本类型为用户态(User ModeUM)和内核态(Kernel Mode)调试。

     

    用户态调试能够审查程序状态(运行的线程,内存内容,寄存器和开在进程空间的内核对象)代表调试目标。用户态调试也有能力改变状态(改变线程执行秩序,改变寄存器的内容,并改变存储器内容)和同时被通知发生在目标进程里的特别事件。用户态调试也可以审查一个包含给定进程快照的转储文件,也被称为事后调试。Debugging Tools for Windows带有3个基本用户态调试器:cdb.exentsd.exewindbg.exe。所有这三个能够调试控制台应用程序,以及图形化Windows程序。如果有源码或直接机器级调试,所有这三个可用于执行源代码级调试。

    l  cdb.exeCDB)是一个基于字符的控制台程序,它能低层次分析Windows用户模式内存和构造,它对调试一个当前正在运行或最近崩溃的程序极为强大,它能附着运行在早期启动阶段(如WinLogonCSRSS)的重要子系统进程而图形调试器不工作在启动进程早期,因为图形子系统尚未初始化。如果目标应用程序是一个控制台程序,目标将与CDB共享控制台窗口。命令行下用cdb p <pid>或者cdb pn <image name>或者cdb –psn <service name>调用,用tlist.exe找出进程ID

    l  ntsd.exeNTSD)在各个方面等同于CDB,除了当启动时它会产生一个新的文本窗口。更确切说,CDB是一个控制台应用程序,而NTSD是一个图形用户界面应用程序,它可以创建子集的控制台。像CDBNTSD完全有能力调试控制台应用程序和图形Windows程序,唯一依次它们不能相互替代是在你调试一个用户态系统集成时,在这种情况下,进程内的错误或中断可能会导致所有的控制台应用程序工作不正常,这时可以配置NTSD来运行,它根本没有控制台。ntsd.exe已从Windows Vista及以后系统中移除。

    l  windbg.exewindbg)是一个强大的图形界面调试器,它带有同控制台模式调试器的调试能力,增强了自动化例行任务如审查当前调用栈,查看变量(包括C++对象),显示当前寄存器,当符号文件合适设置时它能进行源码级调试。调试期WinDbg工作区的设置能被更改和保存,所有这些能力使WinDbg称为交互式调试用户态应用程序首选工具。

     

    内核调试器可以把电脑系统作为一个整体来调查, 每个进程或线程只是数据结构的一个收集,内存地址跟装在系统上的物理内存有直接关系,并且分页出的内存不可访问如果没有加载它进物理内存。内核态调试可以改变整个计算机状态并可被特殊事件通知,这被称为实时内核调试。内核调试器主要用于设备驱动程序开发者,但当调试用户态应用程序时同样也能非常有用。内核调试器能调试运行一个不同于主机平台的目标计算机,调试器会自动侦测目标机正运行的平台。Debugging Tools for Windows带有2个基本内核调试器:kd.exewindbg.exe

    l  kd.exeKD)是内核态基于字符的调试器。它能深入分析Windows上内核态活动并可以被用来调试内核态程序和驱动,调试用户态应用程序,或监视操作系统自身行为。

    l  windbg.exewindbg)也能进行内核态调试。WinDbg提供了对Windows内核、内核态驱动和运行在该系统上的用户态应用程序的全部代码级调试。它允许你调试任何应用程序或内核模块以一种友好的用户界面,靠跟踪源码、设置基于源内容的断点等等。

     

    每个基于NT操作系统有两种不同的程序生成模式,即Free Build(Retail Build)Checked Build (Debug Build)

     

    一般,符号文件包含

    l  全局变量名和地址

    l  函数名,它们的地址和它们的签名

    l  FPOFrame Pointer Omission)数据

    l  局部变量名和地址

    l  符号对应的源文件路径和行数

    l  变量,结构等的类型信息

     

    出于各种原因,微软使用了几种符号格式:通用对象文件格式(Common Object File FormatCOFF),如VC生成的目标文件(.obj);CodeView format (CV)Program Database format (PDB)是用于保存调试和项目状态信息的文件,通常用Microsoft Visual Studio 进行debug的时候将产生pdb文件,调试的时候默认放在和对应应用程序集相同目录。

    注意:从官网下载Symbol 包到目录downsym后,windbg中设置_NT_SYMBOL_PATH一定要是srv*downsym*http://msdl.microsoft.com/download/symbols,让windbg自动下载匹配symbols

     

    处理器使用由一个栈寄存器控制的栈存储区来记录返回地址,这里执行必须继续当完成当前函数调用后。x86处理器栈始终向下增长(从高地址向低地址占用),它被存储靠名为esp的栈指针寄存器。

     

    【注】

    ①.   Detours是一个可以在x86,x64,IA64平台上测试任意Win32函数的程序库(可在http://www.microsoft.com/china/CRD/intellectualproperty/Technology_View.aspx?id=38免费获得),Detours可以通过为目标函数重写在内存中的代码从而拦截win32函数,这个过程发生在运行时而且并不持久,Detours软件包还可以将任意的dll和数据片段(称之为有效载荷)注入到任意的win32二进制文件当中。

    ②.   Free Build生成的是最终用户版本,针对生成的二进制文件进行了彻底的优化,禁用了调试断言,并剥离了调试信息。这样一来使可执行程序文件更小,加载更快,使用的内存也更小。Checked Build 生成的是测试和调试版本。它包含额外的Free Build所没有的错误检查,参数验证和调试信息,Checked Build有助于隔离和跟踪可能导致不可预见的行为的问题,比如内存溢出,不正确的设备配置。虽然Checked Build提供了额外的保护,但与Free Build比较,它需要更多的内存开销和磁盘空间。由于可执行程序包含符号调试信息;调试时要执行附加的代码、参数检查和输出调试诊断信息,从而导致性能下降。

    ③.   Frame Pointer主要用作在调用栈中存放函数的基址,用寄存器ebp。发生函数调用时,首先将函数参数(arguments入栈,而后执行调用(call)指令将返回地址(return address)入栈;再进入函数执行,第一个指令将调用者基指ebp入栈,然后把栈指针(指向刚入栈的调用者基指)赋值给寄存器ebp,然后esp自减空出栈空间容纳函数的局部变量(先将定义的局部变量入栈,调用完后自动将这些局部变量出栈),然后将函数返回值放入eax,最后出栈恢复调用者基指ebpFPO优化使得没有符号几乎不可能调试程序,因此FPOWindows XP SP2及其以后的操作系统中没被使用。

     

    【资源】

    Playing with the stack

    Checked and Free Build Differences

    WinDbg / SOS Cheat Sheet

    WinDBG用法详解《软件调试》30

    Practical Foundations of Debugging

    分享到:

    历史上的今天:

    本月文章收录 2011年02月28日
    本月文章收录 2010年02月28日
    本月文章收录 2009年02月28日
    本月文章收录 2007年02月28日