一、symbol store的需求分析:
1、我们现在的调试环境严重依赖开发人员自己使用的开发环境,缺点在于其他人要进行调试要么搭建一个同样的环境,严重地占去大家不必要花费的工作时间,进一步带来的问题是各个版本的源代码流落各处,易出问题,要么就只有交给原开发人员,同样带了严重的交流时间开销,而且不仅原开发人员的工作会被打断,而且需求人还要在这个过程中等待。
2、即便是开发人员自己面对不同版本的调试,也是一个令人挠头的事情,即便是现在我们保存了map文件,但是调试的便利与效率,相信也是大家希望进一步提高的。
如何改变现有的调试难的问题,并且提高大家的调试效率,应该是一个需要考虑的问题。
二、搭建symbol store的调研:
使用过MS的调试符号服务器的同事,大概已经领略到调试符号服务器的高效率。经过调研,可以确认我们可以搭建自己的调试符号服务器,相关事项罗列如下:
1、如何设置你的VC Project
在VC的Project Settings对话框上,选择你要设置的Project(如果有多个Poject的话),选择你要设置的build选项(一般为Win32 Release),在Link页上,Category选择General,然后选择Generate debug info,或者Category选择Debug,然后选择Debug info,选择Microsoft format。
这样如果生成不了pdb,或者生成的pdb有错误,同样在VC的Project Settings对话框上,选择你要设置的Project(如果有多个Poject的话),选择你要设置的build选项(一般为Win32 Release),在C/C++页上,Category选择General,在Debug info中,选择C7 Compatible或Program Database
你原有的优化等选择都不必改变,这样设置会产生一个pdb文件,就是我们所需要的调试符号了,这样会导致你的exe或dll等生成模块会多出一定数目的字节,不必担心,这是链接器在你的模块里加入了对这个pdb的一个指引,并没有任何调试信息包含到你的模块。
2、如何变绝对路径为相对路径
前面讲到在你的模块里有一个对pdb的指引,有一点比较讨厌,就是这个指引使用了绝对路径——你build这个模块时的绝对路径,我们要做得像MS的一样,去除这个绝对路径,MS提供一个工具来做这件事,那就是Binplace,它甚至可以让你为使用你的接口的客户提供受限的符号文件,具体可参考MS的帮助文档。
binplace -a -x -s %stripped_path% -n %full_path% %bin_path% -r %RootDestinationPath% -:DEST %ClassPath%
使用时请替换%stripped_path %、%full_path %、%bin_path%、%RootDestinationPath%、%ClassPath%
3、如何添加调试符号到仓库
请首先安装windbg,然后使用如下脚本:
set path=C:/Program Files/Debugging Tools for Windows;%path%
symstore add /r /p /f %YOUR_PDB_PATH%/*.* /s %SYMBOL_STORE_PATH% /t "ivtdriver"
使用时请替换%YOUR_PDB_PATH %,与% SYMBOL_STORE_PATH %
4、如何引用仓库中的调试符号
设置环境变量:
_NT_SYMBOL_PATH=srv*DownstreamStore*SYMBOL_STORE_PATH*http://msdl.microsoft.com/download/symbols
使用时,请注意替换DownstreamStore,与SYMBOL_STORE_PATH
这样,在以后使用windbg调试程序或分析dmp文件时,就可以自动取得我们自己的调试符号了。
三、建立symbol store的步骤:
1、 确定symbol store的路径,申请服务器空间,用WEB是个好主意,用共享文件夹也不错
2、 修改现有VC Project的设置,生成pdb(请不要丢了map设置,没准儿还有用)
3、 应用binplace工具,让pdb文件中的绝对路径变相对路径
4、 应用symstore工具,将pdb文件添加到symbol store
四、应用symbol store的步骤:
1、设置环境变量_NT_SYMBOL_PATH,引用我们自己的symbol store
五、总结:
结合我前面提出的daily build script,大家现在可以在里面提供自动向symbol store添加pdb的脚本,这样一定会很爽,呵呵。