参考:
1、51cK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6e0K9r3g2F1h3r3W2S2L8$3I4G2L8X3M7I4z5e0M7$3i4K6u0r3M7$3!0#2M7X3y4W2d9h3&6V1k6i4S2Q4y4h3k6X3L8%4u0s2K9i4b7`.
篇(二)提到,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行
可以看出,这里的var2
、var3
、var4
便是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源文件拉取地址格式:
示例:ed5K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6J5j5i4N6Q4x3X3g2Y4K9i4c8Z5N6h3u0#2M7$3g2J5j5$3!0F1N6r3g2F1N6q4)9J5k6h3y4G2L8g2)9J5c8X3g2U0M7$3!0#2M7$3q4Q4x3V1k6s2K9i4c8u0L8X3c8W2P5r3g2J5i4K6u0r3k6X3b7K6j5K6V1&6y4r3t1$3x3K6p5J5y4K6l9^5k6o6j5%4x3e0g2S2x3K6b7I4y4U0M7$3k6r3p5@1x3o6l9I4y4X3b7#2k6e0y4U0k6g2)9J5c8W2m8S2j5$3E0S2k6$3g2Q4x3V1k6@1L8$3!0D9M7#2)9J5c8X3W2F1M7%4c8S2L8r3I4Q4x3X3g2H3M7K6p5`.
格式:6ebK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6J5j5i4N6Q4x3X3g2Y4K9i4c8Z5N6h3u0#2M7$3g2J5j5$3!0F1N6r3g2F1N6q4)9J5k6h3y4G2L8g2)9J5c8W2)9J5y4h3q4U0j5$3!0#2L8Y4c8Q4x3U0g2Q4x3V1k6Q4x3U0g2b7M7X3!0B7k6h3y4@1i4K6t1#2i4K6u0r3i4K6t1#2b7$3!0E0L8h3W2@1d9f1c8Q4x3U0g2Q4x3V1k6Q4x3U0g2b7j5i4c8Z5i4K6t1#2i4K6u0r3i4K6t1#2c8X3W2D9k6g2)9J5y4b7`.`.
gogs源文件拉取地址格式:
示例:6e3K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3N6G2k6%4y4Q4x3X3g2E0P5h3N6A6N6q4)9J5k6h3y4G2L8g2)9J5c8V1#2&6c8%4u0G2N6i4m8Q4x3V1k6y4P5g2m8J5L8$3A6W2j5%4c8Q4x3V1k6J5j5i4N6Q4x3V1k6V1z5e0q4V1k6e0x3I4z5r3x3@1x3r3t1^5j5e0V1#2j5e0j5@1x3e0j5&6j5U0f1^5x3U0c8W2y4h3y4X3y4o6b7I4j5e0f1K6k6e0f1K6i4K6u0r3c8r3I4D9i4K6u0r3c8r3I4D9i4K6u0W2K9l9`.`.
格式:http://地址/%Project%/raw/%CommitID%/%Path%/%File%
gitlab源文件地址格式:
示例:63eK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3N6A6N6r3I4S2j5W2)9J5k6h3#2&6k6$3W2@1i4K6u0W2j5$3&6Q4x3V1k6E0P5h3q4U0j5$3!0#2N6q4)9J5c8V1#2&6f1s2u0G2K9X3g2U0N6q4)9J5c8Y4u0S2N6#2)9J5c8X3y4T1y4K6x3$3k6X3j5&6j5e0j5K6y4o6q4U0z5o6M7$3j5K6b7K6y4e0S2U0y4h3f1@1y4$3b7H3j5$3c8S2k6o6t1#2x3o6R3@1x3X3c8Q4x3V1k6p5L8r3I4Q4x3V1k6p5L8r3I4Q4x3X3g2U0M7s2l9`.
格式: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
"0a9K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6F1k6h3#2G2i4K6u0V1M7r3y4Q4x3V1k6K6N6X3&6Q4x3V1k6i4L8%4u0C8i4K6u0r3c8s2g2E0M7p5c8W2L8h3!0Q4x3V1k6p5N6h3#2H3c8r3g2E0L8#2)9J5c8Y4y4@1k6r3q4X3P5q4)9J5k6h3S2Q4y4o6l9K6z5l9`.`."
-
-
non
-
interactive >
"C:\Windows\system32\svn\Work\DumpDemo\DumpDemo\stdafx.h\38\stdafx.h"
cmd
/
c svn.exe cat
"0a9K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6F1k6h3#2G2i4K6u0V1M7r3y4Q4x3V1k6K6N6X3&6Q4x3V1k6i4L8%4u0C8i4K6u0r3c8s2g2E0M7p5c8W2L8h3!0Q4x3V1k6p5N6h3#2H3c8r3g2E0L8#2)9J5c8Y4y4@1k6r3q4X3P5q4)9J5k6h3S2Q4y4o6l9K6z5l9`.`."
-
-
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>
/
/
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)
[注意]看雪招聘,专注安全领域的专业人才平台!
最后于 2020-10-28 14:45
被comor编辑
,原因: 格式修改