首页
社区
课程
招聘
[原创]搭建自己的符号服务器(三)——Git篇
发表于: 2020-10-28 14:43 9087

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

2020-10-28 14:43
9087

参考:
1、https://github.com/ShenXiaolong1976/sourceIndex_forGit

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

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

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

命令:gitIndex.cmd <sourceCodeDir> <pdbFilesDirPath>
示例:

注意:源码路径最后不要加\!
接下来,使用symstore命令将符号添加至符号服务器

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

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

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

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

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

重点在第7、8行

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

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

首先看,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便有了大概的思路。

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

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

github源文件拉取地址格式:
示例:https://raw.githubusercontent.com/ecsousa/GitIndexer/fd3c994b6312708d6715a341676da40016d5e3ce/Package/tools/install.ps1
格式:https://raw.githubusercontent.com/%account%/%Project%/%CommitID%/%Path%/%File%

gogs源文件拉取地址格式:
示例:http://gogs.mygit.com/MyGroup/MyProject/raw/d91de318c40b8a95a64169b5824e5cf441a53e53/Dll/Dll.h
格式:http://地址/%Project%/raw/%CommitID%/%Path%/%File%

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必须添加文件名。

错误之处,多多指正!

 
 
gitIndex.cmd "D:\VC++ Work\DumpDemo" "D:\VC++ Work\DumpDemo\Release\"
gitIndex.cmd "D:\VC++ Work\DumpDemo" "D:\VC++ Work\DumpDemo\Release\"
symstore add /f "D:\VC++ Work\DumpDemo\Release\*.pdb" /s "D:\sym" /t "DempDemo" /v "1.0.0.0" /o
symstore add /f "D:\VC++ Work\DumpDemo\Release\*.pdb" /s "D:\sym" /t "DempDemo" /v "1.0.0.0" /o
set localGitRepo=D:\VC++ Work\DumpDemo
set localGitRepo=D:\VC++ Work\DumpDemo
SRCSRV: ini ------------------------------------------------
VERSION=1
INDEXVERSION=2
VERCTRL=Subversion
DATETIME=Tue Sep  8 15:32:07 2020
SRCSRV: variables ------------------------------------------
SVN_EXTRACT_TARGET=%targ%\%fnbksl%(%var3%)\%var4%\%fnfile%(%var1%)
SVN_EXTRACT_CMD=cmd /c svn.exe cat "%var2%%var3%@%var4%" --non-interactive > "%svn_extract_target%"
SRCSRVTRG=%SVN_extract_target%
SRCSRVCMD=%SVN_extract_cmd%
SRCSRV: source files ---------------------------------------
d:\work\dumpdemo\dumpdemo\stdafx.h*https://nemo-pc/*svn/Work/DumpDemo/DumpDemo/stdafx.h*38
d:\work\dumpdemo\dumpdemo\dump.h*https://nemo-pc/*svn/Work/DumpDemo/DumpDemo/dump.h*38
d:\work\dumpdemo\dumpdemo\dumpdemo.cpp*https://nemo-pc/*svn/Work/DumpDemo/DumpDemo/DumpDemo.cpp*38
d:\work\dumpdemo\dumpdemo\targetver.h*https://nemo-pc/*svn/Work/DumpDemo/DumpDemo/targetver.h*38
d:\work\dumpdemo\dumpdemo\stdafx.cpp*https://nemo-pc/*svn/Work/DumpDemo/DumpDemo/stdafx.cpp*38
SRCSRV: end ------------------------------------------------
SRCSRV: ini ------------------------------------------------
VERSION=1
INDEXVERSION=2
VERCTRL=Subversion
DATETIME=Tue Sep  8 15:32:07 2020
SRCSRV: variables ------------------------------------------
SVN_EXTRACT_TARGET=%targ%\%fnbksl%(%var3%)\%var4%\%fnfile%(%var1%)
SVN_EXTRACT_CMD=cmd /c svn.exe cat "%var2%%var3%@%var4%" --non-interactive > "%svn_extract_target%"
SRCSRVTRG=%SVN_extract_target%
SRCSRVCMD=%SVN_extract_cmd%
SRCSRV: source files ---------------------------------------
d:\work\dumpdemo\dumpdemo\stdafx.h*https://nemo-pc/*svn/Work/DumpDemo/DumpDemo/stdafx.h*38
d:\work\dumpdemo\dumpdemo\dump.h*https://nemo-pc/*svn/Work/DumpDemo/DumpDemo/dump.h*38
d:\work\dumpdemo\dumpdemo\dumpdemo.cpp*https://nemo-pc/*svn/Work/DumpDemo/DumpDemo/DumpDemo.cpp*38
d:\work\dumpdemo\dumpdemo\targetver.h*https://nemo-pc/*svn/Work/DumpDemo/DumpDemo/targetver.h*38
d:\work\dumpdemo\dumpdemo\stdafx.cpp*https://nemo-pc/*svn/Work/DumpDemo/DumpDemo/stdafx.cpp*38
SRCSRV: end ------------------------------------------------
SVN_EXTRACT_TARGET=%targ%\%fnbksl%(%var3%)\%var4%\%fnfile%(%var1%)
SVN_EXTRACT_CMD=cmd /c svn.exe cat "%var2%%var3%@%var4%" --non-interactive > "%svn_extract_target%"
SVN_EXTRACT_TARGET=%targ%\%fnbksl%(%var3%)\%var4%\%fnfile%(%var1%)
SVN_EXTRACT_CMD=cmd /c svn.exe cat "%var2%%var3%@%var4%" --non-interactive > "%svn_extract_target%"
cmd /c svn.exe cat "https://nemo-pc/svn/Work/DumpDemo/DumpDemo/stdafx.h@38" --non-interactive > "C:\Windows\system32\svn\Work\DumpDemo\DumpDemo\stdafx.h\38\stdafx.h"
cmd /c svn.exe cat "https://nemo-pc/svn/Work/DumpDemo/DumpDemo/stdafx.h@38" --non-interactive > "C:\Windows\system32\svn\Work\DumpDemo\DumpDemo\stdafx.h\38\stdafx.h"
@echo GIT_EXTRACT_TARGET=%%targ%%\gitsrc\%%fnbksl%%^(%%var3%%^)\%%var2%%\%%fnfile%%^(%%var1%%^)
@echo GIT_EXTRACT_CMD=cmd /c gitFetchFile.cmd "%%var2%%:%%var3%%" "%%GIT_EXTRACT_TARGET%%"
@echo GIT_EXTRACT_TARGET=%%targ%%\gitsrc\%%fnbksl%%^(%%var3%%^)\%%var2%%\%%fnfile%%^(%%var1%%^)
@echo GIT_EXTRACT_CMD=cmd /c gitFetchFile.cmd "%%var2%%:%%var3%%" "%%GIT_EXTRACT_TARGET%%"
::@echo off
::my local git repo setting.
set localGitRepo=D:\VC++ Work\testDump
if not defined localGitRepo (
echo localGitRepo environment is not defined.
echo define localGitRepo environment variable point to local git repo.
echo e.g. set localGitRepo=D:\sourceCode\jabberGit129
goto :eof
)
 
