精华内容
下载资源
问答
  • Windows调试工具入门—1 NetRochttp://www.DbgTech.net一、 引子Debugging Tools for Windows是微软发布的一套用于软件调试的工具包(后面如果没有指明,那么我会使用WinDbg来作为这一套调试工具的简称)。...

    Windows调试工具入门—1

    <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

     

     

     

    NetRoc

    http://www.DbgTech.net

    一、       引子

    Debugging Tools for Windows是微软发布的一套用于软件调试的工具包(后面如果没有指明,那么我会使用WinDbg来作为这一套调试工具的简称)。我第一次接触是在三年前的一个内核驱动项目,由于进行了IDT中键盘鼠标中断的Hook,使用Softice调试时造成会造成影响,只得使用WinDbg通过串口进行双机调试。自此之后这个Windows平台下最为强大的调试工具一直是开发过程中的必备。这里我毫不掩饰的说“最强”,可能很多通过逆向工作而接触调试的朋友不会认同,但是我相信随着对WinDbg了解的加深,以及对这套工具在软件开发中应用的了解,他们也会和我有一样的观点。

    一直以来,软件调试技术在软件开发者中都没有得到足够的普及和重视,互联网上能找到的系统描述的资料也较少。随着国内软件行业整体的发展和进步,这些技术慢慢开始得到推广。2008年出版的有关调试的数据比以往都要多。我有幸拜读了Raymond的《软件调试》,以及熊力的《Windows用户态程序高效排错》,获益良多。 这几年的工作中也积累了一些关于Windows调试工具的知识,希望能够将这些东西进行一些分享。因此,利用几个月空闲时间翻译了WinDbg文档中上半部调试器配置、使用和命令介绍的内容,同时准备写一些关于WinDbg调试工具的初级文章。希望能够为对调试技术感兴趣而又苦于没有资料的朋友提供一些帮助。

    特别感谢我的前同事小喂。虽然他第一条串口线还是我焊的,但是他对于WinDbg的使用和了解程度很快就超过了我。在相当长时间的共事和讨论中,让我学到了很多。

    二、       Windows调试工具的简介和组成

    WinDbg是专门为Windows NT系列操作系统设计的调试器,最早是作为Windows NT 3.1的工具发布的。其后也一直跟随NT操作系统的发展而不断发展完善。如果用一句话来概括,可以说WinDbg是为了软件开发而存在的调试工具。软件包中的调试器和小工具的各种功能都是为了配合软件的开发而设计的,并且覆盖到了Windows平台下各种不同类型项目的调试(传统的SDKMFC应用程序、.NET平台应用、COM应用、软硬件驱动程序等等)

    Windows调试工具包中的调试器包括WinDbgKDCDBNTSD。其中, KD用于内核调试;CDBNTSD用于用户态调试,在功能和使用上几乎完全一致;WinDbg是内核调试器和用户态调试器的综合体,由于功能完善并且具有图形界面,所以是最常用的工具。它们能够在x86Itaniumx64机器上的所有NT平台操作系统中运行。

    另外,工具包中还有一些小工具,下面是常用的几个:

    l  KDbgCtrl:用于控制和配置内核调试的一些参数。例如是否只有当发生异常时才会启用内核调试、设置DbgPrint缓冲区大小、如何处理用户模式异常等等。

    l  ADPlus:这是一个VB脚本,可以为一个或多个进程自动创建内存dump

    l  SymStore:用于创建符号存储。当需要创建自己的符号存储时就要用到它了。

    l  SymProxy:用于在网络中创建单独的HTTP符号服务器,以供所有调试器使用。该工具特别适合企业级应用的环境,可以将多个符号存储通过单一的接入点提供使用。

    l  DbgSrvKdSrvRemote.exe:用于远程调试。

    l  GFlags:用于编辑Global Flags

    l  UMDH:用于对用户模式堆分配的情况进行转储和分析。

    l  USBView:这是WinDbg 6.10.3版本才加入到软件包中的工具,可以查看当前连接到系统中的USB设备信息。

    另外,Application Verifier虽然没有包含在软件包中,但是也是一个非常强大的工具。可以对程序运行时的很多状态进行监控,以发现一些普通调试难以找到的错误。下面是Application Verifier配置界面的一个截图:

    <?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" />

    Application Verifier可以在这个页面下载:http://go.microsoft.com/fwlink/?linkid=108353

    三、       Windows调试器和其他熟知的调试器比较

    可能很多已经习惯使用SoftICEOllyDbgIDE调试器的朋友会提出这样的疑问:在这么多调试器中,为什么要选择WinDbg?它究竟有什么特点?

    设想一下下面几个场景:

    l  公司的软件针对企业级用户,该客户在地球另一半的美国。有一天客户抱怨了一个BUG,但是从抓取的dump又没办法看出个所以然,想进行动态调试查找原因。公司预算有限,不能让你过去出差顺便旅游、对方公司有防火墙,不允许外部连接,等等等等。。。怎么办?

    l  项目规模很大,涉及到的模块多,版本也多,并且是由不同部门开发的。这些部门可能遍布五湖四海。如何在调试其中某个模块时,能够快速获得它的符号和源文件,而不用每次都从一大堆不同版本的文件中辛苦找寻?调试到某个阶段,突然发现这不是自己的模块出现问题,如何快速知道这个问题应该找谁解决?项目某些重要模块有保密需要,如何控制调试人员访问符号和源文件的权限?

    l  驱动程序怎么才能源码调试?SoftICE不支持新系统,我要在Vista上调试怎么办?

    l  软件中包含一个Windows服务组件,但是每次还没有登陆到桌面之前就崩溃了,怎么进行动态调试?

    l  我想调试Explorer,调试IE,调试CSRSS,调试……,但是调试器一附加上去,系统就会出问题。怎么办?

    l  公司发布的软件,有用户反馈和XXX安全软件冲突老是造成系统崩溃,但是搭建环境之后却又没有办法重现;对方是个普通用户,鼠标都抓得不太稳。用户很火大,闹着要抓个老虎到公司来找你上司做俯卧撑,后果很严重,怎么办?

    在现实环境中,有很多复杂的调试场景,我们需要专业级的调试器来解决这些问题。而WinDbg恰恰提供了这种商业软件环境下的专业级软件调试功能,它和其他很多我们熟知的调试器的区别也在于此。

    我们将WinDbg和其他调试器分作内核调试器和用户态调试器两类来进行比较。

    内核调试方面:

     

    WinDbg

    SoftICE

    原理

    Windows操作系统内置调试支持

    Hook中断,接管系统

    系统和平台支持

    x86Itaniumx64机器上的所有NT平台操作系统

    x86,由于已停止更新,新版本操作系统中支持不佳,老系统中也常常遇到兼容性问题

    符号和源码支持

    完美支持符号调试和源码调试,可直接使用微软公共符号

    支持符号调试和源码调试,但是需要先转换符号格式

    远程调试

    通过和远程工具、转发器的配合,实现各种灵活的远程调试方式,以支持不同的网络环境

    通过Virtual SoftICE支持基于网络的远程调试

    硬件需求

    通过串口、1394USB 2.0接口的双机调试;通过Pipe连接的虚拟机调试;或者功能有诸多限制的本地内核调试

    单机或者通过Virtual SoftICE的双机调试

    用户界面

    由于是双机调试,调试器只是主控机上运行的一个普通软件。拥有GUI界面,可以同时进行其他应用。

    单机调试时完全接管系统,字符界面,操作不是很方便。

    扩展性

    支持脚本和插件,并且软件包本身提供了大量非常有用的插件

    支持插件

    由于SoftICE已经停止更新,WinDbg可以说是现在Windows平台上唯一好用的进行内核调试的工具,并且随着新版本的不断推出,不断地添加对新版操作系统的支持以及完善功能。强大的符号支持,方便的源码调试,使得内核级调试能够事半功倍。

    用户态调试方面:

     

    Windows调试工具包

    OllyDbg

    Visual Studio调试器

    原理

    Windows的用户程序调试支持

    Windows的用户程序调试支持

    Windows的用户程序调试支持

    系统和平台支持

    主要基于NT系统,9x内核下支持不佳并且需要安装附加模块

    主要支持NT系统,9x下也可以使用

    新版本的VisualStudio不支持在9x系统下安装。VC6之前可以在9x下调试

    符号和源码支持

    完美支持符号调试和源码调试,可直接使用微软公共符号

    支持符号调试和源码调试

    支持。VS2008开始可以直接使用微软公共符号

    远程调试

    通过和远程工具、转发器的配合,实现各种灵活的远程调试方式,以支持不同的网络环境

    不支持

    较新版本Visual Studio中支持

    无源码调试

    反汇编分析能力较弱,GUI界面偏弱,无源码时调试比较困难

    强大的代码分析能力,无符号和源码时也能很好的进行调试

    无源码调试的支持很弱,使用不便

    用户界面

    GUI界面不是很丰富,大量操作需要通过命令

    GUI界面强大,能够实现大多数调试操作

    介于WinDbgOllyDbg之间。

    扩展性

    支持脚本和插件,并且软件包本身提供了大量非常有用的插件

    支持脚本和插件,有大量可用的资源

    支持插件扩展

    Dump文件调试

    支持,分析功能强大

    不支持

    支持,但是不够强大

    .NET调试

    通过SOS.dll支持,进行高级调试比较方便

    不能直接支持

    功能强大易用,绝大多数情况下都能解决问题

    由于WinDbg功能相当复杂,有很多方面并不能一一比较,例如非侵入式调试、通过WinDbg控制CDBNTSD来调试系统服务、创建和分析Dump文件等等。

    总体来说,WinDbg更适合作为软件项目开发和维护过程中的调试工具使用,而OllyDbg更适合逆向工程。

    四、       何时使用Windows调试工具

    根据我个人对WinDbg的使用经验来说,它更适合作为开发维护的辅助工具来使用。

    如果要进行用户态的逆向工程,推荐使用OllyDbgIDA这些拥有强大汇编程序分析能力的工具。

    WinDbg更适用于以下这些场合:

    l  商业软件的Debug和客户支持

    l  内核驱动的调试,以及对驱动进行逆向工程时进行动态调试

    l  研究Windows本身的内核或者软件

    l  疑难BUG的调试,如死锁、COM调用、资源泄露、堆栈或者堆溢出

    l  以性能优化为目的的调试

    对调试目标基本不造成影响的非侵入式调试

    展开全文
  • Windows调试工具集

    千次阅读 2009-06-06 21:44:00
    1.2 Windows调试工具集应用场合一组调试器和工具当前版本6.6.0007.5下载地址http://www.microsoft.com/whdc/ddk/debugging/ Windows调试工具集(Debugging ToolsforWindows)

    1.2 Windows调试工具集

    应用场合

    一组调试器和工具

    当前版本

    6.6.0007.5

    下载地址

    http://www.microsoft.com/whdc/ddk/debugging/

     

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

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

    表 1.1 在Windows调试工具集中包含的工具

    程序名

    描述

    agestore.exe

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

    cdb.exe

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

    dbengprx.exe

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

    dbgrpc.exe

    用于查询和显示Microsoft远程过程调用(RemoteProcedureCallRPC)信息的工具。

    dbgsrv.exe

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

    dumpchk.exe

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

    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

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

     

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

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

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

    展开全文
  • Windows 调试工具入门-2-基本调试操作

    千次阅读 2012-11-29 18:00:31
     使用Windows 调试工具进行调试,大部分和调试器之间的交互都是通过调试器命令 窗口来进行的。命令的输入、输出都是在调试器命令窗口中显示出来。对WinDbg 来说, 调试器命令窗口是名为”Command”的窗口;对于KD...
    
    


    一、  调试器命令窗口


    1、 简介
        使用Windows 调试工具进行调试,大部分和调试器之间的交互都是通过调试器命令
    窗口来进行的。命令的输入、输出都是在调试器命令窗口中显示出来。对WinDbg 来说,
    调试器命令窗口是名为”Command”的窗口;对于KD、CDB 和NTSD 来说,整个命令行窗
    口就是调试器命令窗口。这里主要介绍WinDbg 中的调试器命令窗口。
         一般来说WinDbg 运行之后都会打开一个标题为Command 的子窗口,在没有调试目
    标的时候,这个窗口是不能接受输入输出的,这时WinDbg 处于静止模式,只有在打开
    调试目标之后,才能够使用它和调试器交互。

    窗口分为三个部分:
      位于上部的面积最大的是命令输出窗口。所有的命令输出、目标程序的调试信
    息输出等等都会在里面显示出来。上一篇中介绍的调试器日志中记录的就是显
    示在这里的内容。
      下半部分左边是提示符窗口。这里通过提示符能够快速知道调试器目前的状态。
    上图中0:000>,冒号前的数字表示当前的进程号,同时调试多个进程时,每个
    进程都会被指派一个进程号;冒号后的000 表示线程号。
    进行内核调试时,如果是单处理器系统,提示符是kd>的形式;如果是多处理
    器系统,则是0: kd>的形式,前面的0 表示处理器号。

    提示符还可能是*BUSY*这样的字符串,以表示调试器正忙。也可以通过命令来
    自定义提示符。
      下半部分右边是命令输入窗口。需要执行的命令就在这里输入。
    调试器命令窗口中输入命令时可以使用一些快捷操作:
      上下方向键可以查找先前的命令。
      ESC 键用于清除当前行的命令。
      TAB 键用于自动补完命令。例如一些符号可以只输入一部分,然后通过按下TAB
    一次或多次来找到需要的符号。
      鼠标右键点击命令窗口,可以将剪贴板中的内容粘贴到命令输入框中。
      直接按下ENTER 键重复上一条命令。这个功能在WinDbg 中可以通过命令来打
    开或关闭。
      如果某条命令产生了很长的输出,可以按下CTRL+BREAK 来中断它。

     

    二、  控制调试目标的执行
    这里的控制目标执行,主要是指如何让运行中的目标中断到调试器中,以及控制中断
    的目标如何继续执行。
    1.  中断调试目标
    当调试目标处于运行状态时,WinDbg 是不能输入命令或者对它进行操作的。可以通过
    按下CTRL+BREAK 或者  点击工具栏的 按钮来中断它。下面我们继续用上一篇中的
    TestDebug1 项目来说明。修改TestDebug1.cpp 如下

     

    #include "stdafx.h" 
    #include <stdio.h> 
    int main(int argc, char* argv[]) 
    { 
      int i = 0; 
      while( 1) 
      { 
        printf( "TestDebug1.cpp:%d\r\n", i); 
      } 
      return 0; 
    } 

    为了方便,这次使用Debug 选项来重新编译它,这样就不用再设置编译选项和WinDbg
    选项来查看符号了。使用WinDbg 菜单的File->Open Executable…打开TestDebug1.exe,中断
    下来之后F5 继续运行。由于是个死循环,所以目标不会自己停止下来,可以看到WinDbg

    的调试器命令窗口一直处于禁用状态。在WinDbg 窗口按下CTRL+BREAK,TestDebug1.exe
    就中断到调试器中了,使用u 命令查看当前正在执行的代码,k 命令查看当前调用堆栈:

    看调用堆栈和反汇编出来的代码,似乎和TestDebug1.cpp 中的代码没有任何关系,这
    是为什么呢?
    注意到底部提示符位置显示的是0:001>,说明这是1 号线程,而正常情况下线程编号
    都是从0 开始的。我们继续用~命令来查看被调试进程中的线程信息,出现的是类似这样的
    输出:

    0:001> ~ 
        0    Id: 1998.1358 Suspend: 1 Teb: 7ffde000 Unfrozen 
    .    1    Id: 1998.17f8 Suspend: 1 Teb: 7ffdd000 Unfrozen

    每一行是一个线程的信息。第一行中,0 表示这个进程的编号;1998.1358 是16 进制数
    字,前者是当前进程的进程ID,后者是线程ID;后面的信息是线程状态和Teb 地址。第二
    行的线程编号前有一个点号“.”,表示这是当前线程,也就是刚才使用u 和k 命令查看到
    的线程。  
    我们的代码中并没有任何创建线程的操作,为什么会多出一个线程来呢?这是由于
    WinDbg 中断运行中的调试目标的方式造成的。按下CTRL+BREAK 之后,WinDbg 会在调试目
    标的进程中创建一个远线程,并在这个远线程中执行ntdll!DbgBreakPoint 函数,即上面u
    命令所显示出来的内容。它会在目标进程中产生一次int3 异常,这个异常被WinDbg 捕获,
    所以TestDebug1.exe 就中断到调试器中了。因此,当采用CTRL+BREAK 这种方式中断目标之
    后,看到的代码是在这个远线程中的,如果要查看调试目标正在执行的代码就需要切换当
    前线程。可以使用~Thread s 命令。如下:

    这里就可以清楚看到在main 函数中的print 调用产生的调用堆栈了。
    除了采用CTRL+BREAK 这样直接中断运行中目标的方式之外,当调试目标发生异常、退
    出或者遭遇断点等事件时,也会自动中断到调试器中。这时就不会出现额外的线程了。内
    核调试时中断目标机的操作和用户模式下一样


    2.  控制目标的执行
    调试目标中断之后,就可以通过单步或者跟踪指令来控制它执行了。
    WinDbg 中的单步操作快捷键和Visual Studio 调试器中相同。也是F5 运行、F10 逐过程
    单步、F11 逐语句单步。需要注意的是,单步的定义在汇编模式调试和源码模式调试时是不
    一样的。汇编模式调试时,每次单步执行一条指令;源码模式调试时,每次单步执行一行
    源码。点击工具栏上的 按钮或使用l-t 命令来启用汇编模式;点击工具栏上的 或使
    用l+t 命令来启用源码模式。
    控制目标执行的命令分为三大类。g*类的命令用于直接运行目标、p*类的命令用于单
    步执行、t*类的命令类似p*命令,但是当遇到call 指令时会跟踪进去。下面是这些命令的
    列表,摘自WinDbg 帮助文档:


     

     

    三、  使用断点
         合理、巧妙的设置断点是软件调试中的一门艺术,好的断点能使调试工作事办功倍。
    WinDbg 中提供了丰富的断点命令,下面通过示例对这些命令进行简单的介绍。
          在上面的项目中,添加了一个dll 项目,名为TestDebugDll1。修改一下上面的
    TestDebug1.cpp 如下(整个项目可以下载附件):

    #include "stdafx.h" 
    #include <stdio.h> 
    #include <windows.h> 
     
    class CTestClass 
    { 
    public: 
      CTestClass(){}; 
      ~CTestClass(){}; 
      void SetChar( unsigned char ucChar) 
      { 
        m_ucTestChar = ucChar; 
      } 
    protected: 
      unsigned char m_ucTestChar
    }; 
     
    int main(int argc, char* argv[]) 
    { 
      typedef int (*pfnTestDllAdd)( int a, int b); 
     
      int i; 
      HMODULE hMod = LoadLibraryA( "TestDebugDll1.dll"); 
      pfnTestDllAdd TestDllAdd = (pfnTestDllAdd)::GetProcAddress( hMod, "TestDllAdd"); 
      if ( TestDllAdd) 
      { 
        i = TestDllAdd( 1, 2); 
      } 
     
      CTestClass objTestClass; 
      objTestClass.SetChar( 123); 
      return 0; 
    }


        还是使用Debug 选项,重新编译。用WinDbg 打开TestDebug1.exe 后会自动中断到初
    始断点。由于是Debug 选项编译的,所以这里可以省去符号路径的设置就能识别符号。
         bp 命令是最常用的断点命令之一,它可以直接对某个代码地址设置断点。例如我们想
    中断到main 函数,可以这样:

    0:000> bp TestDebug1!main

         前面的TestDebug1 明确指定main 符号所在的模块,这样通常可以减少搜索符号的时
    间,也避免了相同名字的符号可能造成的冲突。F5 运行,就发现已经中断到main 函数了,
    并且源码窗口会自动弹出来。
        在源码窗口或者返汇编窗口中,可以将光标移动到要设置断点的行并用F9 快捷键来设
    置断点。这和Visual Studio 中一样。现在我们在HMODULE hMod =
    LoadLibraryA( "TestDebugDll1.dll");
    这一行处按下F9  设置一个断点。可以看到源码窗口中将
    当前正中断到的断点和未触发的断点用不同的颜色标识出来:

    bl 命令用于查看已存在的断点

    0:000> bl 
      0 e 00401030 [C:\Users\NetRoc\Desktop\TestDebug1\TestDebug1.cpp @ 23]        0001 
    (0001)    0:**** TestDebug1!main 
      1 e 0040105d [C:\Users\NetRoc\Desktop\TestDebug1\TestDebug1.cpp @ 27]


            如上面命令输出中的第二行,1 表示断点ID。当使用bd 命令禁用断点、be 命令重新启
    用断点或者其他命令来操作这个断点时,都需要用到这个ID;第二个“e”表示断点是启用
    的,如果是“d”则表示当前被禁用,如果带“u”则说明是后面将要介绍的未定断点;第
    三列的0040105d 是该断点的地址;后面的内容是断点所在的源文件和行号。
          有时候我们想要设置断点的模块还没有被加载到内存中,如这个例子中的
    TestDebugDll1.dll,只有在调用了LoadLibrary 之后才会加载进来。如果使用bp 来对这个模
    块中的函数设置断点,会找不到符号,这时就会被调试器自动转变成用bu 命令来设置的未
    定断点。bu 可以对还不能识别的符号设置断点,当系统中有新模块加载进来时,调试器会

    对未定断点再次进行识别,如果找到了匹配的符号则会设置它。现在我们首先用bc 命令删
    除上面的1 号断点,然后用bu TestDebugDll1!TestDllAdd 命令对TestDebugDll1.exe 中的
    TestDllAdd 函数设置未定断点,结果如下:

     

         第一个bl 命令可以看到我们之前设置的两个断点,然后bc 命令将1 号断点删除。接下
    来使用了一次bp 命令,系统提示找不到TestDebugDll1!TestDllAdd,将断点自动转换成未定
    断点。第三次,使用bu 命令对TestDebugDll1!TestDllAdd 成功设置了未定断点。最后查看存
    在的断点有三个。0 号是最开始的断点,1 号是bp 命令失败后WinDbg 自动转换的断点,2
    号是bu 命令设置的。
        接下来的程序会加载TestDebugDll1.dll 并调用TestDllAdd 函数,我们F5 继续:


         调试器自动打开了TestDebugDll1.dll 的源文件,并且发现中断在TestDllAdd 函数开头。

     
         下面我们再试验一下对类成员函数下断和内存访问断点。继续上面的调试会话,源码
    中有一个类成员函数CTestClass:: SetChar(),可以直接使用符号对它设置断点。下面几条命
    令等效:

    bp TestDebug1.exe!CTestClass::SetChar 
    bp TestDebug1.exe!CTestClass__SetChar 
    bp @@C++(TestDebug1.exe!CTestClass::SetChar) 


         Windows 调试工具支持两种语法的表达式:MASM 语法和C++语法。如果没有特别指明
    的话,默认是使用MASM 表达式语法。一般来说,MASM 语法的表达式用来表示地址比较
    方便,而C++表达式用来表示结构或者类成员比较方便。可以通过@@C++(…)或者
    @@masm(…)来包含表达式以明确指明所使用的语法。当使用MASM 语法时,可以用双冒
    号(::)或者双下划线(__)来表示类成员;但是使用C++语法时则只能使用双冒号。


         用上面的命令之一对CTestClass::SetChar 设置断点并F5 运行,可以看到成功中断到了
    CTestClass::SetChar 函数处。

     

     

         ba 命令用于设置访问断点。访问断点可以在某个内存地址处的数据被读取、写入或者
    执行的时候中断下来。首先用.restart 命令重新启动调试目标,并且用前面的方法之一中断
    到源代码中HMODULE hMod = LoadLibraryA( "TestDebugDll1.dll");这一行处。我们看到后面的
    代码对局部变量i 有赋值操作。我们继续试着使用C++语法来使用命令,输入ba w4
    @@C++(&i)命令。“&i”在C++语法中表示变量i 的地址,“w”表示写入操作,“4”表示
    只处理&i 地址处4 字节的写入操作。F5 运行,程序被成功中断下来:

     

         输出中有几处值得注意的地方。第一个bl 可以看到,之前已经存在了一个ID 为1 的断
    点,然后我们又使用ba 设置了一个断点。在第二次bl 输出重可以看到新加的断点ID 为0、
    “w”表示是一个写断点、“4”表示写入的数据长度、要监控的内存地址为“0012ff38”。
    G 命令之后,0 号断点被触发,也就是刚才设置的数据断点。但是下面显示的当前指令却没
    有访问到我们设置断点的0x0012ff38。这里又涉及到WinDbg 数据断点实现的原理。来通过
    VC 的窗口看一看相关代码和对应的汇编代码:

     

     

          图中的mov dword ptr [ebp-10h],eax 才是对i 赋值。但是断点触发后却中断到了赋值之
    后的下一条指令。
        WinDbg 的数据断点是通过CPU 硬件断点实现的。而DRx 寄存器所设置的内存访问断点
    属于陷阱(Trap)而不是错误(Fault),CPU 对陷阱的处理是执行完该条指令后触发异常。因此
    WinDbg 只能在之后的一条指令处断下来。
        ba 命令支持的断点种类有以下几个:

     

         e 选项所指定的数据长度必须是1,即只能指定e1。r/w 选项支持1、2、4 的数据长度,
    在X64 机器上可以支持8。
          断点命令中可以设置一条或多条命令,当断点被触发时会自动执行它。接着上面的调
    试会话,使用下面的命令

     

     

           这里使用了bp CTestClass::SetChar “.echo This is the test string”命令。.echo 是调试器命
    令的关键字,用于向调试器命令窗口输出一串字符串。这个命令的结果就是,在
    CTestClass:SetChar 成员函数设置断点,并且在中断的时候执行.echo This is the test string 命
    令。可以看到,g 命令重新运行程序之后,断点触发时调试器命令窗口中出现了这个字符串。
          WinDbg 的条件断点也是采用这种方式的。通过“命令的命令”配合.if 这样的命令关键
    字,就可以实现灵活多样的条件断点。

     

    四、  访问内存和寄存器
    WinDbg 可以通过命令或者GUI 界面来访问内存和寄存器。常用的几条命令如下:
      以d 开头的d*系列命令用于查看内存值。命令的第二个字符用于指定按何种数据
    类型查看该内存中的数据,如db 是按BYTE 类型查看,dd 是按DWORD 类型查看。

     

     

         重新中断到TestDebug1.exe 的main 函数处。用db 400000 命令查看PE 文件头的内
    容,在右边会自动列出对应的ASCII 字符。直接使用d 命令会按照上一次d*命令的方
    式来查看。如果不带地址参数,则从上一次显示结束的地方继续显示。
      ?表达式求值命令常常用来查看符号所代表的值。
      e*命令可以将值写入内存。命令第二个字符的定义和d*一样,用于指定数据类型。
    可以用一条命令按照顺序向指定地址写入多个值。

     

     

          首先使用? i 命令,它可以显示符号i 对应的值,即局部变量i 的地址。命令输出的
    等号两边分别是10 进制数字和16 进制数字。然后使用db 0012ff78 查看变量i 处的内
    存内容,目前的值是0x0012ffc4。eb 0012ff78 'a' 'b' 'c' 'd'命令会在从0012ff78 开始的地
    址处依次写入后面的数值,命令执行时WinDbg 会像C/C++一样自动将单引号中的ASCII
    字符转换为数字。最后,再通过db 命令查看内存,可以看到刚才的“abcd”已经写入
    了。
      r 命令用于查看或者修改寄存器和伪寄存器。Windows 调试工具定义了一些伪寄存
    器,他们不是机器上实际的寄存器,而是根据调试环境不同自动变化的值。详细
    可以查看帮助文档中的伪寄存器语法。
      dt 命令用于查看结构。参考下面的命令序列:

     

         首先用上一篇中介绍过的.symfix 和.reload 命令加载Windows 符号,$peb 是一个伪
    寄存器,调试器将它定义为当前进程的进程环境块地址。使用?或者r 命令都能看到它
    的内容。进程环境块是一个nt!_PEB 结构,所以可以用dt 来显示出当前进程的PEB 内
    容。
      !address 扩展命令可以显示指定的内存地址的信息。接着上面的调试会话,对PE
    文件头使用!address 看看:

    0:000> !address 400000 
      ProcessParametrs 002c14f0 in range 002c0000 002c4000 
      Environment 002c0808 in range 002c0000 002c4000 
         00400000 : 00400000 - 00001000 
                         Type          01000000 MEM_IMAGE 
                         Protect    00000002 PAGE_READONLY 
                         State        00001000 MEM_COMMIT 
                         Usage        RegionUsageImage
                     FullPath TestDebug1.exe 


         这里可以看到指定的地址0x400000 的内存类型、保护属性、拥有该地址的模块等
    等。
      dv 命令可以查看当前作用域下局部变量的类型和值:

    0:000> dv 
                argc = 2147328000 
    Type information missing error for argv 
    Type information missing error for objTestClass 
                   i = 1684234849 
    Type information missing error for TestDllAdd 
    Type information missing error for hMod


     

        main 函数有些局部变量没有类型信息,这是因为VC6 中默认的Debug 选项编译出
    来之后,.pdb 文件中符号信息并不完全。

     

    展开全文
  • Windows调试符号配置

    千次阅读 2008-07-26 13:58:00
    对于Windows系统内核级调试,需要从Windows调试符号器上把当前使用Windows内核版本对应的调试符号下载,并成功配置。调试时目前可参考的工具有WinDbg和net2005平台一、Windbg的配置1、首先下载成

     近来准备学习一些软件调试技术方面的知识。

    调试是一个实践性非常强的技术,没有亲身经历一番,不会有真实的感受。

    调试可分为系统内核调试和用户应用层面两种情况。

    对于Windows系统内核级调试,需要从Windows调试符号器上把当前使用Windows内核版本对应的调试符号下载,并成功配置。

    调试时目前可参考的工具有WinDbg和net2005平台

    一、Windbg的配置

    1、首先下载成功Windbg

    2、再下载livekd.exe,该工具用来调试内核,似乎是调用KD和Windbg来操作的,属命令行态运行程序。

    3、在系统环境变量下配置:

    _NT_SYMBOL_PATH=srv*D:/WINDOWS/Symbols*http://msdl.microsoft.com/download/symbols

    其中"D:/WINDOWS/Symbols"目录是存放Kernel内核调试符号的文件夹

     

    4、此时运行windbg并选择kernel debug...后揭示:

    Microsoft (R) Windows Debugger Version 6.9.0003.113 X86
    Copyright (c) Microsoft Corporation. All rights reserved.

    Unable to read head of debugger data list
    Connected to Windows XP 2600 x86 compatible target, ptr64 FALSE
    Symbol search path is: srv*D:/WINDOWS/Symbols*http://msdl.microsoft.com/download/symbols
    Executable search path is:
    *******************************************************************************
    WARNING: Local kernel debugging requires booting with kernel
    debugging support (/debug or bcdedit -debug on) to work optimally.
    *******************************************************************************
    Windows XP Kernel Version 2600 (Service Pack 2) MP (2 procs) Free x86 compatible
    Product: WinNt, suite: TerminalServer SingleUserTS
    Built by: 2600.xpsp_sp2_gdr.070227-2254
    Kernel base = 0x804d8000 PsLoadedModuleList = 0x8055d700
    Debug session time: Sat Jul 26 14:12:45.875 2008 (GMT+8)
    System Uptime: 0 days 4:41:53.583

     

    此时光标处于 lkd>  命令符状态,应是符号表配置成功状态

     

    二、net2005的调试符号配置

    1、net2005运行后,选择 工具->选项

    2、选择调试->符号 属性页

    三、在符号文件(.pdb)位置(L):  中输入:

            http://msdl.microsoft.com/download/symbols

           在“将符号从符号服务器缓存到此目录(C):”中配置本机符号存放目录

           D:/WINDOWS/SYMBOLS

     

    注:网络上搜到的net配置似乎是visual studio net2003及以前的配置方法,用到的srv*的语法在net2005环境下不需使用,若使用net会提示:指定符号服务器时不必使用“srv*”语法。只需输入UNC路径或URL

     

     


     

     

     

    展开全文
  • 下载和安装 Windows 调试工具   http://msdn.microsoft.com/zh-CN/windows/hardware/gg463009 这里有具体的版本可以选择。   在这个页面点进去会发现下载的其实是在线安装器。 如果想要ISO离线安装包的话,需要...
  • Windows调试工具入门3—基本调试操作

    千次阅读 2008-12-25 21:18:00
    Windows调试工具入门-3 基本调试操作 http://www.DbgTech.net一、 调试器命令窗口1、 简介使用Windows调试工具进行调试,大部分和调试器之间的交互都是通过调试器命令窗口来进行的。命令的输入、输出都是在调试...
  • 下载和安装 Windows 调试工具 http://msdn.microsoft.com/zh-CN/windows/hardware/gg463009 这里有具体的版本可以选择。 在这个页面点进去会发现下载的其实是在线安装器。 如果想要ISO离线安装包的话,...
  • Windows调试 - 如何使用dump文件

    万次阅读 2014-03-26 18:53:58
    Windows调试 - 如何使用dump文件 2013-02-04 16:05 445人阅读 评论(0) 收藏 举报 dmp dump debug visua 如何使用dump文件 我最近在开发一个windows下的程序(win7/win8),有一些case下会crash,...
  • windows调试器设置

    千次阅读 2007-12-29 15:33:00
    本文就windows调试器的设置问题,根据个人在windbg上的使用经验进行总结,既算是对自己的总结,也算是份大家一起分享自愿吧。本文的前提是windbg已经安装完毕,适合对windbg有一定了解的读者。1.JIT设置。通过JIT...
  • Windows调试工具入门-2 NetRochttp://www.DbgTech.net本篇介绍Windows调试工具的基本设置和基本操作方法。这里我们会用一个测试程序一步一步说明如何使用WinDbg开始调试工作。首先用VC建立一个名为TestDebug1的...
  • 问题讲述:利用visualstudio打开网上down下来的代码,点击本地windows调试器,弹出窗口,说“无法启动程序,系统找不到指定的exe文件”。 原因:未对项目生成解决方案。 解决方法:在资源管理器,选中该项目,右键...
  • Windows调试命令 NTSD

    千次阅读 2006-06-05 22:30:00
    Windows调试命令 NTSD问:怎么才能关掉一个用任务管理器关不了的进程?我前段时间发现我的机子里多了一个进程,只要开机就在,我用任务管理器却怎么关也关不了 答1:杀进程很容易,随便找个工具都行。比如IceSword。...
  • 编写一个初级的Windows调试

    千次阅读 2011-01-28 11:13:00
    这是用Live Writer写的,很多原来的格式信息都没了,杯具 Writing a basic Windows debugger 编写一个初级的Windows调试器 By Ajay Vijayvargiya | 24 Jan 2011 作者:Ajay Vijayvar
  • Windows调试工具入门 — windebug

    千次阅读 2018-05-17 19:41:57
    转载自https://blog.csdn.net/zmqblog/article/details/17334637一、 引子Debugging Tools for Windows是微软发布的一套用于软件调试的工具包(后面如果没有指明,那么我会使用WinDbg来作为这一套调试工具的简称)...
  • Windows 调试技巧

    2007-12-11 21:56:00
    1.设置当程序Crash时,自动启动调试器,将下列键值设为dword :1。HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows NT/CurrentVersion/AeDebug/Auto2.设置当某一程序启动时,自动加载调试器,比如调试服务等。在...
  • windows调试器之windbg

    千次阅读 2013-04-21 21:37:12
    windbg由于其丰富的命令和对windows的原生支持还有其易用性,是其他其他调试器望尘莫及的。 不过,如果你只是想通过源码调试应用层程序,应该首选vc调试器。 windbg特色功能: 1. 支持应用层程序调试(可以源码...
  • Windows调试技术基础

    千次阅读 2012-02-21 13:14:08
    软件调试技术的意义: 1. 在调试上花费时间很多  2. 调试可以解决很多问题,是强大的工具  3. 调试是有稳定的生命周期  4. 调试也是学习技术的好工具  调试窗口: BreakPoints. Watch, Local, Call...
  • windows调试器之Visual C++

    千次阅读 2013-04-21 19:22:22
    我打算给大家介绍一些windows下常用的调试器: visual c++ ollydbg windbg visual c++作为我们的开发工具,当做调试器当然也不逊色,那他与别的调试器相比有哪些优劣点呢? visual c++调试
  • 离线下载Windows 调试符号 Symbols

    千次阅读 2015-06-24 12:37:00
    调试程序时那些Windows模块(如ntdll.dll)不能加载符号,而程序总是崩在这些模块里。想看一眼到底崩在了什么地方。 需要把对应的符号下载下来。 使用工具symchk: /om /im 需要添加环境变量: _NT_SYMBOL_...
  • Windows调试工具入门 — 1

    千次阅读 2012-11-28 20:55:22
    Debugging Tools for Windows是微软发布的一套用于软件调试的工具包(后面如果没有指明,那么我会使用WinDbg来作为这一套调试工具的简称)。我第一次接触是在三年前的一个内核驱动项目,由于进行了IDT中键盘鼠标...
  • 内核调试主要用来调试驱动代码、分析内核结构等。 WinDbg通过两台电脑可以实现内核调试,其中一台电脑运 行WinDbg,被称为主机;另外一台电脑运行被调试的程序或系统,被称为目标机。一般情况下两台电脑都是真实机 ...
  • [调试]_[初级]_[VS本地Windows调试器]

    千次阅读 2014-11-28 10:32:48
    条件断点培训.
  • VSCode在Linux和Windows调试C/C++程序

    千次阅读 2017-02-21 12:17:20
    VSCODE是一个文本编辑器,不具备编译功能,但是可以调用外部编译器调试器来实现调试功能
  • 使用Pix For Windows调试Shader傻瓜教程

    千次阅读 2014-04-28 18:33:55
    下面,我们来介绍一下怎么使用DX SDK自带的工具PIX For Windows调试Shader。这里只做简要的介绍,具体的情参看PIX的文档哈。如何找到文档呢?打开DX SDK开始菜单下面的DirectX ...
  • Windows调试之安全测试

    千次阅读 2009-06-11 09:26:00
     在调试 Windows 安全性问题时,另一个重要的结构就是访问控制项( Access Control Entry , ACE )。 ACE 表示,在由这个 ACE 保护的对象上,有哪些权限可以被赋予由 SID 表示的主体。一组有序的 ACE 就构成了一个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 27,970
精华内容 11,188
关键字:

windows调试