有了从客户那里得到的dump文件就可以分析导致程序崩溃的罪魁祸首了.
必要的工具:
windbg, 以及跟系统相关的symbols. 这些都可以去微软官方网站就下载.
symbols有对应的安装包, 比如你的系统的是xp的, 你就选xp的symbols安装包. 其实这些安装里面都是一些pdb文件. 是与系统种的核心库相对应的, 如我们的系统有ntdll.dll那么安装包就可以找到ntdll.pdb文件.
1. 这里面不是所有的我们调用库都有的, 如果我们用vs2003开发项目, 里面会用到一些vs2003的库, 那么这些库对应的pdb文件就不在刚才所说的那个安装包中, 而是在vs2003的安装包中, 安装完vs2003后就可以找到对应symbols文件, 如我的就在C:/Program Files/Microsoft Visual Studio .NET 2003/SDK/v1.1/symbols. 另外还有一些没有包含进去是在微软官方网站:http://msdl.microsoft.com/download/symbols
我们可以在用windbg分析duimp文件时, 将所有的这些symbols路径都设置到symbols的路径中:
C:/WINDOWS/Symbols;C:/WINDOWS/system32;C:/Program Files/Microsoft Visual Studio .NET 2003/SDK/v1.1/symbols;http://msdl.microsoft.com/download/symbols;
当然除了设置上面的公用的symbols之外, 我们还要设置我们自己项目对应的symbols路径, 只要加在后面就可以了.
2. 设置完symbols之后就要设置source code的路径, 这里面只用设置我们项目对应的source code的路径就可以.
3. 接下来设置image文件就是我们的exe和dll的路径.
好了, 接下来我们就可以加载dump文件去分析了.
通过windbg的file菜单open dump file来打开dump文件.
我们为了让windbg直接定位到崩溃代码行, 需要执行一个命令:
.ecxr
注意这个命令的第一字符是一个点, 这个点是绝对不能少的, 否则windbg不能解析这个命令的.
当你敲回车的时候, 我们会兴奋地发现我们地source code被弹出来了, 并且最左边有个绿色的小三角指向了我们的某一代码行, 呵呵, 我们找到了罪魁祸首.
到此我们的分析就结束了, 研究一下怎么出的错, 解决它. 单独的看那行代码如果你还不能找出错误根由的话, 还有其他几个东西可以帮助你就是调用堆栈, 这个东西太重要了, 我就不说它能干啥, 你可能比我更清楚. 另外还有就是你可以当前堆栈里面的变量.
但是事情往往没有我们想象的那么顺利. 当我们敲回车的时候发现, 没有看到我们预想的source code 弹出来, 而是windbg的工作区域更新了一些register的值.
怎么回事, 郁闷. 然后看windbg的帮助, 无意中发现有个命令可以看堆栈即使当我们执行了 .ecxr命令后. 它就是 k 命令, 对, 只有一个字母.
k
为什么没有弹出source code崩溃行, 暂时不知道, 留待以后解决. 重要的是我们找到一个可以查看堆栈的方法.
还有另外一个很重要的分析命令:
!analyze -v
他会自动分析当前加载的程序的崩溃的代码。
上面提到的symbol一定要和exe是一致的,也就是pdb文件一定是编译那个exe版本时候生成的。否则不能分析出错的代码,甚至分析出来的调用栈也是错误的。因此当你在release一个版本的时候,最好和对应的pdb一起保存起来,当然还有源代码,保持对应关系。一旦出现程序崩溃,我们可以用对应的dump文件,pdb文件,源代码来分析。但是如果因为版本管理的混乱,导致不知道exe和pdb的对应的关系,我们还有一个工具来检测我们找到的pdb是不是和exe是一致的。这个工具是和windbg一起安装到你的机器的,是命令行工具,因此启动cmd,然后cd到你的exe所在的目录,然后使用命令:
symchk my.exe /s C:pathtomy.pdb
上面的my.exe替换成你的exe,c:pathtomy.pdb替换成对应的pdb文件的目录。如果失败就会输出:
SYMCHK: my.exe FAILED – my.pdb mismatched or not found
SYMCHK: FAILED files = 1
SYMCHK: PASSED + IGNORED files = 0
这个告诉你exe和pdb文件不匹配。
如果成功的话:
SYMCHK:
FAILED files = 0
SYMCHK: PASSED + IGNORED files = 1
版权所有,禁止转载. 如需转载,请先征得博主的同意,并且表明文章出处,否则按侵权处理.