if not exist "%~dp2" md "%~dp2"
git.exe -C "%localGitRepo%" show "%~1" > "%~fs2"
 
echo type "%~fs2"
type "%~fs2"
::@echo off
::my local git repo setting.
set localGitRepo=D:\VC++ Work\testDump
if not defined localGitRepo (
echo localGitRepo environment is not defined.
echo define localGitRepo environment variable point to local git repo.
echo e.g. set localGitRepo=D:\sourceCode\jabberGit129
goto :eof
)
 
if not exist "%~dp2" md "%~dp2"
git.exe -C "%localGitRepo%" show "%~1" > "%~fs2"
 
echo type "%~fs2"
type "%~fs2"
PS D:\> git -C "D:/VC++ Work/DumpDemo" log                                                                             
commit 1fb32b03b9c6650b68a09737a50b2fe05bf4b98f (HEAD -> master)
……
commit 3f7a2efaf30840782475fab9841bdbc66397da39
……
commit 37841d6912ba17ecb2ede0cd93eb98ba2b5d4d6a
……
commit e66724029f6a8e2017ef9bdc7d97bebc39b395e6
……
commit 00d50d5368376dcea4e1eff99835d4163642cb4c
PS D:\> git -C "D:/VC++ Work/DumpDemo" show "37841d69:DumpDemo/DumpDemo.cpp"                                            // DumpDemo.cpp : <B6><A8><D2><E5><BF><D8><D6><C6><CC><A8><D3><A6><D3><C3><B3><CC><D0><F2><B5><C4><C8><EB><BF><DA><B5>
<E3><A1><A3>
//
 
