前言
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.
安装可能会失败,如果失败的话可以到控“制面板\程序\程序和功能“中将 Microsoft Visual C++ 2010 Redistributable卸载,即可安装成功。
二、Windows 调试中的符号表
1.关于符号表
符号表,对于vs用户来说,符号表就是vs生成的.pdb文件,比如你写了个helloword,一般会生成一个helloword.exe是执行程序,helloword.pdb就是符号表。
这些符号表,程序运行过程中没啥用,但是调试的时候有用,这里面主要记录了下面这些东西。
- 全局变量
- 局部变量
- 函数名以及他们实体指针的地址
- 帧指针表
- 源代码行数
调试时,必须知道调试器能够获取与调试目标相匹配的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文件所在的文件夹路径,拷贝过来设置一下就好了。
(3)用windbg打开Helloworld.exe和Helloworld.cpp(一般调试不需要源文件)
接着就可以输入调试命令进行输入了,例如:
意思是在HelloWorld的main模块处设置断点
开始运行程序
- 按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。
其他命令:
- bu notepad!WinMain 设置断点
- bl 显示已经设置的断点信息
- g 运行程序直到断点、崩溃或程序结束
- lm 显示notepad程序已经加载的模块
- k显示当前线程的堆栈轨迹,即函数调用结构表
- g 继续运行
- 按菜单栏的stop按钮停止调试
- bu ntdll!ZwWriteFile 设置新的断点
- bl 显示断点信息
- ~ 查看当前程序的所有线程
- ~0s
以上两个命令可以进入0好进程,并查看堆栈轨迹
- qd退出调试
转载自原文链接, 如需删除请联系管理员。
原文链接:Windows下调试工具Windbg入门,转载请注明来源!