`
seagle0128
  • 浏览: 44201 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

使用WinDbg调试程序

阅读更多

什么是WinDBG?

WinDbg是微软开发的免费源码级调试工具。Windbg可以用于Kernel模式调试和用户模式调试,还可以调试Dump文件。由于大部分程序员不需要做Kernel模式调试, 我在这篇文章中不会介绍Kernel模式调试。Kernel模式调试对学习Windows核心极有帮助。如果你对此感兴趣,可以阅读Inside Windows 2000和Windbg所带的帮助文件。

这篇文章得主要目的是介绍WINDBG的主要功能以及相关的命令。关于这些命令的详细语法,请参阅帮助文件。对文章中提到的许多命令,WINDBG有相应的菜单选项。
如何得到帮助

在命令(Command)窗口中输入.hh 命会调出帮助文件令。

.hh keyword 会显示关于keyword的详细命令。

启动Debugger

Windbg可以用于如下三种调试:

远程调试:你可以从机器A上调试在机器B上执行的程序。具体步骤如下:
? 在机器B上启动一个调试窗口(Debug Session)。你可以直接在Windbg下运行一个程序或者将Windbg附加(Attach)到一个进程。
? 在机器B的Windbg命令窗口上启动一个远程调试接口(remote):
.server npipe:pipe=PIPE_NAME
PIPE_NAME是该接口的名字。
? 在机器A上运行:
windbg –remote npipe:server=SERVER_NAME,pipe=PIPE_NAME
SERVER_NAME是机器B的名字。
Dump文件调试:如果在你的客户的机器上出现问题,你可能不能使用远程调试来解决问题。你可以要求你的用户将Windbg附加到出现问题的进程上,然后在命令窗口中输入:
.dump /ma File Name
创建一个Dump文件。在得到Dump文件后,使用如下的命令来打开它:
windbg –z DUMP_FILE_NAME

本地进程调试:你可以在Windbg下直接运行一个程序:
Windbg “path to executable” arguments
也可以将Windbg附加到一个正在运行的程序:
Windbg –p “process id”
Windbg –pn “process name”
注意有一种非侵入(Noninvasive)模式可以用来检查一个进程的状态并不进程的执行。当然在这种模式下无法控制被调试程序的执行。这种模式也可以用于查看一个已经在Debugger控制下运行的进程。具体命令如下:
Windbg –pv –p “process id”
Windbg –pv –pn “process name”

调试多个进程和线程

如果你想控制一个进程以及它的子进程的执行,在Windbg的命令行上加上-o选项。Windbg中还有一个新的命令.childdbg 可以用来控制子进程的调试。如果你同时调试几个进程,可以使用 命令来显示并切换到不同的进程。
在同一个进程中可能有多个线程。~命令可以用来显示和切换线程。

调试前的必备工作
在开始调试前首先要做的工作是设置好符号(Symbols)路径。没有符号,你看到的调用堆栈基本上毫无意义。Microsoft的操作系统符号文件(PDB)是对外公开的。另外请注意在编译你自己的程序选择生成PDB文件的选项。如果设置好符号路径后,调用堆栈看起来还是不对。可以使用lm, !sym noisy, !reload 等命令来验证符号路径是否正确。

Windbg也支持源码级的调试。在开始源码调试前,你需要用.srcpath设置源代码路径。如果你是在生成所执行代码的机器上进行调试,符号文件中的源码路径会指向正确的位置,所以不需要设置源代码路径。如果所执行代码是在另一台机器上生成的,你可以将所用的源码拷贝(保持原有的目录结构)的一个可以访问的文件夹(可以是网络路径)并将源代码路径设为该文件夹的路径。注意如果是远程调试,你需要使用.lsrcpath来设置源码路径。

静态命令:
显示调用堆栈:在连接到一个调试窗口后,首先要知道的就是程序当前的执行情况k* 命令显示当前线程的堆栈。~*kb会显示所有线程的调用堆栈。如果堆栈太长,Windbg只会显示堆栈的一部分。.kframes可以用来设置缺省显示框架数。

显示局部变量:接下来要做通常是用dv显示局部变量的信息。CTRL+ALT+V可以切换到更详细的显示模式。关于dv要注意的是在优化过的代码中dv的输出极有可能是不准确的。这时后你能做的就是阅读汇编代码来发现你感兴趣的值是否存储在寄存器中或堆栈上。有时后当前的框架(Frame)上可能找不到你想知道的数据。如果该数据是作为参数传到当前的方法中的,可以读一读上一个或几个框架的汇编代码,有可能该数据还在堆栈的某个地址上。静态变量是储存在固定地址中的,所以找出静态变量的值较为容易。.Frame(或者在调用堆栈窗口中双击)可以用来切换当前的框架。注意dv命令显示的是当前框架的内容。你也可在watch窗口中观察局部变量的值。

显示类和链表: dt可以显示数据结构。比如dt PEB 会显示操作系统进程结构。在后面跟上一个进程结构的地址会显示该结构的详细信息:dt PEB 7ffdf000。
Dl命令可以显示一些特定的链表结构。

显示当前线程的错误值:!gle会显示当前线程的上一个错误值和状态值。!error命令可以解码HRESULT。

搜索或修改内存:使用s 命令来搜索字节,字或双字,QWORD或字符串。使用e命令来修改内存。

计算表达式:?命令可以用来进行计算。关于表达式的格式请参照帮助文档。使用n命令来切换输入数字的进制。

显示当前线程,进程和模块信息:!teb显示当前线程的环境信息。最常见的用途是查看当前线程堆栈的起始地址,然后在堆栈中搜索值。!peb显示当前进程的环境信息,比如执行文件的路径等等。lm显示进程中加载的模块信息。


显示寄存器的值:r命令可以显示和修改寄存器的值。如果要在表达式中使用寄存器的值,在寄存器名前加@符号(比如@eax)。


显示最相近的符号:ln Address。如果你有一个C++对象的指针,可以用来ln来查看该对象类型。

查找符号:x命令可以用来查找全局变量的地址或过程的地址。x命令支持匹配符号。x kernel32!*显示Kernel32.dll中的所有可见变量,数据结构和过程。


查看lock:!locks显示各线程的锁资源使用情况。对调试死锁很有用。

查看handle:!handle显示句柄信息。如果一段代码导致句柄泄漏,你只需要在代码执行前后使用!handle命令并比较两次输出的区别。有一个命令!htrace对调试与句柄有关的Bug非常有用。在开始调试前输入:
!htrace –enable
然后在调试过程中使用!htrace handle_value 来显示所有与该句柄有关的调用堆栈。

显示汇编代码:u。

程序执行控制命令:
设置代码断点:bp/bu/bm 可以用来设置代码断点。你可以指定断点被跳过的次数。假设一段代码KERNEL32!SetLastError在运行很多次后会出错,你可以设置如下断点:
bp KERNEL32!SetLastError 0x100.
在出错后使用bl 来显示断点信息(注意粗体显示的值):
0 e 77e7a3b0 004f (0100) 0:*** KERNEL32!SetLastError
重新启动调试(.restart命令)并设置如下的断点:
bp Kernel32!SetLastError 0x100-0x4f
Debugger会停在出错前最后一次调用该过程的地方。

你可以指定断点被激活时Debugger应当执行的命令串。在该命令串中使用J命令可以用来设置条件断点:
bp `mysource.cpp:143` "j (poi(MyVar)”0n20) ''; 'g' "
上面的断点只在MyVar的值大于32时被激活(g命令

条件断点的用途极为广泛。你可以指定一个断点只在特殊的情况下被激活,比如传入的参数满足一定的条件,调用者是某个特殊的过程,某个全局变量被设为特殊的值等等。

设置内存断点:ba可以用来设置内存断点。调试过程中一个常见的问题是跟踪某些数据的变化。如下的断点:
ba w4 0x40000000 "kb; g"
可以打印出所有修改0x40000000的调用堆栈。

控制程序执行:p, pa,t, ta等命令可以用来控制程序的执行。

控制异常和事件处理:Debugger的缺省设置是跳过首次异常(first chance expcetion),在二次异常(second chance exception)时中断程序的执行。sx命令显示Debugger的设置。sxe和sxd可以改变Debugger的设置。
sxe clr
可以控制Debugger在托管异常发生时中断程序的执行。常用的Debugger事件有:
av 访问异常
eh C++异常
clr 托管异常
ld 模块加载
-c 选项可以用来指定在事件发生时执行的调试命令。

分享到:
评论

相关推荐

    如何使用WinDbg调试程序.pdf

    ### 如何使用WinDbg调试程序 #### WinDbg简介 WinDbg是微软提供的一款功能强大的免费源码级调试工具,适用于内核模式和用户模式的调试,并且能够调试dump文件。对于大多数程序员而言,用户模式调试是最常用的功能...

    WinDbg 调试程序崩溃操作详解

    在Windows平台上,程序崩溃往往给开发者带来巨大的困扰。WinDbg是一款强大的调试工具,由Microsoft开发,用于诊断和解决...通过阅读《WinDbg调试程序崩溃.pdf》这份文档,你将获得更全面的WinDbg实战技巧和案例解析。

    WinDbg调试程序崩溃

    本文将深入探讨如何使用WinDbg来调试程序崩溃,以及相关的重要知识点。 首先,理解WinDbg的基本概念是必要的。WinDbg是由微软开发的一款开源调试器,它支持对Windows操作系统上的应用程序进行调试,无论是用户模式...

    Windows 11 版本 WDK中windbg调试插件

    在这个特定的压缩包中,我们关注的是`win11WDKvVS2019WindbgExtension`,这是一个用于Windbg调试器的插件。 Windbg是微软提供的一个强大的调试工具,它允许开发者对内核模式和用户模式的应用程序以及驱动程序进行...

    使用Windbg双机调试驱动

    "使用Windbg双机调试驱动" Windbg是微软出品的一款双机调试软件,用于调试Windows内核程序。双机调试的主要思想是使用虚拟机和主机来进行调试,虚拟机上安装要调试的操作系统,而主机上安装Windbg。 调试前的准备 ...

    Windbg中文调试手册

    - 对于Visual Studio和WDK用户,有多个调试环境可供选择,它们都基于同一调试引擎——Windows符号调试程序引擎(Dbgeng.dll)。 **调试环境** - 调试器可以在x86、x64或Arm处理器上运行,并能调试相同架构上运行的...

    Windbg 调试命令(内核+用户态程序)

    Windbg是一款强大的Windows调试工具,由Microsoft开发,用于分析内核模式和用户模式的应用程序。它在系统级调试、故障排除、性能分析等方面发挥着关键作用。本篇将深入探讨Windbg的一些核心调试命令,包括内核模式和...

    windbg 调试器扩展

    Windbg调试器扩展是Windows操作系统下强大的调试工具,主要用于分析和诊断系统级的问题,如内核模式崩溃、内存泄漏和性能问题。它以其丰富的命令集和强大的调试功能而闻名,尤其在驱动程序开发和系统故障排查领域...

    Windows 调试程序 (WinDbg)

    **Windows调试程序(WinDbg)** WinDbg是一款强大的调试工具,由Microsoft提供,用于对Windows操作系统进行内核模式和用户模式的调试。这款工具是Windows开发和故障排除过程中的得力助手,尤其在处理崩溃、性能问题或...

    windbg调试驱动教程.pdf

    在guest OS中编辑boot.ini文件,添加参数以便使用WinDbg调试。具体步骤如下: * 编辑虚拟机中C盘根目录下的boot.ini文件 * 在boot.ini文件中添加以下代码:multi(0) disk(0) rdisk(0) partition(1) \WINDOWS=...

    WINDBG调试工具

    通常,安装这个exe文件即可在32位Windows系统上使用WinDbg调试工具。 **使用WinDbg的步骤** 1. **安装WinDbg**:双击"dbg_x86_6.6.07.5.exe",按照提示完成安装。 2. **配置符号路径**:在WinDbg中设置符号路径,...

    Windbg分析dump及Linux调试程序使用方案

    ### Windbg分析dump及Linux调试程序使用方案 #### Windows下的Windbg分析dump及调试程序 **Windbg**是Microsoft提供的一款强大的调试工具,主要用于Windows环境下应用程序的调试与故障诊断。它支持用户模式和内核...

    Windbg调试命令详解

    Windbg 调试命令详解 Windbg 是 Windows 调试工具集中的一个...Windbg 提供了强大的调试功能,用户可以使用 Windbg 来调试各种类型的程序。通过学习 Windbg 的调试命令,用户可以提高自己的调试能力,快速地解决问题。

    WinDBG调试技巧

    《WinDBG调试技巧详解》 WinDBG,全称Debugging Tools for Windows,是一款强大的调试工具,尤其在处理底层系统和驱动程序的调试方面表现出色。它根据不同的CPU指令架构提供了x86、AMD64和IA64三个版本。WinDBG不仅...

    使用WinDbg进行Windows内核调试的详细过程

    ### 使用WinDbg进行Windows内核调试的详细过程 #### 一、概述 本文将详细介绍如何使用WinDbg工具对Windows内核进行调试的过程。WinDbg是一款强大的调试工具,广泛应用于软件开发过程中,特别是在系统级编程和驱动...

    windbg调试PPT

    在“windbg调试PPT”中,我们可以期待学习以下核心知识点: 1. **Windbg基本操作**:如何启动Windbg,设置源代码路径,加载符号表,以及如何设置断点。 2. **调试器命令**:包括但不限于`g`(继续执行)、`k`(显示...

    WinDbg与vmware虚拟机调试配置 解决WinDbg与vmware不能连接问题

    此外,还可以进一步扩展,例如添加符号表来提高调试效率(参考链接[1]),或了解更多关于WinDbg命令的使用方法(参考链接[2])。 总之,通过这些步骤,开发人员可以更加高效地进行系统或驱动程序的调试工作,提高...

    windbg 调试器原理的简单分析

    ### Windbg调试器原理的简单分析 #### 一、分析原因 在进行深入的技术解析之前,我们先回顾一下引发本次分析的原因。在一次使用Windbg进行调试的过程中,作者在一个特定的位置(`nt!NtCreateFile`)设置了一个条件...

Global site tag (gtag.js) - Google Analytics