Windows下调试工具Windbg入门

前言

Windbg简单来说就是一个Windows下对用户态/内核态的程序进行调试,以及对Core Dump文件的分析。对于Crash,资源泄露,死锁等问题的分析,Windbg是一个强有力的利器。

一、下载

微软官网提供的Windbg为windows10版本,win7下不能使用。Win7下使用Windbg需要通过Windows SDK下载,下载链接为//www.microsoft.com/downloads/en/details.aspx?FamilyID=6b6c21d2-2006-4afa-9702-529fa782d63b&displaylang=en

  • 安装

如果对windows SDK的其他内容不感兴趣,可只勾选Windbg.

Windows下调试工具Windbg入门_第1张图片

安装完成后便可以在Windows开始菜单栏中找到Windbg.

安装可能会失败,如果失败的话可以到控“制面板\程序\程序和功能“中将 Microsoft Visual C++ 2010 Redistributable卸载,即可安装成功。

二、Windows 调试中的符号表

1.关于符号表

符号表,对于vs用户来说,符号表就是vs生成的.pdb文件,比如你写了个helloword,一般会生成一个helloword.exe是执行程序,helloword.pdb就是符号表。

这些符号表,程序运行过程中没啥用,但是调试的时候有用,这里面主要记录了下面这些东西。

  1. 全局变量
  2. 局部变量
  3. 函数名以及他们实体指针的地址
  4. 帧指针表
  5. 源代码行数

调试时,必须知道调试器能够获取与调试目标相匹配的symbol files,在线调试和调试crash dump files都需要symbols。

Windows以后缀名pdb保存symbols,vs将所有symbols保存在pdb文件中。

三、调试入门

1、断点和单步调试

这个功能一般也不会用windbg来做,一般都是在开发自测过程汇总用vs来调试的,毕竟用vs方便些。

假设你已经编写如下程序

void MyFunction(long p1, long p2, long p3)

{

    long x = p1 + p2 + p3;

    long y = 0;

    y = x / p2;

}

void main()

{

    long a = 2;

    long b = 0;

    MyFunction(a, b, 5);

}

(1)用Visual studio 2015在x64、debug模式下生成一个Helloworld.exe,同时生成一个Helloworld.pdb。

(2)配置符号表

如下图,就是把你的pdb文件所在的文件夹路径,拷贝过来设置一下就好了。

Windows下调试工具Windbg入门_第2张图片

(3)用windbg打开Helloworld.exe和Helloworld.cpp(一般调试不需要源文件)

Windows下调试工具Windbg入门_第3张图片

接着就可以输入调试命令进行输入了,例如:

  1. bu HelloWorld!main

意思是在HelloWorld的main模块处设置断点

  1. g

开始运行程序

  1. 按F11进行单步调试,直到程序运行到y = x / p2将会崩溃,输出错误信息,类似这样:

(3058.3830): Integer divide-by-zero - code c0000094 (first chance)

First chance exceptions are reported before any exception handling.

This exception may be expected and handled.

HelloWorld!MyFunction+0x53:

00000001`3f2a16d3 f7bd28010000    idiv    eax,dword ptr [rbp+128h] ss:00000000`0014f648=00000000

是说发生了0除错误。

(4)!analyze -v

将会生成一堆对错误的分析。

2、调试崩溃

适用于以下场景:你的程序开发好了,在本地运行好好的,但是部署到服务器上了,崩溃了,或偶现崩溃,比较容易复现。

 

3、调试dump

适用于以下场景:你的程序开发好了,部署到服务器上了,偶现崩溃,产生了dump,很难复现。所以只能分析dump。

 

 

其他命令:

  1. bu notepad!WinMain 设置断点
  2. bl 显示已经设置的断点信息
  3. g 运行程序直到断点、崩溃或程序结束
  4. lm 显示notepad程序已经加载的模块
  5. k显示当前线程的堆栈轨迹,即函数调用结构表
  6. g 继续运行
  7. 按菜单栏的stop按钮停止调试
  8. bu ntdll!ZwWriteFile 设置新的断点
  9. bl 显示断点信息
  10. ~ 查看当前程序的所有线程
  11. ~0s

k

以上两个命令可以进入0好进程,并查看堆栈轨迹

  1. qd退出调试

 

你可能感兴趣的:(测试)