[转]搭建高效的symbols服务器

建立 Symbols服务器

建立Symbols Server最简单和方便的办法是使用网络共享路径,典型的,我们会在一台服务器上,依Symbols的类型建立多个路径:

\\symbols_server\ReleaseSymbols

\\symbols_server\TempSymbols

\\symbols_server\WinSymbols

其中ReleaseSymbols用于保存所有产品正式发布版本的symbols,这个目录中的pdb文件是不能删除的,TempSymbols用于保存非正式版本(例如测试阶段)的pdb文件,把它们分开保存,是因为pdb文件比较大,如果磁盘空间不够,就可以删除一些TempSymbols中的文件来节约空间。第三个目录WinSymbols用于存储各种windows版本系统本身的symbols。

对于ReleaseSymbols和TempSymbols目录应该是可控的,即一般设置管理员可写,其它人只读,通常由管理员在编译机编译完后同时更新其pdb文件。WinSymbols可以设置所有人可读写。

 

设置调试器Symbols路径

WinDBG、VC.Net及以上版本都可以通过设置环境变量指定Symbols路径,并都能根据环境变量设置自动去微软服务器拉取window系统symbols。右键我的电脑—〉“属性”—〉“高级”—〉“环境变量”—〉“系统变量”,新建两个环境变量:

_NT_SYMBOL_PATH=srv*\\symbols_server\WinSymbols*http://msdl.microsoft.com/download/symbols

_NT_ALT_SYMBOL_PATH=cache*c:\symbols;\\symbols_server\ReleaseSymbols;\\symbols_server\TempSymbols;\\symbols_server\WinSymbols

这样设置后,调试器首先会到_NT_ALT_SYMBOL_PATH指定的共享路径中去寻找pdb文件,并把找到的文件缓存到c:\symbols目录下,下次访问时就不用到共享目录中查找,这样可以提高速度。当在_NT_ALT_SYMBOL_PATH中找不到时会查看路径_NT_SYMBOL_PATH接着自动从微软官方网站下载windows系统的pdb文件,并缓存到共享目录\\symbols_server\WinSymbols中,缓存的好处是当其它人下载相同pdb文件时就直接从共享目录拉取,不用再跳到微软网站拉取。

注意设置以上变量后第一次使用Windbg或者VS调试时,因为要下载windows系统的pdb文件,可能要等待一段时间(Windbg会在命令行窗口右下角显示“BUSY”状态,但也有可能不显示状态,VS在状态栏会显示Loading symbols for XXX),并且pdb文件都相对比较大,视网速快慢可能要等待十几分钟到几个小时。另外在测试中发现,WinDbg下载symbols的速度比VS快得多。

如果要经常使用VC.Net及以上版本,上面的设置会有些问题,因为如果有一些dll没有symbols,这时VS每次进入调试状态时都会试图到微软网站查找相应的pdb文件,导致启动调试的速度很慢,因此最好的方法是在windbg的菜单“File”->“Symbol File Path...”填入cache*c:\symbols;\\bobdeng-pc\ReleaseSymbols;\\bobdeng-pc\TempSymbols;\\bobdeng-pc\WinSymbols;srv*\\bobdeng-pc\WinSymbols*http://msdl.microsoft.com/download/symbols

而对VS.Net及以上版本,在“Tools”—〉“Options”—〉“Bebugging”—〉“Symbols”面板中,逐一添加pdb路径\\bobdeng-pc\ReleaseSymbols、\\bobdeng-pc\TempSymbols和\\bobdeng-pc\WinSymbols,在“Cache symbols from server...”中填入c:\symbols。然后仅仅在需要用VS打开dmp文件定位Crash时才添加Windows系统Symbols路径:http://msdl.microsoft.com/download/symbols,当调试完后可以去掉该项选中状态使其失效。或者使用symchk工具下载symbols,见后面《附注:手工下载windows symbols的方法》

 

配置pdb文件编译输出目录

常常一个产品包含许多模块,为方便pdb管理,可以设置编译时统一输出symbol到一个的目录,例如Debug版本输出到pdbDebug,Release版本输出到pdb目录。在VC6.0下可以通过“工程属性”-〉“Link”-〉“Project Options”手工修改输出路径,VS.Net类似也可以指定输出目录。

 

同步PDB文件到Symbols服务器

pdb文件同步可以使用windbg安装目录下的symstore.exe命令行工具,为方便操作,可以在pdb文件输出目录建立两个批处理文件,例如

新建批处理文件UpdateTemp.bat,用于同步该目录下所有的pdb文件到服务器共享目录\\symbols_server\TempSymbols,内容如下:

"C:\Program Files\Debugging Tools for Windows (x86)\symstore.exe" add /r /f "./*.*" /s \\symbols_server\TempSymbols /t "MyProduct" /v "Temp"

@PAUSE

类似的,建立另一个批处理文件UpdateRelease.bat,同步pdb文件到服务器共享目录\\symbols_server\ReleaseSymbols

 

开发人员配置编译生成的本地symbols路径

并非所有编译的pdb都同步到symbols服务器上,为方便开发者自己调试,还需要配置本机的pdb文件路径,对于windbg,可以在菜单“File”->“Symbol File Path...”填入编译时的pdb输出目录,多个目录用;隔开。

使用VS时,在菜单“Tools”—〉“Options”—〉“Bebugging”—〉“Symbols”面板中填入编译时的pdb输出目录。

 

 

附注:手工下载windows symbols的方法

如果不想等到调试时才下载,也可用通过windbg自带的symchk.exe工具下载windows系统的symbols,或者某个dmp文件所有相关模块的symbols,并且通过这个工具下载速度也会更快一些,具体方法如下:

1. 下载dmp文件所有相关模块的symbols,缓存到共享路径,便于其它人快速下载。

"C:\Program Files\Debugging Tools for Windows (x86)\symchk.exe" /id c:\MyApplication.dmp /s SRV*\\symbols_server\WinSymbols\*http://msdl.microsoft.com/download/symbols

 

2. 下载某个已运行进程所有相关模块的symbols,缓存到共享路径,便于其它人快速下载。

"C:\Program Files\Debugging Tools for Windows (x86)\symchk.exe/ie qq.exe /s SRV*\\symbols_server\WinSymbols\*http://msdl.microsoft.com/download/symbols

 

3. 下载某个exe/dll文件对应的symbols,例如user32.dll,输入命令行:

"C:\Program Files\Debugging Tools for Windows (x86)\symchk.exe" c:\windows\system32\user32.dll /s SRV*c:\symbols\*http://msdl.microsoft.com/download/symbols

 

4. 下载整个目录下(例如system32)所有模块的symbols:

"C:\Program Files\Debugging Tools for Windows (x86)\symchk.exe" /r c:\windows\system32\ /s SRV*c:\symbols\*http://msdl.microsoft.com/download/symbols

posted @ 2012-08-13 21:01  小皮球  阅读(1022)  评论(0编辑  收藏  举报