游戏开始进行第二次封闭测试,这次参与人数较多,随之而来的便是无数的崩溃dump。虽然在自动构建流程中已经对PDB和EXE按版本号进行了保存,但由于构建操作人员手动修改构建号,出现多个版本对应相同版本号的问题,以及BUG单填写人以基线版本号而非真实版本号提交的情况,经常浪费开发人员的时间和精力去找对应的PDB,降低了崩溃解决的响应速度。所以非常有必要建立一套自动化方案,得到dump文件后启动WinDbg进行分析时能够自动获取对应的PDB和源代码,WinDbg就提供了这样一套方便实用的工具。
1. 建立源代码索引
WinDbg提供了一套用于管理pdb对应的源代码的工具,位于其安装目录的srcsrv下,对VSS、SVN、CVS、Perforce提供了支持,分别对应vssindex.cmd、svnindex.cmd、cvsindex.cmd、p4index.cmd这四个perl脚本。其实,ssindex.cmd才是具体实现,它根据传入的版本控制系统标识,调用对应的perl module。
svnindex.cmd通过/source和/symbols参数来指定源代码目录和PDB目录,/debug可输出处理的详细信息,/user和/pass提供svn账户和密码。PDB文件中有一节专门用于存放源代码文件列表及处理命令,可通过pdbstr -r -p:PdbFileName -s:srcsrv查看。
svnindex.cmd /debug /source="E:\CodeBase_SVN\Client\trunk\tools\CutSceneEditor" /symbols="E:\CodeBase_SVN\Client\trunk\bin\Release\CutSceneEditor" /user="user" /pass="pwd"
在执行上面命令前,确保Perl和Subversion已经被安装且设置了PATH环境变量。该命令将提取source code的服务器路径和当前Revision,然后写入PDB。下面是通过pdbstr获取的信息:
上面输出是经过格式化的,原始信息可以通过srctool -n查看:
可以看出,原始代码路径后面跟了一条svn cat指令,由于没有指定sourcepath,所以%targ%缺省为当前路径("C:\Program Files\Debugging Tools for Windows (x64)\srcsrv")。
2. 创建符号服务器
所谓符号服务器,最简单的形式就是文件共享服务器。我们使用symstore命令,将1中产生的pdb添加到一个文件共享服务器上,如:
symstore.exe add /f "E:\CodeBase_SVN\Client\trunk\bin\Release\CutSceneEditor\*.pdb" /s "\\server.com\pub\Symbols" /t "CutSceneEditor" /v "Build 4171" /c "fix memory leak"
该命令会根据PDB的signature和age产生一个GUID,并将PDB放置于以改GUID为名字的目录下:
当debug时,将UNC路径添加到_NT_SYMBOL_PATH中(如:_NT_SYMBOL_PATH=CACHE*F:\Symbols;SRV*http://msdl.microsoft.com/download/symbols;SRV*\\server.com\pub\Symbols),调试器会自动到指定的符号服务器上去搜索对应的pdb文件。
symstore大大简化了符号的版本管理问题,关于它的详细介绍可参考symstore介绍。
值得注意的是,symstore没有锁机制,并不支持多人同时操作。实际情况中,也只有自动构建时才会做此操作。
3. 使用WinDbg分析Dump文件
我们在代码中加入发生异常写MiniDump的功能,在程序崩溃时产生dump文件。在使用WinDbg分析dump文件时,需要设置Symbol File Path和Source File Path,也可以直接设置环境变量_NT_SYMBOL_PATH和_NT_SOURCE_PATH。在设置_NT_SOURCE_PATH时使用"SRV*CachePath"将表示启用代码提取功能,执行svn cat写入到CachePath指定的目录,否则将使用原始路径。此后,通过点击Call Stack中的函数调用便会触发从svn读取对应代码的操作(通常会有一个安全警告窗口弹出)。
对于使用WinDbg进行调试在此就不多讲了,推荐一本不错的书《Advanced Windows Debugging》。
参考资料
[1] Source Indexing and Symbol Servers: A Guide to Easier Debugging
[2] Source Server Helps You Kill Bugs Dead In Visual Studio 2005