分类 调试 下的文章

我们不仅可以通过GUI的方式使用Windbg,还可以通过命令行的方式使用它,且在有些需求和使用场景下,只能使用命令行模式

硬件异常可以分为三种:

  • fault(错误),在处理此类异常时,操作系统会将遭遇异常时的“现场”保存下来(比如EIP、CS等寄存器的值),然后将调用相应的异常处理函数,如果对异常的处理成功了(没成功的情况会在下文中提到),那就恢复到原始现场,继续执行。最经典的fault例子莫过于Page Fault了,在分页机制下,当我们读到某个还未载入到内存的页时,就会触发该异常,操作系统会将该页载入内存,然后重新执行读取该页的指令,这是分页机制实现的重要机制。
  • trap(陷阱),在处理此类异常时,操作系统会将异常的“下文”保存,在处理异常后,直接执行导致异常的指令的下一条指令。我们在调试过程中常用的断点操作就是基于这类异常的,当我们在某处下断点时调试器会将原本此处的指令对应的十六进制保存下来,然后替换第一个字节替换为0xCC的,也就是int 3,造成断点异常,中断(此处的中断用的是break,而我们一般说的中断是interrupt,请读者务必区分清楚)到调试器,程序在运行到此处就会停止等待下一步的指令,而当我们继续执行时调试器就会将该指令替换为原来的指令,程序也就恢复正常执行了。不知道大家有没有注意过,在进行程序调试时经常会看见hex界面显示大量的“烫烫烫”,这其实是0xcc对应的中文字符,因为这些地址的内容程序并不想让我们访问,一旦我们访问这些地址,就会读到0xcc,程序也就“中断”了。
  • abort(中止),中止异常,主要是处理严重的硬件错误等,这类异常不会恢复执行,会强制性退出。

前面介绍了Windbg的UI功能,也基本上能完成基本的调试任务,但是WinDBG主要是以命令方式工作的,这些命令在Command Window里输入。WinDBG共支持三类命令:标准命令、元命令和扩展命令。某些命令仅在实时调试中可用,其他命令仅在调试转储文件时可用。某些命令仅在用户模式调试期间可用,其他命令仅在内核模式调试期间可用。只有当目标在某些处理器上运行时,某些命令才可用。

一、标准命令

标准命令(standard command)用来提供适用于所有调试目标的基本调试功能.标准命令通常是一两个字符(version除外)或者符号,只有version等少数命令除外。标准命令的第一个字符是不分大小写的, 第二个字符可能区分大小写。所有标准命令都是实现在WinDBG内部的, 执行这些命令时不需要加载任何扩展模块。迄今为止, WinDBG调试器共实现了130多条标准命令, 分为60多个系列. 为了便于记忆, 可以根据功能将标准命令归纳为如下18个子类。在命令编辑框中输入一个问号(?), 可以显示出主要的标准命令和每个命令的简单介绍。

 

  • 控制调试目标执行

功能 命令 描述/助记 补充信息
恢复运行 g Go ~123g~#g~*g
跟踪执行 t Trace  
单步执行 p Step  
追踪监视 wt Trace and Watch Data  

你有没有写过不太正确但足够接近的代码?当一切顺利的时候,你是否不得不编写运行良好的代码,但是你不太确定当出了问题时会发生什么?有一个简单的、不正确的语句可能位于您编写或必须维护的代码中:catch (Exception e)。这似乎是无辜和直截了当的,但这个小小的声明会造成很多问题,当它不能做你期望的。

如果您像下面的代码那样使用异常的代码:

public voidFileSave(String name)
{
try{
FileStream fs
= newFileStream(name, FileMode.Create);
}
catch(Exception)
{
throw new System.IO.IOException("File Open Error!");
}
}

安装Windows调试工具时,您将同时获得32位工具集和64位工具集。如下图

如果使用的是Microsoft Visual Studio调试环境,则无需考虑是否使用32位或64位,因为Visual Studio会自动选择正确的调试工具。如果您使用的是其他调试环境(windbg、kd、cdb或ntsd),则必须自己做出选择。

运行调试器的计算机称为主机,。

一、相关概念

  • 调试主机 (Host computer)
    在调试环境下,运行调试器(比如Windbg)的计算机称为主机。
  • 调试目标机(Target computer)
    被调试的计算机称为目标计算机

二、选择标准

选择标准就是以主机和目标机以及调试对象来划分的。要确定要使用的调试工具集,您需要知道主机上运行的处理器类型以及主机运行的是32位还是64位版本的Windows。

2.1、当主机为32位机时
也就是说主机是32位的cpu且是32位的Windows系统时,请使用32位调试工具。此情况适用于基于x86和基于x64的目标。

2.2、当主机位64机位时

如果主机使用基于x64的处理器,并且运行64位版本的Windows,则应用以下规则:

  • 如果分析对象是转储文件,可以使用32位调试工具或64位调试工具。(转储文件是用户模式转储文件还是内核模式转储文件并不重要,转储文件是基于x86还是基于x64的平台生成也不重要。)
  • 如果正在执行实时内核模式调试,则可以使用32位调试工具或x64调试工具。(此情况适用于基于x86和基于x64的目标。)
  • 如果要调试与调试器在同一台计算机上运行的实时用户模式代码,请使用64位工具调试在WOW64上运行的64位代码和32位代码。要将调试器设置为32位或64位模式,请使用.effmach命令。
  • 如果要调试在单独目标计算机上运行的实时32位用户模式代码,请使用32位调试工具。

总之,只有在实时用户态调试,并且调试器也在同一台64位机器上的情况下必须用64位的调试工具集!