windbg调试器的简单分析

合集下载

windbg使用方法

windbg使用方法

windbg使用方法Windbg是一款由Microsoft开发的强大的调试工具,它可以帮助开发人员诊断和解决Windows平台上的各种软件问题。

本文将介绍Windbg的基本使用方法,希望能够帮助读者更好地利用这一工具进行调试和分析。

首先,我们需要下载并安装Windbg工具。

可以在Microsoft官方网站上找到Windbg的安装包,并按照提示进行安装。

安装完成后,我们可以在开始菜单或者桌面上找到Windbg的快捷方式,双击打开即可进入工具界面。

在使用Windbg进行调试之前,我们需要先了解一些基本概念和操作。

首先是符号文件的设置,符号文件包含了程序中各个函数和变量的调试信息,可以帮助我们更好地进行调试。

在Windbg中,可以通过设置符号路径和加载符号文件来进行符号文件的管理。

接着是源代码的设置,如果我们有程序的源代码,可以通过设置源代码路径来进行源代码级别的调试。

最后是调试目标的设置,可以通过Attach或者Open Crash Dump来加载需要调试的程序。

接下来,我们来看一下Windbg的一些常用命令和功能。

在Windbg的命令行窗口中,可以输入各种命令来进行调试操作,比如设置断点、查看变量的值、跟踪函数的调用等。

此外,Windbg还提供了丰富的图形化界面,可以通过菜单栏和工具栏来进行各种调试操作,比如查看内存、查看寄存器、查看线程信息等。

除了基本的调试功能,Windbg还提供了一些高级的调试工具和扩展,比如分析内存泄漏、分析崩溃转储、分析性能问题等。

通过这些工具和扩展,我们可以更深入地了解程序的运行情况,找出潜在的问题并加以解决。

在使用Windbg进行调试的过程中,我们可能会遇到各种各样的问题和挑战,比如调试信息不够详细、调试速度太慢、调试过程中出现崩溃等。

针对这些问题,我们可以通过调整符号文件的设置、优化调试环境、使用合适的调试工具等方式来进行解决。

总的来说,Windbg是一款功能强大的调试工具,可以帮助我们更好地进行程序调试和分析。

windb 调试原理

windb 调试原理

windb 调试原理Windbg是一种强大的Windows调试工具,它可以用于分析和解决各种系统和应用程序的问题。

它提供了很多功能和命令,可以帮助开发人员和调试人员定位和修复程序中的错误。

本文将介绍Windbg调试的原理及其相关概念。

一、Windbg简介Windbg是由微软公司开发的一款免费的调试工具。

它可以在Windows操作系统上运行,并支持多种架构和平台。

Windbg可以连接到正在运行的进程或者通过调试器驱动程序连接到目标计算机上的内核模式进程。

它可以对进程进行实时监控,捕捉异常,查看内存和寄存器状态,以及跟踪函数调用等。

二、Windbg调试的原理Windbg调试的原理是通过在目标进程中注入调试器驱动程序来实现的。

当Windbg连接到目标进程时,它会将自己的调试器驱动程序加载到目标进程的地址空间中,并通过调试器驱动程序与目标进程进行通信。

调试器驱动程序可以截获目标进程的系统调用和异常,从而实现对目标进程的监控和控制。

三、Windbg调试的基本概念1. 符号表:符号表是一个存储了程序中函数和变量信息的数据库。

在调试过程中,Windbg可以使用符号表来解析函数和变量的名称和地址,从而方便开发人员进行代码分析和调试。

2. 断点:断点是调试过程中的一个重要概念,它可以让开发人员在程序执行到指定位置时中断程序的执行。

在Windbg中,可以通过命令设置断点,并在断点触发时查看程序的状态和调用栈信息。

3. 寄存器:寄存器是CPU中的一组特殊的存储单元,用于存储程序执行过程中的临时数据。

在Windbg中,可以查看和修改寄存器的值,以及使用寄存器的值来分析程序的执行流程。

