Heath's Blog

There is no end, it is just the beginning! - A Game Developer's Notes

Window调试中的符号文件与源代码管理

    游戏开始进行第二次封闭测试,这次参与人数较多,随之而来的便是无数的崩溃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获取的信息:

     Image(9)

     上面输出是经过格式化的,原始信息可以通过srctool -n查看:

     Image(10)

     可以看出,原始代码路径后面跟了一条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为名字的目录下:

     Image8

    当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

posted on 2012-03-26 23:10 Heath 阅读(3834) 评论(2)  编辑 收藏 引用 所属分类: Game Development

Feedback

# re: Window调试中的符号文件与源代码管理 2012-03-27 09:40 tb

分享的没错   回复  更多评论   

# re: Window调试中的符号文件与源代码管理 2012-03-28 11:43 fseraph

恩,我们还用Python搞了一套自动解析Dump,统计崩溃函数,同时输出报表的工具,这样就很方便了。不过Google有一个完整的开源解决方案,叫breakpad。以前做的时候不知道有这东西。  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理