环境:
1. windows XP sp3 x86
2. windbg 6.11
3. svn, version 1.6.16 (r1073529) – 必须为英文版 ,因为 windbg 的 perl 解析是针对英文输出来的,如果 svn 显示为中文,可以重命名 svn 目录下的 share 目录下的 locale 目录 ( 不知道还有其它配置方法没 )
4. vc6.0
5. perl
假设以下目录 :
<WINDBG_DIR>: windbg 的安装路径
<WINDBG_SRCSVR_DIR>: windbg 安装路径下的 srcsvr 路径
<SVN_EXE_DIR>: svn 的按照路径
<VC_DIR>: vc6.0 下包含 MSPDB60.DLL 的路径 一般为 : X:/Program Files/Microsoft Visual Studio/Common/MSDev98/Bin
<SRC_DIR>: 源代码路径,该路径下可以被 svn check/update 等
<SYMBOL_DIR>: 符号路径, pdb 文件所在目录
<SYMBOL_ON_SERVER>: 服务器上符号路径
操作步骤:
进行 index 前必须要求源代码与 pdb 匹配,且本地源代码与对应 svn 版本源代码一致
1. 设定环境变量 PATH :必须保证包含了 windbg 的安装目录, windbg 下的 srcsrv 目录, svn 程序的目录, vc6.0 的包含了 mspdb60.dll 的目录
2. 运行 svnindex /debug /symbols=<SYMBOL_DIR> /Source=<SRC_DIR> /User=xx /Pass=xx
SYMBOL_DIR 与 SRC_DIR 最好是绝对路径,否则可能导致 svn 的输出与 pdb 文件中的源文件路径不匹配
/user/pass 为 svn 服务器的用户名与密码信息 ( 建议不提供此信息 ) ,此处如果不提供则使用 svncache 的信息 .
如果提供了 user 信息,则 index 时会将此 user 与 pass 嵌入到 pdb 文件的 sourceinformation 中,可以通过 srctool 与 pdbstr 看到每个文件的参数信息
3. 检查运行结果,运行 srctool.exe <SYMBOL_DIR>/xxx.pdb 查看 pdb 文件的 index 结果
如没有文件被 index ,则单独运行 svn info –R <SRC_DIR> ,看输出的 path 字串后的路
径与运行 srctool <SYMBOL_DIR>/xxx.pdb –r 结果的路径是否一致 (pdb 文件中的路径
貌似总是绝对路径 ) ,如果不一致,则调整 svn 的参数路径,一致后,将这个路径更改为 svnindex 的 SRC_DIR ,如果还是不能成功,则查看具体的 perl 文件,在找原因吧
具体的生成的源文件信息也可以通过 pdbstr –r –p:<SYMBOL_DIR>/xxx.pdb –s:srcsrv 查看
4. pdb 中的源文件信息被正确的 index 后,可以通过 symstore 工具,将执行文件, dll , pdb
等文件组成符号服务器信息
如果需要区别私有与公有符号文件,则需要用 binplace.exe 或者 pdbcopy.exe 处理公有私
有符号文件 (pdbcopy 的要求一个特殊的 mspdb60.dll ,找不到 )
symstore add /F <SYMBOL_DIR> /S <SYMBOL_ON_SERVER> /t myapp /r /z pri
windbg 加载时需要设定 !sympath srv*<SYMBOL_ON_SERVER> 与 !srcpath srv*<SYMBOL_ON_SERVER> ,如果 index 过程中嵌入了 user 信息而此信息已无效,则从 svn 提取源文件会失败 ( 没验证 ) ,如果没有 user 信息,默认使用 svncache 的信息
附本机上运行的 bat 文件 :
makessindex.bat:
set PATH=%PATH%;D:/Program Files/Debugging Tools for Windows/srcsrv;D:/Program Files/Microsoft Visual Studio/Common/MSDev98/Bin
svnindex /debug /symbols="D:/myapp/publish" /Source="D:/myapp/src"
运行 srctool 验证 :
@echo off
echo srctool.exe 检查 ...
srctool.exe publish/debug/myapp.pdb >srcchk.txt
srcchk.txt
echo pdbstr.exe 检查 ...
pdbstr.exe -r -p:publish/debug/myapp.pdb -s:srcsrv >pdbstrchk.txt
pdbstrchk.txt
makesymbol.bat:
@echo off
set PATH=%PATH%;D:/Program Files/Debugging Tools for Windows
symstore add /F D:/myapp/myapp.* /S d:/symbols/pri /t mainapp /r /z pri
通过 UNC 与 http 的访问
将前面已经 index 处理好了的 pdb 文件用
Walk <SYMBOL_DIR>/*.pdb srctool –x –d:<UNC_SRC_DIR>
提取到指定的 UNC_SRC_DIR 中
通过 walk 调用 cv2http.cmd ,修改 pdb 文件中的 index 信息 ( 如果需要保留版本关联的 index ,则这里修改 pdb 文件的副本 )
Walk <SYMBOL_DIR>/*.pdb cv2http.cmd MY_UNC_ALIAS //xl/pri_walk/src
//xl/pri_walk/src 为代码解压的路径,即 <UNC_SRC_DIR>
如果在 debugger 的 srcsrv.ini 文件中的变量中设定了 MY_UNC_ALIAS 的值,则覆盖这里指定的 UNC_SRC_DIR 值
由于用的是 svn 版本, cv2http.pl 产生的 HTTP_EXTRACT_TARGET 不是适合 svn 的版本,所以需要修改 cv2http.pl ,这里复制了 cv2http.cmd 与 pl ,改写了适合 svn 的版本
Pl 文件修改位置 :
#s/^SRCSRVTRG=.*/$alias=$url/nHTTP_EXTRACT_TARGET=%$alias%//%var2%//%var3%//%var4%//%fnfile%(%var1%)/nSRCSRVTRG=%http_extract_target%/i;
s/^SRCSRVTRG=.*/$alias=$url/nHTTP_EXTRACT_TARGET=%$alias%//%var3%//%var4%//%fnfile%(%var1%)/nSRCSRVTRG=%http_extract_target%/i;
完成 pdb 文件 index 的修改后,按照与上面 svn 相同的步骤 symstore 等等