软件调试系列之Windbg探究

 

转载于:http://blog.csdn.net/cuiweican/article/details/7352828

套用80/20原则,我们大部分时候只使用了Windbg20%功能,当然我没有精确统计过,但也相差无几,Windbg的上百条功能命令中,我们平时工作也就是使用了其中的几组命令而己,为了减少大家学习的负担,我准备在实战中讲解Windbg的常用功能。

那么,让我们开始Windbg实战之旅吧

现在,测试部江湖告急,报告说他无意中发现软件Sample.exe崩溃了。

“很奇怪,我明明做了详细的测试,怎么在他那里出错了呢?我的电脑上怎么没错?”,莫慌,咱有神器Windbg呢,看看它是如何帮你排扰解难的吧。

在测试环境下,一般按照以下步聚来调试,

1. 安装调试器

2. 将调试器与被调试对象建立调试关系

3. 配置调试器相关信息参数

4. 查看软件各线程调试栈,局部变量等信息

5. 以事实作依据,假设分析验证,总结Bug产生原因

一:安装调试器

WindbgMS提供的一款免费调试器,可在这个地址下载:http://msdn.microsoft.com/zh-cn/windows/hardware/gg463009/。双击安装包按提示安装即可。

二:将调试器与被调试对象建立调试关系

因为软件可能是偶尔崩溃的,很可能是不可重现的,冒失地重启软件进行Bug重现是不成熟的行为,所以在调试Sample.exe时,我们不能在Windbg中启动Sample.exe来重现Bug进行调试,因为这样就需要关闭Sample.exe,如果Bug是概率性出现的,我们将需要大量的精 力来重现Bug

这里我们有两种方法在不退出Sample.exe的情况下来与它建立调试关系。

1.离线调试:

抓取Sample.exedump文件,Windbg通过调试Dump文件来分析Bug原因,抓取Dump文件的方法,以后再进行详细讨论,对于Win7操作系统,一种简单的办法就是在任务管理器的进程选项卡中右击需要生成Dump文件的进程名,在弹出菜单上选择创建转储文件即可,如下图所示:


生成Dump文件后,可能通过Widnbg菜单栏中的File->Open Crash Dump菜单项来打开Dump文件。


2.在线调试:

WindbgAttach Sample.exe上,在调试完毕后,执行Detach。 具体方法选择File菜单中的Attach to a Process菜单项,在弹出的进程选择框中选择待调试的进程即可。

有一点需要注意的,一个进程只能被一个调试器调试,若当前我们正在用Visual Stdio调试某进程,这里如果我们想用Windbg查看该进程信息,我们需要在进程选择框上勾选上Noninvasive 这里,Windbg就只能看而不能控制了,也就是不能对进程进行单步调试了。

不论使用哪种方法,均可以保持Sample.exe不退出。与离线调试相比,在线调试有一个优点,即可以通过控制命令对进程进行单步调试。所以如果我们能接触到软件出错现场,一般情况下我们都会进行在线调试.

三配置调试器相关信息参数

这里有两点信息需要设置

a:符号文件(PDB文件)路径。

b:源代码路径。

1:设置符号文件路径:

在调试时,我们通常需要知道当前软件的运行状态,如当前出错线程的调用栈是什么,出错的函数名,及该函数的参数和局部变量值是什么。仅仅看到如下的截图1就来分析,调试Bug是很不靠谱,也是很不负责任的行为。


截图1

但是exe程序本身并不包含以上提到的信息,正因为如此,当将Windbg 挂进Sample.exe,使用命令kbn显示调用栈后,我们看到的是一个无营养的调用栈。如下截图2所示


截图2

因为这些符号信息被单独地编译到了一个以pdb为扩展名的文件中,同样,exe程序调用的kernel32,ntdll等操作系统dll,和MFC42D.dll, MSVCRTD.dllMFC dll也有相对应的pdb文件,通过在Windbg的菜单File->Symbol File Path指定符号文件所在路径后,即可查看完整的调用栈信息。如截图3所示


截图3

值得说明的是Visual Stdio系列的编译器生成的pdb一般在Debug目录下,MFC类库的Pdb一般在C:\Windows\System32, 操作系统的pdb可在这个网址http://msdn.microsoft.com/zh-cn/windows/hardware/gg463028下载,或使用命令srv*C:\MyLocalSymbols*http://msdl.microsoft.com/download/symbols在线引用。

另外如果你的编译器是VC6.0则需要将/pdbtype:sept改为/pdbtype:con, pdbtype定义在 Project Settings->Link选项卡中的 Project Options栏中。否则pdb文件中将不包含如自定义结构体,类等信息。

另外特别需要关注的一点是被调试的进程一定要与pdb文件相匹配,切不可想当然的认为程序代码没有变化过而临时编译生成一个pdb文件强制加载进行调试。如果pdb文件不匹配,那么显示的调用栈,局部变量信息可能就不正确,这会将你的调试过程引向歧途,在我周围发生过太多这种事情,明明只要加载匹配的pdb就能解决的问题,却因为使用了错误的pdb而浪费了太多的调试时间。也正因为这样,pdb文件你应该当宝贝一样的收藏着,后文将具体介绍如何建立pdb服务器,使windbg能自动地通过exe进程的版本自动地找到对应的pdb文件。

2:设置源代码路径:

在调试过程中,很显然只看调用栈或变量值是不够的,因为我们需要知道代码的具体实现,毕竟我们达不到只看函数名就知道该函数的实现的境界,同样,可以通过设置源代码目录,这样当调试具体函数时,windbg会打开对应的源代码,方便调试。在Windbg的菜单File->Symbol File Path指定符号文件所在目录路径后,当定位到具体的函数时,Windbg会在源文件窗口显示对应的源代码。


截图4

如以上截图4,右边命令行窗口当前正在调试CSampleDlg::OnCrash函数,左边源文件窗口则自动显示对应的源代码。

四:调试分析

因为测试部发现的Sample.exe是属于崩溃类型的Bug,这些类型的Bug将于后面的文章作专题简绍,敬请期待。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值