现在的位置: 首页 > 综合 > 正文

WinDbg 入门指导(3)-WinDbg中常用的功能以及设置

2018年04月06日 ⁄ 综合 ⁄ 共 1895字 ⁄ 字号 评论关闭

WinDbg的功能

调试器扩展DLL

所谓的扩展指的是一些DLL,你可以用在调试器内调用并且执行一些自定义的命令。这些DLL必须实现一些特定的函数,并且要满足一些需求,这样才能被认为是一个扩展DLL。在下一篇文章内,我们将会了解到怎样写出一个扩展DLL。所谓的bang(!)命令就是从你的扩展DLL内执行的命令。注意这些DLL是被加载到调试器的进程空间内。

内存转储文件

你可以使用转储功能来取得一个进程的快照信息。一个mini-dump通常比较小,除非你使用了全内存的minidump(.dump /mf)。通常能够转储句柄信息也是很有用的,命令是 .dump/mfh。一个小型转储通常包含了所有的线程的堆栈以及一个已被加载的模块的列表。一个全转储包含了更多的信息,比如进程的堆。

崩溃转储分析

如果你的windows系统当机,那么它就会在一个文件中转储物理内存中的数据,以及所有的进程信息。可以通过Control Panel ->System->Advanced->’Startup and Recovery’来配置。你也可以首先把WinDbg配置成为一个即时调试器,然后就可以取得任意一个非正常终止的进程的转储(.dump)。注意,从转储文件中分析出代码中的bug往往是一个复杂费力的过程。

使用以下的步骤来分析一个转储文件:

1)      WinDbg内,通过 File->’Open Crash Dump’, 指向转储文件。

2)      WinDgb会给你显示应用程序崩溃之时所执行的指令。

3)      正确设置你的符号文件目录和源代码目录。如果你不能够匹配正确的符号文件,想要弄清楚程序的逻辑是非常困难的。如果你能够把符号文件匹配到正确版本的源代码,这是就应该很容易分析出Bug原因。注意,私有符号文件含有行号信息并且会盲目的显示你源代码中的对应行而不进行任何的检查;如果你的源码版本不对,那么你就不能够看到匹配汇编代码的正确源码。如果你仅仅有公有的符号文件,你会看到最后一个被调用的函数(栈上的)。

注意调试驱动或者托管代码是与此有很大不同的。参考《The Windows 2000 Device Driver Book》来获得调试设备驱动的技术。

WinDbg的常用设置

符号文件与文件夹

如果想更有效的调试,你需要符号文件。符号文件可以是老式的COFF格式或者就是PDB格式。PDB就是程序数据库文件并且包含了公有符号。这些调试器内,你可以使用一系列的地址来让调试器寻找已经加载的二进制文件的符号。

操作系统的符号文件一般存储在%SYSTEMDIR%Symbols目录。驱动程序的符号文件(.DBG.PDB)一般存储在和驱动文件(.sys 文件)相同的目录下。私有符号文件包含的信息包括:函数,局部以及全局变量,以及用来把汇编代码和源代码关联起来的行号信息;对于客户来说,符号文件一半是公有的-这些文件仅仅包括公有成员。

你可以通过File-Symbol File Path来设置符号文件目录,或者使用 .sympath命令。如果想要添加到网络上符号文件的引用,添加以下的内容到你的 .sympath

SRV*downstream_store*http://msdl.microsoft.com/download/symbols

使用的命令就是:

.sympath+ SRV*c:/tmp*http://msdl.microsoft.com/download/symbols

 

C:/tmp就是download_store,所需要的符号文件会被下载存储至此。注意这个符号服务器仅仅开放了公有的符号文件。

当调试器把一个二进制文件(DLLexe)的时候,他会检查比如文件名,时间戳以及校验值。如果你有符号信息,你就可以在调用栈上看到函数名和他们的参数。如果二进制文件和PDB文件都来自于你自己的应用程序,你就可以看到比如私有函数,局部变量以及类型这类额外的信息。

源代码路径

你可以通过File->Source File Path来设置源码路径,或者使用.srcpath命令。如果你设置了代码的路径,当你调试的时候,调试器会通过PDB文件的行号信息来显示相匹配的源代码。

断点,跟踪

·         通过bp命令或者工具栏上的断点图片来设置软断点。

·         通过代码比如DbgBreakPoint() 或者 KdBreakPoint()来设置硬断点。

·         在扩展DLL中使用跟踪函数DbgPrint, KdPrint, OutputDebugString 来把输出显示在WinDbg的输出窗口中。

上一篇-WinDbg入门教程(2)-各种调试场景介绍

抱歉!评论已关闭.