Windows调试工具入门-6(WinDbg内核调试常用命令2)
- 格式:pdf
- 大小:223.78 KB
- 文档页数:18
使用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是一款功能强大的调试工具,可以帮助我们更好地进行程序调试和分析。
windbg 常用命令Windbg是微软公司开发的一款用于调试Windows操作系统的强大工具。
它提供了丰富的命令和功能,可以帮助开发人员快速定位和解决软件中的问题。
本文将介绍Windbg常用命令,包括常见的调试命令、内存查看命令、线程和进程命令等。
一、常见的调试命令1. g(go):继续执行程序,直到下一个断点或异常发生。
2. t(trace):单步执行程序,逐行跟踪代码执行过程。
3. p(print):打印变量的值。
4. r(registers):查看寄存器的值。
5. bp(breakpoint):设置断点,当程序执行到指定位置时暂停。
6. bl(breakpoint list):显示已设置的断点列表。
7. bc(breakpoint clear):清除指定的断点或所有断点。
8. .restart:重新启动目标程序。
二、内存查看命令1. dt(display type):显示指定类型的结构体或变量的值。
2. dq(display quadword):显示内存中指定地址的8字节数据。
3. du(display unicode string):显示内存中以Unicode格式存储的字符串。
4. da(display ASCII string):显示内存中以ASCII格式存储的字符串。
5. db(display byte):显示内存中指定地址的一个字节数据。
6. dd(display dword):显示内存中指定地址的4字节数据。
7. dps(display pointer size):显示内存中指定地址开始的指针数组。
三、线程和进程命令1. ~(tilde):列出当前所有线程的信息。
2. ~n(tilde n):切换到第n个线程。
3. k(stack trace):显示当前线程的函数调用栈。
4. lm(list modules):显示当前进程加载的所有模块。
5. .process:切换到指定的进程上下文。
困扰我多天的问题终于在今天解决了,感觉很轻松啊!调试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。
如何手工抓取dump文件在生产环境下进行故障诊断时,为了不终止正在运行的服务或应用程序,有两种方式可以对正在运行的服务或应用程序的进程进行分析和调试。
首先一种比较直观简洁的方式就是用Wi nDbg等调试器直接attac h到需要调试的进程,调试完毕之后再det ach即可。
但是这种方式有个缺点就是执行debug ger命令时必须先b reak这个进程,执行完deb ug命令之后又得赶紧F5让他继续运行,因为被你br eak住的时候意味着整个进程也已经被你挂起。
另外也经常会由于FirstChan ce Ex cetpi on而自动break,你得时刻留意避免长时间bre ak整个进程。
所以这样的调试方式对时间是个很大的考验,往往没有充裕的时间来做仔细分析。
另一种方式则是在出现问题的时候,比如CP U持续长时间100%,内存突然暴涨等非正常情况下,通过对服务进程sna pshot抓取一个d ump文件,完成du mp之后先deatc h,让进程继续运行。
然后用wi ndbg等工具来分析这个抓取到的dump文件。
那么如何在不终止进程的情况下抓取dump文件呢?D ebugg ing T oolsfor W indow s 里提供了一个非常好的工具,a dplus.vbs。
从名字可以看出,实际上是一个v b脚本,只是对cdb调试器作的一个包装脚本。
其路径与De buggi ng To ols f or Wi ndows的安装路径相同,使用的方法也很简单,如下所示:adplu s.vbs -han g -p1234-o d:\dump其中-hang指明使用ha ng模式,亦即在进程运行过程中附加上去s napsh ot抓取一个dump文件,完成之后det ach。
目录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 内核调试什么是 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内核调试常用命令(2)接上一章继续介绍内核调试下的常用命令,这一章主要涉及内存相关、对象相关、驱动设备相关以及蓝屏Dump 相关命令。
介绍每个命令的主要作用,以及常用方式,不会涉及详细的命令参数,目的是能快速上手熟悉内核调试下的常用操作,而不是替代帮助文件。
内存相关内存操作应该是调试最常用的,比如查看内存、修改内存等。
本节介绍内核模式下常用的内存操作命令,大部分是内核模式下特有的命令,诸如db/eb/dt/s等基本内存命令则不会介绍。
!address!address命令显示内存信息,如内存范围、内存权限等。
这条命令在用户模式下也能用,而且显示的信息比较丰富。
!address命令不带参数时,显示所有内存信息。
kd>!address80800000-0026b000Usage KernelSpaceUsageImageImageName ntoskrnl.exe80a6b000-0001f000Usage KernelSpaceUsageImageImageName halacpi.dll......f51d9000-00005000Usage KernelSpaceUsageKernelStackKernelStack81827020:340.7ac......f894f000-00002000Usage KernelSpaceUsageImageImageName swenum.sysf8951000-00256000Usage KernelSpaceUsageNonPagedSystemf8ba8000-07038000Usage KernelSpaceUsageNonPagedPoolExpansionUsage表示内存用途,如内核映像、非分页内存、内核栈、会话空间等。
通过Usage就能大概了解某段内存的使用情况,也为进一步分析内存指明了方向。
!address xxxxxxxx显示指定地址的内存信息。
kd>x win32k!NtUserCreateWindowExbf8a8779win32k!NtUserCreateWindowEx=<no type information>kd>!address bf8a8779bf800000-001cf000Usage KernelSpaceUsageImageImageName\SystemRoot\System32\win32k.sys!vm!vm命令显示虚拟内存信息,查看当前虚拟内存状况、检查虚拟内存耗尽时都非常有用。
!vm4显示基本内存信息、进程虚拟内存、会话空间内存信息。
kd>!vm4***Virtual Memory Usage***Physical Memory:130938(523752Kb)Page File:\??\C:\pagefile.sysCurrent:786432Kb Free Space:780020KbMinimum:786432Kb Maximum:1572864KbAvailable Pages:105581(422324Kb)ResAvail Pages:98280(393120Kb)Locked IO Pages:80(320Kb)Free System PTEs:54462(217848Kb)Free NP PTEs:28726(114904Kb)Free Special NP:0(0Kb)Modified Pages:148(592Kb)Modified PF Pages:148(592Kb)NonPagedPool Usage:1878(7512Kb)NonPagedPool Max:32055(128220Kb)PagedPool0Usage:1416(5664Kb)PagedPool1Usage:365(1460Kb)PagedPool2Usage:376(1504Kb)PagedPool Usage:2157(8628Kb)PagedPool Maximum:64512(258048Kb)Shared Commit:940(3760Kb)Special Pool:0(0Kb)Shared Process:1644(6576Kb)PagedPool Commit:2161(8644Kb)Driver Commit:1295(5180Kb)Committed pages:20930(83720Kb)Commit limit:321906(1287624Kb)Total Private:13733(54932Kb)0340SVCHOST.EXE3395(13580Kb)019c WINLOGON.EXE1686(6744Kb)0678Explorer.EXE1684(6736Kb)01d4LSASS.EXE1672(6688Kb)0308SVCHOST.EXE870(3480Kb)03b8SPOOLSV.EXE814(3256Kb)07b4WMIPRVSE.EXE463(1852Kb)03f8MSDTC.EXE396(1584Kb)0184CSRSS.EXE385(1540Kb)0578SVCHOST.EXE358(1432Kb)01c8SERVICES.EXE354(1416Kb)06dc vmusrvc.exe264(1056Kb)0320SVCHOST.EXE263(1052Kb)02d0SVCHOST.EXE263(1052Kb)0450VMSRVC.EXE228(912Kb)0290SVCHOST.EXE210(840Kb)0470SVCHOST.EXE135(540Kb)06f0ctfmon.exe126(504Kb)04e0SVCHOST.EXE67(268Kb)0518VPCMAP.EXE58(232Kb)014c SMSS.EXE35(140Kb)0004System7(28Kb)Terminal Server Memory Usage By Session:Session Paged Pool Maximum is4096KSession View Space Maximum is49152KSession ID0@f8953000:Paged Pool Usage:0KCommit Usage:344K其中基本内存信息部分,包括物理内存大小、页文件大小、分页内存大小、非分页内存大小等,按页面数和KB 数显示。
如果驱动分配非分页内存失败,则可以检查当前的非分页内存使用情况,看当前值是不是接近最大值,所以导致分配失败。
在进程虚拟内存部分,按进程占用内存量从大到小往下排列,很容易看出最大内存占用的进程。
最后一部分是会话空间内存信息,显示每个会话的内存情况。
创建窗口、设置消息钩子等都会占用这块内存,如果创建窗口失败,则可以检查一下这块内存使用量是不是达到了最大值。
!memusage!memusage命令显示物理内存信息。
主要是通过统计PFN数据库信息,得到物理内存的情况。
P F N(Page Frame Number)表示页面帧编号,PFN数据库用来描述每个物理内存页的状态。
!memusage8显示不同类型页面的大小。
lkd>!memusage8loading PFN databaseloading(100%complete)Compiling memory usage data(99%Complete).Zeroed:1(4kb)Free:25(100kb)Standby:167451(669804kb)Modified:9709(38836kb)ModifiedNoWrite:32(128kb)Active/Valid:344756(1379024kb)Transition:2088(8352kb)Bad:0(0kb)Unknown:0(0kb)TOTAL:524062(2096248kb)!memusage命令显示更加详细的信息,包括页面对应的磁盘文件等。
lkd>!memusageloading PFN databaseloading(100%complete)Compiling memory usage data(99%Complete).Zeroed:0(0kb)Free:69(276kb)Standby:134832(539328kb)Modified:7863(31452kb)ModifiedNoWrite:15(60kb)Active/Valid:379194(1516776kb)Transition:2089(8356kb)Bad:0(0kb)Unknown:0(0kb)TOTAL:524062(2096248kb)Building kernel mapFinished building kernel mapScanning PFN database-(100%complete)Usage Summary(in Kb):Control Valid Standby Dirty Shared Locked PageTables nameffffedcb567948724007240AWE845ca22845608829040000mapped_file(002.part) 869aebd0788372038800mapped_file(GdiPlus.dll) 85160d30318041011880000mapped_file(004.part) 84d5a32042504961840000mapped_file(003.part) 851fdd483260145280000mapped_file(001.part)85cd26f01132153800000mapped_file($LogFile)86e5ca28010800000mapped_file(cimwin32.dll) 864669580240000mapped_file(vqqsdl.dll) 8475cae804920000mapped_file(msvcr90.dll)......--------2400-----0-----driver(vmnetuserif.sys) --------2400-----0-----driver(vstor2.sys)--------4000-----0-----driver(cdfs.sys)--------16800-----0-----driver(udfs.sys)--------1600-----0-----driver(PROCEXP113.SYS)--------1600-----0-----driver(VlkdKnl.sys)--------800-----0-----driver(kldbgdrv.sys)--------194736013120-----167956(Paged Pool)--------597201276-----0204(Kernel Stacks)--------5456800-----04(NonPaged Pool)Summary1632484544292378641052962563224444Total!pte!pte命令显示指定地址对应的页表项(PTE)和页目录项(PDE)。