4. 调用栈:调用栈是程序执行过程中的一个重要数据结构,用于保存函数调用的相关信息。

在Windbg中,可以查看和分析调用栈的信息,从而了解函数的调用关系和参数传递情况。

5. 内存窗口:内存窗口是Windbg中的一个功能,可以用来查看和修改目标进程的内存数据。

windbg gflags操作流程

windbg gflags操作流程

windbg gflags操作流程Windbg是一种Windows操作系统的调试工具,它可以帮助开发人员分析和调试应用程序的崩溃和性能问题。

Gflags是Windbg的一个重要组成部分,它提供了一种简便的方式来配置系统的全局标志和调试标志。

本文将介绍如何使用Windbg和Gflags进行调试和性能分析的操作流程。

第一步:安装Windbg和配置符号文件路径我们需要安装Windbg调试工具,并配置符号文件路径。

符号文件包含了应用程序的调试信息,可以帮助开发人员更方便地分析崩溃和性能问题。

在Windbg安装目录下,找到“sym”文件夹,将符号文件下载到该文件夹中。

然后,在Windbg的命令行中输入以下命令来配置符号文件路径:.sympath+ C:\Sym其中,C:\Sym是符号文件路径的根目录,可以根据实际情况进行修改。

第二步:启动Windbg并加载应用程序打开Windbg,选择“文件”菜单中的“打开进程”选项,然后在弹出的对话框中输入应用程序的可执行文件路径。

点击“确定”按钮后,Windbg会加载该应用程序并暂停在入口点处。

第三步:设置断点和观察点在Windbg的命令行中,输入以下命令来设置断点:bp symbol其中,symbol是要设置断点的函数名或地址。

通过设置断点,我们可以在应用程序执行到特定位置时中断程序的执行,以便进行调试和分析。

除了设置断点,我们还可以设置观察点来监视特定的变量或内存地址的值。

在Windbg的命令行中,输入以下命令来设置观察点:ba r/w size address其中,size是要监视的内存块的大小,address是要监视的内存地址。

通过设置观察点,我们可以在特定的内存地址发生变化时中断程序的执行,以便进行调试和分析。

第四步:运行应用程序并触发断点和观察点在Windbg的命令行中,输入“g”命令来继续执行应用程序。

当应用程序执行到设置的断点或观察点处时,Windbg会中断程序的执行,并显示相关的调试信息。

windbg使用方法

windbg使用方法

windbg使用方法Windbg是一款由微软公司开发的调试工具,它可以帮助开发人员分析和诊断Windows操作系统和应用程序的问题。

本文将介绍Windbg的基本使用方法,希望能够帮助读者更好地利用这个工具进行调试和分析。

首先,我们需要了解如何安装Windbg。

通常情况下,Windbg是作为Windows驱动程序开发工具包(Windows Driver Kit)的一部分发布的,也可以在微软的官方网站上下载到独立安装包。

安装完成后,我们可以在开始菜单或者安装目录中找到Windbg的可执行文件。

接下来,我们需要了解如何打开并配置Windbg。

在打开Windbg 后,我们可以通过“文件”菜单中的“符号文件路径”选项来设置符号文件的路径,以便Windbg能够正确地加载符号文件。

符号文件对于调试非常重要,它包含了源代码和可执行文件之间的映射关系,能够帮助我们更好地理解程序的运行状态。

在Windbg中,我们可以通过“文件”菜单中的“打开转储文件”选项来打开需要分析的转储文件(dump file)。

转储文件是程序崩溃时生成的一种内存快照,包含了程序崩溃时的内存状态和调用栈信息。

通过分析转储文件,我们可以找出程序崩溃的原因,并进行相应的调试和修复。

除了分析转储文件外,我们还可以通过“调试”菜单中的“附加到进程”选项来附加到正在运行的进程,以实时地监视和分析程序的运行状态。

这对于调试一些无法通过转储文件分析的问题非常有帮助,比如内存泄漏、死锁等问题。

在Windbg中,我们可以使用各种命令来进行调试和分析。

