说在前面: 微软符号服务器地址http://msdl.microsoft.com/download/symbols, 但是你手动在浏览器里面输入是访问不到的,他只提供给调试程序进行下载
1、方法1: 使用vs进行下载,当然必须是vs2003以后的版本,通过attach到一个进程中或者启动一个程序进行调试,然后打开模块列表窗口,在列表中每一个模块进行右键,即可进行下载符号
方法2: 使用windbg进行下载,同样是attach或run一个程序,设置一下符号路径,然后使用
.reload
或者.reload /f /v ntoskrnl.exe (这个试过好像不可以,具体请高手指出原因)
当然也可以强制进行符号加载 使用
ld * 加载当前模块中所有的模块符号
或者 ld ntdll (加载指定模块)
方法3: 采用symchk.exe 来进行加载(优点:在不调用dl的情况就可对dll进行符号加载,防止dll符号文件遗漏加载的问题)
symchk /r c:\windows\system32 /s SRV*c:\symbols\*http://msdl.microsoft.com/download/symbols
这个的意思是对c:\windows\system32下的exe和dll进行递归加载符号
目前不太清楚,怎么指定只对特定文件进行单独加载符号文件,请高手指出
方法4: 自己写下载符号文件的程序(当然如果你对windows的整个调试机制比较熟悉,可以采用,但是个人觉得没那个必要,毕竟微软提供了工具让你使用了)
建立 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