Enterprise Just Builder

Solution for Enterprise Software Architecture

调试

Windows 调试集锦 <1>

调试 WinLogon1
WinLogon 是一个用户模式进程,负责处理用户登入登出的交互任务,以及处理 CTRL+ALT+DELTE。要调试 Winlogon 最简单的办法是使用 NTSD 然后通过内核调试器来控制并调试。

首先要解决的是如何将用户态调试器 NTSD 的输出重定向到内核调试器,为此需先配置内核调试连接。详细可以参考[2. Controlling the User-Mode Debugger from the Kernel Debugger[

其次需要修改注册表,这样 Winlogon 进程一开始启动就可被调试。注册表键值如下:

[HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\WinLogon.EXE]
"Debugger"="ntsd -d -x -g"

The -d option passes control to the kernel debugger. The -x option causes the debugger to capture access violations as second-chance exceptions. The -g option causes the WinLogon process to run after the attachment. Do not add the -g if you want to start debugging before Winlogon.exe begins (for example, if you want to set an initial breakpoint).

In addition, you should set the GlobalFlag value under the winlogon.exe key to REG_DWORD “0x000400F0”. This sets heap checking and FLG_ENABLE_KDEBUG_SYMBOL_LOAD. However, since this second flag only affects the kernel debugger, symbols must also be copied to the target computer before starting the debugger.

>>> 阅读全文

 

用 IDA Windbg 调试器实现 VMWare 上的 Windows 内核调试

文章评价:
IDA 是交互式反汇编器(Interactive Disassembler)的简称,它由总部位于比利时列日市(Liège)的 Hex-Rays 公司的一款产品。IDA是一种递归下降反汇编器。其主要优势在于呈现尽可能接近源代码的代码。它不仅使用数据类型信息,而且通过派生的变量和函数名称来尽其所能地注释生成的反汇编代码。这些注释将原始十六进制代码的数量减到最少,并显著增加了向用户提供的符号化信息的数量。

和 Windows 原生的调试器 windbg 相比, IDA 可以将程序结构和算法的核心以类似 C 语言的形式呈现,因此更容易通过阅读代码来定位问题的所在。

本文将介绍如何透过 IDA 的 Windbg 插件来实现 Windows 内核调试。

使用 WinDbg 进行 Windows 内核调试通常需要两台计算机,一台称为Debuggee,即目标机,另一台作为 Debugger,也称为主机 HOST。

目标机可以是物理机或虚拟机。如果是物理机,那么该机器至少需要一个串口、1394口或者支持 USB 调试的 USB 端口,另外你还需要与对应的调试连接线,如串口线、1394总线、USB 2.0 或 3.0 调试线等等。 Windows 8 之后的操作系统,普遍使用 USB 3.0 端口进行调试,通过 USBView 工具查看目标机,可以确定机器上哪一个 USB 端口支持调试。

>>> 阅读全文

 

, , , ,

设备节点和设备栈

在 Windows 中,设备被表示为即插即用 (PnP) 设备树中的设备节点(device node)。通常当 I/O 请求被发送给设备时,多个驱动程序会帮助处理该请求。这些驱动程序中的每一个都与一个设备对象相关联,这些设备对象在栈中进行排列。设备对象的顺序与它们的关联驱动程序一起被称为设备栈(device stack)。每个设备节点都有自己的设备堆栈。1

设备节点和即插即用设备树
Windows 在称为“即插即用设备树”(或简称为“设备树”)的树结构中组织设备。 通常,设备树中的节点表示某个设备或者复合设备的某个独立功能。 不过节点也可以表示与物理设备无关软件组件。

设备树上的节点称为“设备节点”。设备树的根节点称为“根设备节点”。约定俗成地,根设备节点被绘制在设备树的底部,如下图所示。

设备树说明了 PnP 环境中固有的父/子关系。设备树中的一些节点用来表示连接有子设备的总线设备。例如,PCI 总线节点表示主板上的物理 PCI 总线。在启动过程中,PnP 管理器请求 PCI 总线驱动程序枚举连接到 PCI 总线的设备。这些设备被表示为 PCI 总线节点的子节点。在上图中,PCI 总线节点包含一些子节点,这些子节点用来表示连接到 PCI 总线的一些设备,其中包括 USB 主控制器、音频控制器以及 PCI Express 端口。

有些连接到 PCI 总线的设备也是总线。PnP 管理器请求这些总线中都枚举与之连接的设备。在上图中,我们可以看到音频控制器是连接有音频设备的总线,而 PCI Express 端口是连接有显示适配器的总线,该显示适配器则是连接有两个监视器的总线。

>>> 阅读全文

 

, , , ,

Windows 调试教程 (一) 用 CDB 和 NTSD 开始调试

对于软件开发和维护来说,调试是最有价值的技能之一。它贯穿于产品整个生命周期中的每个阶段。从创建项目伊始开发人员就会遇到 bug,bug 可能是逻辑错误、语法错误又或者是编译器错误,bug 随处可见。在软件质量验收阶段也可能会遇到 bug ,因为这时引入了更多高级测试场景,还需要和其他环境进行交互。最后,产品发布后还需获得技术支持。即使用户拿到软件后,调试还要继续,因为用户一旦遇到 bug 就会上报给公司,这时还是要再次进行调试。

本教程的目的是什么?
本教程只是对调试做一些简单介绍,可以归类为”初级教程”,如果大家的反映还不错,我会续写更多的章节。

对于调试这个话题来说,实在有太多复杂技术,所以很难知道要从哪里开始着手。我会试着从基础讲起,带着你熟悉调试。希望这样能将初、中级程序员带到高级调试的世界中。所谓 “高级”调试,是指调试时基本上无需重编译,也无需用对话框或 printf 语句来输出调试信息。

调试器与操作系统
微软随着每版 Windows SDK 都提供了最新的调试器,目前最新版本是 Windows 8.1 SDK ,你可以从微软站点上下载。

CDB, NTSD 和 Windbg
本文适用于 Windows 2000 以上的操作系统。我们将谈论三种调试器: CDB、 NTSD 和 WinDbg。一旦安装完 SDK 之后,这三个调试器也就随之安装。

>>> 阅读全文

 

, , , , ,