比如,通过“!analyze”命令可以自动分析转储文件,并给出可能的崩溃原因;通过“kb”命令可以查看当前线程的调用栈信息;通过“!heap”命令可以查看进程的堆内存分配情况等等。

熟练掌握这些命令对于高效地进行调试和分析非常重要。

除了命令之外,Windbg还提供了丰富的调试工具,比如内存窗口、寄存器窗口、线程窗口等,这些工具可以帮助我们更直观地了解程序的运行状态。

使用Windbg双机调试驱动

使用Windbg双机调试驱动

困扰我多天的问题终于在今天解决了,感觉很轻松啊!调试Windows内核程序不能象r3层的应用层一样,可以随便调试!毕竟人家是运行在r0层的!你要是设置中断的话,会导致整个操作系统暂停!据说以前都使用SoftICE调试,这个是一个单机调试的软件,使用后会使系统很不稳定,后来NuMega公司宣布停止SoftICE的开发,因此估计现在也不太会有人用了!!微软出的WinDbg是利用双机调试的一款软件,当然按照书上说的,肯定使用虚拟机和主机这样“双”机调试!在调试的时候要设置很多东西,我就是因为设置这些东西困惑了我整整半个学期!现在我把自己的设定写一下,也是根据书上的,但是书上说的实在是他娘的太模糊了!!下载安装winDbg和VMWare虚拟机我就不说了,已经虚拟机安装xp系统!先在虚拟机的windows安装目录下C盘下有个boot.ini(当然是处于隐藏状态,选择工具-》文件夹选项-》把隐藏受保护的操作系统文件这个选项去掉)修改boot。

