符号服务器 作用,[原创]搭建自己的符号服务器(三)——Git篇

篇(二)提到,VS SDK自带的Debugger并不支持git,而git已经逐渐取代svn成为最流行的版本控制工具,但VS2019或SDK2004仍旧没有gitindex。可能原因:

git是分布式版本系统,源码服务器地址设置为本地的话,不好固定;

设置为远端的话,不同的git服务器源码获取路径不尽相同,如gitlab、gitee、github、gogs等都不一样,导致没法统一。如果Debugger支持gitindex,可能也会是gitlabIndex、githubIndex之类的。

那么,如果我们将需求降低,仅仅是为了分析dump,使用本地工作目录也未尝不可。而且,已经有人实现了这样的GitIndex——sourceIndex_forGit(见参考1),下面根据前人贡献分析并实操。

0x00 sourceIndex_forGit

首先看,sourceIndex_forGit是如何使用的,参考工程README.md。

从github下载并解压至文件夹,如“C:\GitIndex”

将“C:\GitIndex”添加至PATH环境变量

1、源文件索引

命令:gitIndex.cmd

示例:

注意:源码路径最后不要加\!

接下来,使用symstore命令将符号添加至符号服务器

2、dump分析

首先打开C:\GitIndex下的gitFetchFile.cmd,设置localGitRepo

打开windbg,设置源码保存路径D:\src,符号路径:D:\sym,打开Dump文件,输入!analyze -v便可以自动下载符号和源码了。

0x01 GitIndex

下面讨论如果不看sourceIndex_forGit,如何自己实现一个GitIndex。

1、GitIndex要实现什么

由前两篇,我们要实现源文件索引及符号服务器添加,利于dump的“自动化”分析,后者使用symstore命令即可完成,前者才是讨论的重点。

在pdb文件中添加什么信息

用什么方式从源码路径提取我们需要的版本文件

2、SVN源码获取方式

由SVN篇,我们再分析一下svnIndex到底向pdb文件中添加了什么。

重点在第7、8行

SVN_EXTRACT_TARGET:从源码服务器下载对应的文件后的保存位置,暂不讨论;

SVN_EXTRACT_CMD:怎么从源码服务器下载对应源码:cmd /c svn.exe cat "%var2%%var3%@%var4%" --non-interactive

保存到哪儿:> "%svn_extract_target%"

可以看出,这里的var2、var3、var4便是SRCSRV: source files ---------------------------------------和SRCSRV: end ------------------------------------------------中间每行使用星号隔开的字符串。实际执行时(srctool的输出)

SVN_EXTRACT_CMD这个是我们重点讨论并实现的。

3、GIT源码获取方式

首先看,git如何获取对应版本的源码文件。

在sourceIndex_forGit中可以找到,获取源码方式(第63、64行)

即,cmd /c gitFetchFile.cmd "%%var2%%:%%var3%%" "%%GIT_EXTRACT_TARGET%%"

使用批处理,将两个参数传入,实现了git源码的获取。

打开gitFetchFile.cmd

最后调用的是:git.exe -C "%localGitRepo%" show "%~1" > "%~fs2"

即:git.exe -C 源码目录 show 版本:文件名

测试下:

可以说,搞清了git命令是如何提取对应版本文件的,设计自己的GitIndex便有了大概的思路。

0x02 GitIndex设计初始化srcstr

枚举pdb文件将每个pdb文件中的源码信息提取出来,

将源码信息和源码路径比较,如果是源码文件夹内的,获取git版本信息,字符串拼接至srcstr

将srcstr回写入pdb文件中

继续处理下一个pdb文件

所有pdb文件处理完毕,调用symstore将pdb文件添加至符号服务器

gitIndex.cmd通过批处理方式完成了以上步骤(除了最后一步),附件是使用C++完成的一个GitIndex.exe,目的是充分理解这个过程,使用方式和gitIndex.cmd一致。

0x03 其他Web git服务器的源码拉取方式

如果使用了git服务器,可以直接将服务器地址写入pdb文件中,使用curl下载文件来实现源码的拉取。下面是一些主流git服务器的源码拉取地址。

1、github

github源文件拉取地址格式:

示例:https://raw.githubusercontent.com/ecsousa/GitIndexer/fd3c994b6312708d6715a341676da40016d5e3ce/Package/tools/install.ps1

格式:https://raw.githubusercontent.com/%account%/%Project%/%CommitID%/%Path%/%File%

2、gogs

gogs源文件拉取地址格式:

示例:http://gogs.mygit.com/MyGroup/MyProject/raw/d91de318c40b8a95a64169b5824e5cf441a53e53/Dll/Dll.h

格式:http://地址/%Project%/raw/%CommitID%/%Path%/%File%

3、gitlab

gitlab源文件地址格式:

示例:http://gitlab.mygit.cn/myaccout/MyProject/raw/cb736ff9a6341c876c4358c5e47d0cdad250842d/Dll/Dll.cpp

格式:http://地址/%count%/%Project%/raw/%commitID%/%Path%/%File%

注意,使用curl直接下载可能不会成功,需要在gitlab中设置“access tokens”,在curl加上header选项

curl.exe --header "PRIVATE-TOKEN: 你的token" 你的url -O

拉取命令:curl 地址 -O [文件名]

如果使用cmd可以不添加文件名,使用Powershell必须添加文件名。

错误之处,多多指正!

最后于 2020-10-28 14:45

被comor编辑

,原因: 格式修改