Windows调试工具入门3(WinDbg基本调试操作)
- 格式:pdf
- 大小:921.19 KB
- 文档页数:17
使用WinDbg和虚拟机调试Windows驱动程序教程(转)驱动调试攻略(WinDbg)驱动调试是一个系统级调试方式,所以调试工具用WinDbg是最佳选择。
驱动调试一般情况下,需要两台电脑进行。
一台作为主机进行驱动调试,另一台作为目标机进行驱动安装。
当然如果没有多余的电脑,我们可以安装VMware模拟系统调试(虚拟机)。
只是对电脑的配置要求比较高。
本文介绍使用WinDbg及VMware进行调试的具体设置及方法。
这些资料在网络很难找到,笔者也是吸取了他人很多宝贵意见才完成的,供大家学习讨论。
其实用SoftIce可以单机调试驱动,但是有个问题就是在SoftIce启动前驱动可能已经启动了。
VMware Support 中说,自4.0.18.0 版本之后的WinDbg 都支持了通过pipe 来进行调试,不过微软对此并没有任何说明。
所以,在VMware中虚拟被调试的系统,然后通过VMware 虚拟一个com端口。
使用这个虚拟的端口,就可以用WinDbg 进行调试了。
具体步骤如下:1. 安装和设置WinDbg,VMware首先,请到微软官方网站/whdc/devtools/debugging/default.mspx,下载最新版本的WinDbg工具,建议使用6.0以上版本的WinDbg做为调试工具。
VMware也可以在网站上找到,当然使用高版本比较好。
安装过程比较简单,就不在此多做介绍。
唯一要注意的是,安装完虚拟机后,请在VMware主菜单“VM”中选择“Install VM Tools…”,完成系统驱动文件的安装。
安装完这两个软件后,请在VMware中安装跟你的电脑版本相同的操作系统。
例如:你的电脑安装的是WindowsXP Professional,那么最好在Vmware中安装相同版本。
至少是相同的系统,Windows XPßà Windows XP、Windows 2000ßà Windows 2000。
windbg使用方法Windbg是一款由Microsoft开发的强大的调试工具,它可以帮助开发人员诊断和解决Windows平台上的各种软件问题。
本文将介绍Windbg的基本使用方法,希望能够帮助读者更好地利用这一工具进行调试和分析。
首先,我们需要下载并安装Windbg工具。
可以在Microsoft官方网站上找到Windbg的安装包,并按照提示进行安装。
安装完成后,我们可以在开始菜单或者桌面上找到Windbg的快捷方式,双击打开即可进入工具界面。
在使用Windbg进行调试之前,我们需要先了解一些基本概念和操作。
首先是符号文件的设置,符号文件包含了程序中各个函数和变量的调试信息,可以帮助我们更好地进行调试。
在Windbg中,可以通过设置符号路径和加载符号文件来进行符号文件的管理。
接着是源代码的设置,如果我们有程序的源代码,可以通过设置源代码路径来进行源代码级别的调试。
最后是调试目标的设置,可以通过Attach或者Open Crash Dump来加载需要调试的程序。
接下来,我们来看一下Windbg的一些常用命令和功能。
在Windbg的命令行窗口中,可以输入各种命令来进行调试操作,比如设置断点、查看变量的值、跟踪函数的调用等。
此外,Windbg还提供了丰富的图形化界面,可以通过菜单栏和工具栏来进行各种调试操作,比如查看内存、查看寄存器、查看线程信息等。
除了基本的调试功能,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。
windows系统蓝屏分析修复工具WinDbg(32位/64位)及教程Windbg是一款经典的windows系统蓝屏分析修复工具,可以通过对dmp文件的分析和定位,分析并解决蓝屏、程序崩溃(IE崩溃)等问题,有了Windbg大家不会再对蓝屏茫然无措了,如果你遇到了头疼的蓝屏问题,试试这个windows系统蓝屏分析修复工具这个绿色软件吧。
windows系统蓝屏分析修复工具使用注意事项:符号表是Windbg关键的“数据库”,如果没有它,WinDbg基本上就是个废物,无法分析出更多问题原因。
所以使用Windbg设置符号表,是必须要走的一步。
1、运行Windbg软件,然后按【Ctrl+S】弹出符号表设置窗2、将符号表地址:SRV*C:\Symbols*/download /symbols粘贴在输入框中,点击确定即可。
温馨提示:红色字体为符号表本地存储路径,建议固定路径,可避免符号表重复下载。
windows系统蓝屏分析修复工具简单的使用教程简介:当你拿到一个dmp文件后,可使用【Ctrl+D】快捷键来打开一个dmp文件,或者点击WinDbg界面上的【File=>Open Crash Dump...】按钮,来打开一个dmp 文件。
第一次打开dmp文件时,可能会收到如下提示,出现这个提示时,勾选“Don't ask again in this WinDbg session”,然后点否即可。
当你想打开第二个dmp文件时,可能因为上一个分析记录未清除,导致无法直接分析下一个dmp文件,此时你可以使用快捷键【Shift+F5】来关闭上一个dmp分析记录。
到这里关于windows系统蓝屏分析修复工具的使用已经介绍完了,简单的Windbg使用相信大家已经没有任何问题了。
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是一种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会中断程序的执行,并显示相关的调试信息。
学会使用电脑的调试工具在当今信息化时代,电脑已经成为我们生活和工作中必不可少的工具。
然而,由于软硬件的繁杂性,我们在使用电脑过程中常常会遇到各种问题和bug。
为了解决这些问题,学会使用电脑的调试工具将成为我们提高工作效率的关键。
本文将介绍几种常用的电脑调试工具和它们的使用方法。
一、任务管理器任务管理器是Windows系统自带的一款常用调试工具,在遇到电脑卡顿或程序无响应的情况下,它可以帮助我们找到问题的症结。
使用任务管理器,我们可以查看系统资源的使用情况,关闭卡死的进程,或开启新的任务,从而恢复电脑的正常运行。
在Windows系统中,按下Ctrl+Shift+Esc快捷键可以直接打开任务管理器。
在任务管理器的“进程”选项卡中,我们可以看到当前正在运行的所有进程及其所占用的资源。
通过观察CPU、内存和磁盘使用率,我们可以找到系统中占用大量资源的进程,并对其进行优化或关闭。
二、代码编辑器调试工具对于从事软件开发的人员来说,代码编辑器的调试工具是必不可少的。
常见的代码编辑器如Visual Studio Code、PyCharm等都提供了强大的调试功能,帮助开发者查找问题和解决bug。
以Visual Studio Code为例,它内置了调试功能,可以在代码中设置断点,逐行调试程序。
当程序运行到断点处时,我们可以查看变量的值,进行单步调试,或者观察函数的调用栈,从而分析问题所在。
此外,Visual Studio Code还支持对应用程序的远程调试,方便我们在客户端出现问题时进行调试和排查故障。
三、网络调试工具在进行网络开发或者维护时,网络调试工具是不可或缺的帮手。
常见的网络调试工具有Wireshark、Postman等。
Wireshark是一款网络抓包工具,通过监听网络接口,它可以捕获和分析网络数据包,在网络故障排查和网络优化中发挥着重要作用。
我们可以在Wireshark中查看网络通信的详细信息,包括请求方法、响应状态码、请求头、响应体等,从而找到网络中的问题所在。
windbg使用方法Windbg是一款由微软公司开发的调试工具,它可以帮助开发人员分析和诊断Windows操作系统和应用程序的问题。
本文将介绍Windbg的基本使用方法,希望能够帮助读者更好地利用这个工具进行调试和分析。
首先,我们需要了解如何安装Windbg。
通常情况下,Windbg是作为Windows驱动程序开发工具包(Windows Driver Kit)的一部分发布的,也可以在微软的官方网站上下载到独立安装包。
安装完成后,我们可以在开始菜单或者安装目录中找到Windbg的可执行文件。
接下来,我们需要了解如何打开并配置Windbg。
在打开Windbg 后,我们可以通过“文件”菜单中的“符号文件路径”选项来设置符号文件的路径,以便Windbg能够正确地加载符号文件。
符号文件对于调试非常重要,它包含了源代码和可执行文件之间的映射关系,能够帮助我们更好地理解程序的运行状态。
在Windbg中,我们可以通过“文件”菜单中的“打开转储文件”选项来打开需要分析的转储文件(dump file)。
转储文件是程序崩溃时生成的一种内存快照,包含了程序崩溃时的内存状态和调用栈信息。
通过分析转储文件,我们可以找出程序崩溃的原因,并进行相应的调试和修复。
除了分析转储文件外,我们还可以通过“调试”菜单中的“附加到进程”选项来附加到正在运行的进程,以实时地监视和分析程序的运行状态。
这对于调试一些无法通过转储文件分析的问题非常有帮助,比如内存泄漏、死锁等问题。
在Windbg中,我们可以使用各种命令来进行调试和分析。
比如,通过“!analyze”命令可以自动分析转储文件,并给出可能的崩溃原因;通过“kb”命令可以查看当前线程的调用栈信息;通过“!heap”命令可以查看进程的堆内存分配情况等等。
熟练掌握这些命令对于高效地进行调试和分析非常重要。
除了命令之外,Windbg还提供了丰富的调试工具,比如内存窗口、寄存器窗口、线程窗口等,这些工具可以帮助我们更直观地了解程序的运行状态。
详解用法详解第30章WinDBG用法WinDBG是个非常强大的调试器,它设计了极其丰富的功能来支持各种调试任务,包括用户态调试、内核态调试、调试转储文件、远程调试等等。
WinDBG具有非常大的灵活性和可扩展性,用来满足各种各样的调试需求,比如用户可以自由定义调试事件的处理方式,编写调试扩展模块来定制和补充WinDBG的调试功能。
尽管WinDBG是个典型的窗口程序,但是它的大多数调试功能还是以手工输入命令的方式来工作的。
目前版本的WinDBG共提供了20多条标准命令,140多条元命令(Meta-commands),和难以计数的大量扩展命令。
学习和灵活使用这些命令是学习WinDBG的关键,也是难点。
上一章我们从设计的角度分析了WinDBG,本章将从使用(用户)的角度介绍WinDBG。
我们先介绍工作空间的概念和用法(第1节),然后介绍命令的分类和不同种类的命令提示符(第2节)。
第3节介绍不同的调试模式,也就是如何与不同特征的调试目标建立调试会话。
第4节介绍上下文的概念和在调试时应该如何切换和控制上下文。
第5节介绍调试事件和如何定制调试事件的处理方式。
从第6节到第9节我们将分别介绍如何在WinDBG中完成典型的调试操作,比如控制调试目标(第6节)、设置断点(第7节)、观察栈(第8节)以及如何观察和修改数据(第9节)。
30.1 工作空间WinDBG使用工作空间(Workspace)来描述和存储一个调试项目的属性、参数、以及调试器设置等信息。
其功能类似于集成开发环境的项目文件。
分类30.1.1分类WinDBG定义了两种工作空间,一种称为缺省的工作空间(Default Workspace),另一种称为命名的工作空间(Named Workspace)。
当没有明确使用某个命名的工作空间时,WinDBG总是使用缺省的工作空间,因此缺省的工作空间也叫隐含的(implicit)工作空间,命名的工作空间也叫显式的(explicit)工作空间。
目录1Windbg简介 (1)2Windbg设置条件断点 (1)3事件处理与异常 (3)4调试dll和ocx控件 (6)5进程调试与程序死锁 (8)6结语 (11)关键词:软件调试,调试技巧,windbg摘要:Windbg是微软提供的一款免费的软件调试工具,具有强大的功能和扩展性,满足各种各样的调试需求。
本文对windbg进行了简单的介绍,对几个我比较关心的主题进行了详细的讲解,并给出了一些调试技巧,配合一些示例。
由于软件调试是一个广阔的领域,windg的命令使用与调试技巧也很多,本文也不能一一涉及,文章最后给出了一些参考资源,可以进一步深入研究。
1Windbg简介Windbg是微软开发的一款免费软件调试工具,WinDBG 是个非常强大的调试器,它设计了极其丰富的功能来支持各种调试任务,包括用户态调试、内核态调试、调试转储文件、远程调试等等。
WinDBG 具有非常大的灵活性和可扩展性,用来满足各种各样的调试需求,比如用户可以自由定义调试事件的处理方式,编写调试扩展模块来定制和补充WinDBG 的调试功能。
此外windbg通过SOS.dll支持可以调试.net应用程序,使得windbg成为windows下软件调试的首选。
WinDbg主要适用于以下这些场合:1.商业软件的Debug(缺乏源码)和客户支持(需要远程调试)2.内核驱动的调试,以及对驱动进行逆向工程时进行动态调试3.研究Windows本身的内核或者软件4.疑难BUG的调试,如死锁、COM调用、资源泄露、堆栈或者堆溢出5.以性能优化为目的的调试6.对调试目标基本不造成影响的非侵入式调试(windbg特有)Windbg具备极为强大的功能,可以调试可执行文件(exe),动态链接库(dll)、Activex控件,程序dump 文件和在运行进程,涵盖了软件调试的方方面面,windbg的操作命令和使用技巧也很多,这里仅列举我比较关心和常用的几个主题。
windbg用法Windbg是微软官方的调试工具,主要用于Windows操作系统和Microsoft Windows应用程序内核级别的调试。
以下是一些Windbg的基本用法:1. 启动Windbg:打开Windbg>文件>打开进程>选择需要调试的进程>打开。
2. 设置符号路径:Windbg默认不会自动找到包含符号信息的pdb文件,需要手动设置符号路径,否则可能出现无法识别符号的问题。
3. 设置断点:Windbg有多种设置断点的方法,包括使用命令行设置、使用界面设置等。
例如,可以使用“bu(break on access)”或“bp(break on process)”设置断点。
4. 执行程序:Windbg在程序执行过程中可以进行单步调试,可以使用“g(go)”命令继续执行代码,也可以使用“p(step into)”、“t(step over)”、“u(step out)”等命令逐行执行代码。
5. 查看调试信息:在Windbg中可以查看程序的调试信息,包括堆栈、寄存器、变量值、汇编代码等。
可以使用“!analyze”命令查看程序崩溃信息,还可以使用“!heap”、“!locks”等命令查看程序运行时的内存信息和锁定信息。
6. 输出调试信息:Windbg可以输出调试信息到文本文件中,可以使用“logopen”、“logappend”、“logclose”等命令将调试信息输出到指定的文件中。
7. 导出内存快照:在Windbg中可以使用“.dump”命令导出内存快照,也可以使用“!writecrashdump”命令将调试信息和内存快照导出到指定的文件中。
8. 反汇编代码:Windbg可以反汇编代码,可以使用“u”、“uf”、“uc”、“ud”等命令查看汇编代码。
以上是Windbg最基本的用法,更多高级用法请查看Windbg相关文档或其他相关资料。
windebug使用方法WinDbg 使用方法WinDbg 是一款强大的 Windows 调试工具,被广泛应用于开发人员和调试专家之间。
它提供了一系列功能,帮助用户分析和调试 Windows 操作系统、驱动程序和应用程序中的问题。
以下是 WinDbg 的使用方法。
1. 下载和安装 WinDbg:您可以从微软官方网站下载最新版本的 WinDbg。
安装过程很简单,按照向导提示逐步进行即可。
2. 配置符号路径:符号文件包含了源代码的调试信息,是进行高级调试的关键。
在 WinDbg 中,您需要配置符号路径以便正确加载符号文件。
您可以通过 "File" 菜单下的 "Symbol File Path" 选项来配置符号路径。
3. 载入调试目标:在 WinDbg 中,可以通过多种方式来载入调试目标。
您可以通过 "File" 菜单下的 "Open Crash Dump" 选项来打开崩溃转储文件,或者通过"File" 菜单下的 "Attach to Process" 选项来附加到正在运行的进程。
4. 设置断点:断点是调试过程中非常有用的工具,可以帮助您在应用程序中指定的位置停止执行。
在 WinDbg 中,可以通过输入 "bp <地址>" 命令来设置断点。
例如,"bp 0x00400000" 命令将在指定地址处设置一个断点。
5. 运行调试:一旦设置了断点并准备好调试,您可以通过 "Debug" 菜单下的"Go" 命令来开始运行调试过程。
当应用程序执行到断点处时,调试过程会自动停止。
6. 分析调试信息:当调试过程中断时,您可以使用 WinDbg 提供的各种命令和功能来分析调试信息。
例如,您可以使用 "p" 命令来显示变量的值,使用 "k" 命令查看调用栈,使用 "lm" 命令列出模块信息等。
WinDbg配置和使用基础WinDbg是微软发布的一款相当优秀的源码级(source-level)调试工具,可以用于Kernel模式调试和用户模式调试,还可以调试Dump文件。
1. WinDbg介绍:Debugging Tools and Symbols: Getting StartedA word for WinDbg2. WinDbg下载:Install Debugging Tools for Windows 32-bit VersionInstall Debugging Tools for Windows 64-bit Versions3. 配置WinDbg:运行WinDbg->菜单->File->Symbol File Path->按照下面的方法设置_NT_SYMBOL_PATH变量:在弹出的框中输入“C:\MyCodesSymbols;SRV*C:\MyLocalSymbols*/download/symbols”(按照这样设置,WinDbg将先从本地文件夹C:\MyCodesSymbols中查找Symbol,如果找不到,则自动从MS 的Symbol Server上下载Symbols)。
另一种做法是从这个Symbol下载地址中,下载相应操作系统所需要的完整的Symbol安装包,并进行安装,例如我将其安装在D:\WINDOWS\Symbols,在该框中输入“D:\WINDOWS\Symbols”。
(这里要注意下载的Symbols的版本一定要正确,在我的Win2003+Sp1上,我曾经以为安装Win2003+Sp2的Symbols可能会牛×点,但结果证明我错了,用WinDbg打开可执行文件时,提示“PDB symbol for mscorwks.dll not loaded;Defaulted to export symb ols for ntdll.dll”的错误,我有重新装上Win2003+Sp1的Symbols, 现在一切运行正常^_^)4. 使用WinDbg:WinDbg提供了图形界面和命令行两种运行方式。
windbg gflags操作流程Windbg是Windows平台上的一款强大的调试工具,可以用于分析和调试应用程序和操作系统。
Gflags是Windbg中的一个重要功能,可以用于设置全局标志位,从而在调试过程中提供更多的调试信息。
本文将详细介绍使用Windbg和Gflags的操作流程。
我们需要下载和安装Windbg工具。
可以从Microsoft官方网站上下载Windbg的最新版本,并按照安装向导进行安装。
安装完成后,我们可以在开始菜单中找到Windbg的快捷方式。
接下来,我们打开Windbg,并选择要调试的应用程序或操作系统。
可以通过"File"菜单中的"Attach to a Process"选项来选择正在运行的进程,或者通过"File"菜单中的"Open Crash Dump"选项来打开崩溃转储文件。
在Windbg的命令行中,我们可以使用Gflags命令来设置全局标志位。
Gflags命令的基本语法如下:```gflags [/p [/enable | /disable] [/full] [/offlinesymbolsp] [/user] [/kernel]] [imagefile]```其中,"/p"参数用于指定要设置标志位的进程或模块;"/enable"和"/disable"参数用于启用或禁用标志位;"/full"参数用于显示所有标志位的详细信息;"/offlinesymbolsp"参数用于禁用符号搜索路径;"/user"参数用于设置用户模式的标志位;"/kernel"参数用于设置内核模式的标志位;"imagefile"参数用于指定要设置标志位的映像文件。
windbg 基本命令Windbg是一款强大的调试工具,广泛应用于Windows操作系统的开发和调试过程中。
本文将介绍Windbg的基本命令,帮助读者了解如何使用这些命令来进行调试和分析。
一、启动Windbg要启动Windbg,可以在命令行中输入"windbg"命令,或者在开始菜单中找到Windbg的快捷方式并点击打开。
启动后,会出现一个命令行窗口和一个图形界面窗口。
二、加载调试目标在Windbg中,需要加载一个调试目标,可以是一个可执行文件、一个进程或者一个内存转储文件。
加载调试目标的命令是"File"命令,可以通过命令行输入文件路径或者使用图形界面中的"File"菜单来加载。
三、设置调试符号路径调试符号是用于将二进制代码映射到源代码的关键信息。
在进行调试时,通常需要设置调试符号路径,以便Windbg能够正确地解析符号信息。
可以使用"SymPath"命令来设置调试符号路径,例如:```.symfix c:\symbols```四、设置断点断点是调试过程中的一个重要工具,可以在程序执行到指定位置时中断执行,以便进行调试和分析。
在Windbg中,可以使用"bp"命令来设置断点,例如:```bp mymodule!myfunction```五、运行调试目标设置好断点后,可以使用"g"命令来运行调试目标,程序会执行到第一个断点处并中断执行。
可以使用"p"命令来查看当前断点的位置和状态。
六、单步执行在调试过程中,可以使用单步执行命令来逐行执行程序,并观察程序的执行状态。
Windbg提供了多种单步执行命令,包括"t"命令(单步执行一条指令)、"p"命令(单步执行到下一个源代码行)等。
七、查看变量和内存在调试过程中,经常需要查看变量的值和内存的内容,以便分析程序的状态和执行结果。
WinDbg内核调试配置内核调试主要用来调试驱动代码、分析内核结构等。
WinDbg通过两台电脑可以实现内核调试,其中一台电脑运行WinDbg,被称为主机;另外一台电脑运行被调试的程序或系统,被称为目标机。
一般情况下两台电脑都是真实机器,这样调试最符合实际情况,两台电脑通过串口线、1394线或USB对联线连接起来实现双机内核调试。
如果没有两台电脑,也可以用虚拟机来模拟目标机,主机上运行WinDbg,虚拟机中安装Windows运行被调试的程序,虚拟机通过模拟的串口输出为主机上的一个命名管道,从而和主机上的WinDbg连接起来实现双机内核调试。
除双机内核调试外,WindowsXP后还引入了一种本机内核调试方式,只需要一台电脑,直接运行WinDbg就能查看修改系统内核结构等,不过所有和中断目标机系统相关的命令都不能执行,如断点命令。
如果采用虚拟机模拟目标机,调试响应速度有时候是个问题,比1394线连接的真实双机调试速度要慢不少,特别是执行操作大量内存的命令时(如搜索内存命令),感觉非常明星。
所以针对这种情况还会介绍一个特殊的辅助调试工具vmkd,该工具可以大大加速内核调试的速度,为咱们带来不少方便。
下面分节详细介绍各种内核调试情景下的配置,尽量每个步骤都截图说明。
真实机双机内核调试真实机之间的内核调试首先需要准备连接线,可以用串口线、1394线或者USB对联线。
串口线速度太慢,而且电脑城一般买不到可以直接使用的串口线,需要把线和接头买回来自己焊,按照WinDbg 帮助中的说明交叉焊接,就能得到一根可用来调试的串口线。
用串口线把两台电脑连接上后,先用Windows自带的超级终端工具,选择好串口和波特率连接。
如果在超级终端中按键能在另外一台电脑的超级终端上显示按键,则表示串口线连接成功。
接下来就可以用WinDbg连接串口调试。
某些笔记本上可能没有串口,可以买一个USB转串口的接头,然后设置USB转换后的串口号,就能把这台笔记本当作主机使用。
Windows调试工具入门3—基本调试操作Windows调试工具入门-3基本调试操作基本调试操作一、调试器命令窗口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 按钮WinDbg 命令命令 WinDbg 快捷键作用作用Debug | Run to Cursor F7CTRL + F10(仅WinDbg) 运行到光标位置。
Debug | Stop DebuggingSHIFT + F5 停止所有的调试并关闭目标。
(仅CDB/KD) CTRL+C Debug | Break CTRL +BREAK停止执行,调试器中断目标。
.restart (Restart TargetApplication)Debug | Restart CTRL + SHIFT + F5(仅User mode) 重起目标程序g (Go)Debug | GoF5 目标自由执行。
gc (Go from Conditional Breakpoint)在一次条件断点之后恢复执行。
gh (Go with Exception Handled) Debug | Go Handled Exception和g (Go)相同,但是当前异常被当作已处理。
gn (Go with Exception Not Handled) Debug | Go Unhandled Exception和g (Go)相同,但是当前异常被当作未处理。
gu (Go Up)Debug | Step Out目标运行到当前函数执行完成。
p (Step)Debug | Step Over目标执行一条指令。
如果该指令是函数调用,则这个调用被当作一步执行。
pa (Step to Address)目标运行直到到达指定的地址。
该函数中执行的每一步都会显示出来(但是不显示被调用的函数中的内容。
) pc (Step to目标运行直到遇到Next Call)下一个call 指令。
如果当前指令是call ,则这个call 会被完成并执行到下一个call 。
pct (Step to Next Call or Return)目标继续执行,直到遇到一个call 指令或者return 指令。
ph (Step to NextBranching Instruction)目标执行,直到到达任何一种分支指令,包括条件和非条件分支、call 调用、函数返回和系统调用。
pt (Step to Next Return)目标执行,直到遇到return 指令。
t (Trace)Debug | Step IntoF11 F8 目标执行一条指令。
如果该指令是一条call ,调试器跟踪到这个call 中。
ta (Trace to Address)目标执行直到指定地址。
本函数和被调用函数中的每一步都会显示出来。
tb (Trace to Next Branch)(除内核模式之外的所有模式,仅在基于x86的系统上)目标运行到下一条分支指令。
tc (Trace to Next Call)目标运行到下一条call 指令。
如果当前指令是call ,该命令会跟踪进去直到遇到另一条call 。
tct (Trace to Next Call or Return)目标运行到下一条call 指令或return 指令。
如果当前指令是call 或return ,命令会跟踪进去知道遇到另一个call 或return 。
th (Trace to Next目标执行直到遇到任意类型的分支指Branching Instruction)令,包括条件和非条件跳转、call、return和系统调用。
如果当前指令是分支指令,该命令跟踪进入直到遇到下一个分支指令。
tt (Trace to Next Return)目标运行直到遇到return指令。
如果当前指令是一条return,则跟踪进入直到另外一条return。
wt (Trace and Watch Data)目标执行,直到指定的函数执行完成。
这时会显示统计信息。
三、使用断点合理、巧妙的设置断点是软件调试中的一门艺术,好的断点能使调试工作事办功倍。
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选项,重新编译。