ini内容改为[boot loader]timeout=30default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS[operating systems]multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect /noguibootmulti(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetect /debug/debugport = com1/baudrate=115200// 红色我本机绿色背景的是增加的[boot loader]timeout=5default=multi(0)disk(0)rdisk(0)partition(1)\WINDOWS[operating systems]multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Microsoft Windows XP Professional" /noexecute=optin /fastdetectC:\GHLDR=一键GHOST v2010.10.10然后关闭虚拟机系统,在VMware的Commands栏中单击Edit virtual machine setting“,选择Hardware页,然后单击Add,选择Serial Port(串口),单击下一步,选择Output to named pipe 单击下一步,保持前2个不变,分别为\\.\pipe\com_1和This end is the server,第三个修改为The other end is an application,这样虚拟机就算设置好了,接下来设置主机,转到你安装WinDbg的目录下,然后右击WinDbg。

windbg 内核调试原理(一)

windbg 内核调试原理(一)

windbg 内核调试原理(一)windbg 内核调试什么是 windbg 内核调试?•windbg 是一款强大的调试工具,可以用来调试 Windows 操作系统及其应用程序。

•内核调试是 windbg 的一个功能,用于调试操作系统内核,可以帮助开发人员定位和解决系统崩溃、死锁、性能问题等。

内核调试原理1.内核调试利用 Windows 的调试接口和调试驱动程序实现。

2.它通过在目标系统中安装一个调试驱动程序,与 windbg 配合使用,来进行调试。

3.此外,还需要使用串行线缆或网络连接将目标系统和调试主机连接起来。

准备工作•在进行内核调试之前,需要安装 windbg 和调试符号文件。

•调试符号文件包含了操作系统的调试信息,是进行调试的必要文件。

配置目标系统1.在目标系统中配置调试选项:•打开“控制面板”,找到“系统和安全”。

•点击“系统”,然后选择“高级系统设置”。

•在“高级” 选项卡下,点击“设置” 按钮。

•在“启动和故障恢复” 对话框中,点击“设置”。

•将“调试信息” 设置为“完全内存转储”。

2.进行启动选项配置:•打开“命令提示符”,输入以下命令:bcdedit /debug onbcdedit /dbgsettings serial debugport:1 baudrate:115200•这样将启用调试,并配置串行端口为 COM1,波特率为 115200。

配置调试主机1.在调试主机上打开 windbg:•首先,确保已经安装了 windbg。

•然后,在开始菜单中找到 windbg,并打开它。

2.配置串口调试选项:•点击“文件” -> “选项” -> “调试选项”。

•在“调试选项” 对话框中,选择“串行” 选项卡。

•选择正确的串行端口和波特率(与目标系统配置一致)。

连接目标系统和调试主机•使用串行线缆或网络连接将目标系统和调试主机连接起来。

开始内核调试•在 windbg 中,点击“调试” -> “启动调试”。

Windbg调试命令详解(4)

Windbg调试命令详解(4)

Windbg调试命令详解(4)5. 内存命令这一节里面,我们学习如何查看内存信息。

内存是存储数据、代码的地方,通过内存查看命令可以分析很多问题。

相关命令可以分为:内存查看命令和内存统计命令。

内存统计命令用来分析内存的使用状况。

5.1 查看内存有非常丰富的内存查看命令,它们被统一为d*格式,如下所示:▪d[类型] [地址范围]d代表Display,类型包括:字符、字符串、双字等。

具体来说,d*命令共有这几种:d、da、db、dc、dd、dD、df、dp、dq、du、dw、dW、dyb、dyd、ds、dS。

解释如下:内存类型基本类型:▪dw = 双字节WORD格式;▪dd = 4字节DWORD格式;▪dq = 8字节格式;▪df = 4字节单精度浮点数格式;▪dD =8字节双精度浮点数格式;▪dp = 指针大小格式,32位系统下4字节,64位系统下为8字节。

基本字符串:▪da = ASCII字符串格式;▪du = UNICODE字符串格式;▪db =字节 + ASCII字符串;▪dW = 双字节WORD + ASCII字符串;▪dc = 4字节DWORD + ASCII字符串。

高级字符串:▪ds = ANSI_STRING类型字符串格式;▪dS = UNICODE_STRING类型字符串格式。

二进制 + 基本类型:▪byb = 二进制 + 字节;▪byd = 二进制 + DWORD值如果读者对此感觉不明白,特别是组合模式究竟是何种情形?看下例应能清楚。

下例将同一个ASCII字符串,分别以ASCII字符串、Unicode字符串以及组合模式等共五种方式显示:此系列命令还有一些可加利用的开关选项,介绍如下:/c 列数:指定列数。

默认情况下,列数等于16除以列长,如dd 命令的默认列数即为4列(=16/4)。

例:▪dd /c 8此命令每列显示8个DWORD数,即32字节内容。

/p:此选项用来显示物理内存信息,只能用于内核模式中。

使用WinDbg调试入门(内核模式)

使用WinDbg调试入门(内核模式)

使⽤WinDbg调试⼊门(内核模式)windbg是⼀个内核模式和⽤户模式调试器,包含在Windows调试⼯具中。

这⾥我们提供了⼀些实践练习,可以帮助您开始使⽤windbg作为内核模式调试器。

设置内核模式调试内核模式调试环境通常有两台计算机:主机和⽬标计算机。

调试器在主机上运⾏,正在调试的代码在⽬标计算机上运⾏。

主机和⽬标通过调试电缆连接。

Windows调试程序⽀持以下类型的电缆进⾏调试:EthernetUSB 2.0USB 3.01394Serial (also called null modem)如果⽬标计算机运⾏的是Windows8或更⾼版本,则可以使⽤任何类型的调试电缆,包括以太⽹。

此图说明通过以太⽹电缆连接调试的主机和⽬标计算机。

如果⽬标计算机运⾏的Windows版本早于Windows 8,则不能使⽤以太⽹进⾏调试;必须使⽤USB、1394或串⾏。

此图说明了通过USB、1394或串⾏调试电缆连接的主机和⽬标计算机。

建⽴内核模式调试会话在设置好主机和⽬标计算机并⽤调试电缆将它们连接起来之后,您可以按照⽤于设置的同⼀主题中的说明建⽴内核模式调试会话。

例如,如果您决定设置主机和⽬标计算机以通过以太⽹进⾏调试,参考《》。

同样,如果您决定设置主机和⽬标计算机以通过USB 2.0进⾏调试,您可以找到建⽴内核模式调试会话的说明,参考《》开始调试1、在主机上,打开windbg并与⽬标计算机建⽴内核模式调试会话。

2、在windbg中,从帮助菜单中选择内容。

这将打开调试器⽂档chm⽂件。

调试程序⽂档也可以在这⾥在线获得。

3、当建⽴内核模式调试会话时,windbg可能会⾃动进⼊⽬标计算机。

如果windbg尚未插⼊,请从“调试”菜单中选择“中断”。

4、在windbg窗⼝底部附近的命令⾏中,输⼊以下命令:符号搜索路径告诉windbg在哪⾥查找符号(pdb)⽂件。

调试器需要符号⽂件来获取有关代码模块(函数名、变量名等)的信息。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/* Check if we have a command line */ CommandLine = LoaderBlock->LoadOptions;//从系统盘下 Boot.ini 文件读取得到的 if (CommandLine) { /* Upcase it */ _strupr(CommandLine); /* Assume we'll disable KD */ EnableKd = FALSE; /* Check for CRASHDEBUG, NODEBUG and just DEBUG */ if (strstr(CommandLine, "CRASHDEBUG")) { KdPitchDebugger = FALSE; } else if (strstr(CommandLine, "NODEBUG")) { KdPitchDebugger = TRUE; } else if ((DebugLine = strstr(CommandLine, "DEBUG")) != NULL) {//查找系统是否是以 DEBUG 模式启动 /* Enable KD */ EnableKd = TRUE;//启用 KD 以及 Windbg 等调试器 ...... //下面是额外的 options 检查及处理 } } }
windbg 调试器原理 调试器原理的简单分析 原理的简单分析
[Author] ReverseMan [Blog] /reverseman [ QQ/MSN ] 705122552 / fanxinghua2314@ 为了方便大家的阅读,首先列出本文的目录。 本文目录: 1、 分析原因 2、 分析工具及资源 3、 Windbg 调试原理简介 4、 ReactOS 源码剖析 5、 Windbg 命令实战之条件断点及封包分析 6、 总结 1. 分析原因 在一次调试中,我在 windbg 的调试窗口中在 nt!NtCreateFile 处下了个条件断点, 命令大体是这样子的: kd> bp nt!NtCreateFile "j([esp+4]='xxx') '';'g'" 然后,等我回到虚拟机中,打开 xueTr 中后发现 SSDT 钩子标签项中有如下的记录:
至此,内核调试模块的初始化就已经完成了。其流程大致如此: 首先,初始化调试函数为默认的 KdpStub 和其他一些相关的初始化工作。 然后,扫描启动参数是否有关键字”DEBUG”来决定是否启用 KD 等调试器。如果有则更换内 核调试函数为 kdpTrap。 最后,保存调试相关数据,初始化 Timer 并结束内核调试的初始化工作。 由此可知,函数 KdpTrap 是整个调试过程的处理函数。下面分析该函数:
<kdData.c> PKDEBUG_ROUTINE KiDebugRoutine = KdpStub;
其中,PKDEBUG_ROUTINE 是一个函数指针,定义如下:
<kd.h> typedef BOOLEAN (NTAPI *PKDEBUG_ROUTINE)( IN PKTRAP_FRAME TrapFrame, IN PKEXCEPTION_FRAME ExceptionFrame, IN PEXCEPTION_RECORD ExceptionRecord, //异常发生的记录,相关信息保存在此结构中 IN PCONTEXT Context, //异常发生的上下文 IN KPROCESSOR_MODE PreviousMode, IN BOOLEAN SecondChance //内核异常会处理两次,此变量标识是第几次 );
继续看函数 KdpInitSystem 函数的代码:
<kdinit.c> ......//调试器数据块初始化 /* Check if we have a loader block */ if (LoaderBlock)//函数 KdpInitSystem 传入的参数 2,包含系统启动的参数 { /* Get the image entry */ LdrEntry = CONTAINING_RECORD(LoaderBlock->LoadOrderListHead.Flink, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks); //CONTAINING_RECORD 宏用于根据结构体某一成员变量获取结构体的起始地址值 /* Save the Kernel Base */ PsNtosImageBase = (ULONG_PTR)LdrEntry->DllBase; KdVersionBlock.KernBase = (ULONG64)(LONG_PTR)LdrEntry->DllBase;
/* Initialize the Time Slip DPC */ KeInitializeDpc(&KdpTimeSlipDpc, KdpTimeSlipDpcRoutine, NULL); KeInitializeTimer(&KdpTimeSlipTimer); ExInitializeWorkItem(&KdpTimeSlipWorkItem, KdpTimeSlipWork, NULL); /* First-time initialization done! */
以上是 windbg 调试器的简单流程介绍。下面根据 ReactOS 的源码来分析下内核调 试器的某些原理实现。 NOTE:由于是参考 ReactOS 的源码,而不是真正的 windows 源码。所以分析结果 的正确性依赖于 ReactOS 源码和真实 windows 源码相似度的大小。 4. ReactOS 源码剖析 本来想参考 WRK1.2 的源码来着,无奈 WRK 的源码不完整,很多功能代码看不到。所 以最终使用 ReactOS 源码做一下简要分析。关面开始分析 ReactOS 中内核调试器部分的源码。分析过程中的函数大 部分是摘录,如需查看完整代码请参考 ReactOS(Version:0.3.11)源码。 首先,是系统初始化的代码,是在函数 KdInitSystem 中实现。 首先默认初始化调试分发函数为 KdpStub:
下面继续:
<Kdinit.c> /* Initialize the debugger if requested */ if ((EnableKd) && (NT_SUCCESS(KdDebuggerInitialize0(LoaderBlock)))) { /* Now set our real KD routine */ KiDebugRoutine = KdpTrap;//更换调试函数为 kdpTrap /* Check if we've already initialized our structures */ if (!KdpDebuggerStructuresInitialized) { /* Set the Debug Switch Routine and Retries*/ KdpContext.KdpDefaultRetries = 20; KiDebugSwitchRoutine = KdpSwitchProcessor;
BOOLEAN NTAPI KdpTrap(IN PKTRAP_FRAME TrapFrame, IN PKEXCEPTION_FRAME ExceptionFrame, IN PEXCEPTION_RECORD ExceptionRecord, IN PCONTEXT ContextRecord, IN KPROCESSOR_MODE PreviousMode, IN BOOLEAN SecondChanceException) { BOOLEAN Unload = FALSE; ULONG_PTR ProgramCounter; BOOLEAN Handled; NTSTATUS ReturnStatus; USHORT ReturnLength; if ((ExceptionRecord->ExceptionCode == STATUS_BREAKPOINT) && (ExceptionRecord->ExceptionInformation[0] != BREAKPOINT_BREAK)) {//处理 STATUS_BREAKPOINT 异常,包括 Print、Prompt、Load/Unload sysmbols 等 /* Save Program Counter */ ProgramCounter = KeGetContextPc(ContextRecord); /* Check what kind of operation was requested from us */ switch (ExceptionRecord->ExceptionInformation[0]) { /* DbgPrint */ case BREAKPOINT_PRINT://DbgPrint 调用 /* Call the worker routine */ ReturnStatus KdpPrint((ULONG)KdpGetParameterThree(ContextRecord), (ULONG)KdpGetParameterFour(ContextRecord), (LPSTR)ExceptionRecord-> =
KdpDebuggerStructuresInitialized = TRUE; } /* Initialize the timer */ KdTimerStart.QuadPart = 0;//初始化 timer.调试过程中使用时钟进行通信及超时重传 /* Officially enable KD */ KdPitchDebugger = FALSE; KdDebuggerEnabled = TRUE;//启用调试器 ......
相关文档
最新文档