#include "stdafx.h"
#include <malloc.h>
#include "dump.h"
 
int _tmain(int argc, _TCHAR* argv[])
{
        ::SetUnhandledExceptionFilter(UnhandledExceptionFilterEx);
 
        char* buf = NULL;
        buf = (char*)malloc(10);
        if (buf)
        {
                memcpy(buf, "123456789", sizeof("123456789"));
                free(buf);
                buf = NULL;
        }
        memcpy(buf, "123456789", sizeof("123456789"));
 
        return 0;
}
PS D:\> git -C "D:/VC++ Work/DumpDemo" log                                                                             
commit 1fb32b03b9c6650b68a09737a50b2fe05bf4b98f (HEAD -> master)

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2020-10-28 14:45 被comor编辑 ,原因: 格式修改
上传的附件:
收藏
免费 2
支持
分享
最新回复 (7)
雪    币: 4
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2

如果使用了git服务器,可以直接将服务器地址写入pdb文件中,使用curl下载文件来实现源码的拉取。下面是一些主流git服务器的源码拉取地址。
----- 个人浅见: 不建议把服务器地址写入pdb文件中,但可以把服务器地址写入到gitFetchFile.cmd文件(随同发布gitFetchFile.cmd),以提高灵活性和可用性。 要不然万一哪天符号服务器改名了,则这批pdb文件就没法使用了,如果是写入到 gitFetchFile.cmd 文件中的,则可以简单手工修改一下 gitFetchFile.cmd 就行了。

我就经历过符号服务器改名的情况,后来只好自己又写了一个脚本来再次更新pdb文件 (也很麻烦,因为还要欺骗windbg说pdb校验和没有改变,或者设置允许加载不严格匹配的符号文件--这个不推荐),当然这个功能我是集成到windbg中去one-click自动更新的,否则手动更新更麻烦。

最后于 2022-7-21 11:09 被shenxiaolong编辑 ,原因: 错别字
2022-7-21 11:07
1
雪    币: 58
活跃值: (1130)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
shenxiaolong 如果使用了git服务器,可以直接将服务器地址写入pdb文件中,使用curl下载文件来实现源码的拉取。下面是一些主流git服务器的源码拉取地址。-----&nbsp;个人浅见:&nbsp ...

有不有办法在现有的符号里面添加github access token? 

最后于 2022-7-23 17:35 被yangya编辑 ,原因:
2022-7-23 17:35
0
雪    币: 5291
活跃值: (4768)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
github  太卡~~
2022-7-24 18:05
0
雪    币: 0
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
~时光荏苒 github 太卡~~
可以用下面一个轻量级的 sourceIndex for git : ( source index 快,基本上瞬间完成,但是分析符号时要慢一点儿,要拉下整个git commit )
https://github.com/shenxiaolong-code/sourceIndexLight_forGit
2023-11-28 11:25
0
雪    币: 0
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
yangya shenxiaolong 如果使用了git服务器,可以直接将服务器地址写入pdb文件中,使用curl下载文件来实现源码的拉取。下面是一些主流git ...
个人不建议在pdb中不要放入任何有可能变动的内容,只放最基础的内容 : 文件路径和版本号
有可能变动的内容,一律放在 gitFetchFile.cmd 这个文件中,以防万一那些东西变动了(比如服务器地址变了,文件目录结构变了),终端用户可以通过简单地本地更新 gitFetchFile.cmd 来适应这种更改.
2023-11-28 11:29
0
雪    币: 58
活跃值: (1130)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
shenxiaolong 如果使用了git服务器,可以直接将服务器地址写入pdb文件中,使用curl下载文件来实现源码的拉取。下面是一些主流git服务器的源码拉取地址。-----&nbsp;个人浅见:&nbsp ...
怎么更新PDB文件?我现在就是这个问题,PDB里面的符号路径变了(服务器地址变了)。
2024-6-6 23:17
0
雪    币: 58
活跃值: (1130)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
xlshen 个人不建议在pdb中不要放入任何有可能变动的内容,只放最基础的内容 : 文件路径和版本号 有可能变动的内容,一律放在 gitFetchFile.cmd 这个文件中,以防万一那些东西变动了(比如服务器 ...
问题我现在有PDB了,windbg调试的时候从拉取source的时候的路径跟服务器上的source code路径不一样。我需要更新PDB来指向正确的source code路径。
2024-6-6 23:19
0
游客
登录 | 注册 方可回帖
返回
//