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卸载,即可安装成功。
符号表,对于vs用户来说,符号表就是vs生成的.pdb文件,比如你写了个helloword,一般会生成一个helloword.exe是执行程序,helloword.pdb就是符号表。
这些符号表,程序运行过程中没啥用,但是调试的时候有用,这里面主要记录了下面这些东西。
调试时,必须知道调试器能够获取与调试目标相匹配的symbol files,在线调试和调试crash dump files都需要symbols。
Windows以后缀名pdb保存symbols,vs将所有symbols保存在pdb文件中。
这个功能一般也不会用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模块处设置断点
开始运行程序
(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
将会生成一堆对错误的分析。
适用于以下场景:你的程序开发好了,在本地运行好好的,但是部署到服务器上了,崩溃了,或偶现崩溃,比较容易复现。
适用于以下场景:你的程序开发好了,部署到服务器上了,偶现崩溃,产生了dump,很难复现。所以只能分析dump。
其他命令:
k
以上两个命令可以进入0好进程,并查看堆栈轨迹