前篇大致说了dump分析时符号文件的原理,以及符号服务器的方便之处,本篇实操一把,以版本控制系统svn为例。
其实,windbg目录下已经为我们准备好了处理开发过程中符号的各种工具,支持多种版本控制工具,svn只是其中的一种,可以到安装目录C:\Program Files (x86)\Windows Kits\10\Debuggers\x64\srcsrv
中查看。Debugger内置支持的版本控制系统包括:
但不支持git!
系统:Windows 7 x64
软件:
0、环境变量添加:
1、搭建SVN服务器或使用现有SVN服务器;
2、将工程添加到svn并提交、编译工程,注意按顺序来,(以Win32 Release为例)
源文件索引是为了向pdb文件中添加svn信息,包括svn仓库地址、版本等。索引之前,记得提交代码。编译成功后,就可以对生成的pdb文件进行索引添加了。
索引使用svnindex.cmd
批处理,调用了perl脚本。命令格式如下
svnindex /debug /source=源码路径 /symbols=符号文件路径
其中/debug
是显示详细信息。不知道什么原因,开始时,这条命令没有起作用:zero file indexed?
可以看到,对一个pdb文件进行了索引。如果目录中有多个pdb,将会对所有的pdb文件进行索引;如果指定了某一个pdb文件,将只索引指定的。
那么,在pdb中添加了哪些信息呢?使用文本工具打开pdb,可以看到下面一段
也可以使用srctool
工具查看索引后的pdb文件
可以看出,svnindex
将svn仓库地址和当前版本号,以及如何组合这些信息存储到了pdb中,寻找源码时的操作已经在srctool
的输出中显示了。
svn.exe cat "仓库文件地址@版本" --non-interactive > "本地路径"
可以复制svn.exe cat "仓库文件地址@版本"
到命令行执行测试。
保存pdb到符号服务器并不是简单的拷贝过去便可以了,必须遵循Debugger的保存格式,这样windbg才能自动在符号服务器中准确查找pdb文件。简单一点,必须使用symstore
工具来上传pdb文件。
使用symstore
命令将pdb文件保存到自己的“符号服务器”中,可以是本地的一个文件夹,也可以是远端的网络路径。命令示例
一些格式:
执行示例
至此,源码之前已经提交到了版本服务器,符号文件经过处理也已经保存到了符号服务器(本地文件夹),接下来看使用。
打开Windbg,由于另一台电脑连不上本地的svn服务器和符号服务器路径,这里直接在本机打开windbg,为了避免直接在原来的路径查找源码,将源码工程文件夹名字做了重命名。
设置windbg符号和源码路径,这里符号路径即“符号服务器”。
新建D:\Src
文件夹,设置源码路径
打开dump文件(运行一下《篇一》生成的exe便有了),输入!analyze -v
,便。。。。弹出了一个对话框,说明成功了
点“Yes”,对话框具体内容自行研究。。继续。。等一会儿(源码下载中)
分析完毕。打开设置的源码路径,会发现
确实自动下载源码了。
总结:通过源码索引及符号服务器,在只简单设置windbg的情况下,不用拉源码,不用看版本,自动准确完成了dump分析。
git篇。。。等一下
C:\Users\Nemo>svnindex
/
debug
/
source
=
"D:\Work\DumpDemo\DumpDemo"
/
symbols
=
"D:\Work\DumpDemo\Release"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
ssindex.cmd [STATUS] : Server ini
file
: C:\Program Files (x86)\Windows Kits\
8.1
\
Debuggers\x64\srcsrv\srcsrv.ini
ssindex.cmd [STATUS] : Source root : D:\Work\DumpDemo\DumpDemo
ssindex.cmd [STATUS] : Symbols root : D:\Work\DumpDemo\Release
ssindex.cmd [STATUS] : Control system : SVN
ssindex.cmd [STATUS] : SVN Executable : svn.exe
ssindex.cmd [STATUS] : SVN Revision : <N
/
A>
ssindex.cmd [STATUS] : SVN Username : <N
/
A>
ssindex.cmd [STATUS] : SVN Password : <N
/
A>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
ssindex.cmd [STATUS] : Running... this will take some time...
ssindex.cmd [STATUS] : Processing svn.exe properties output ...
ssindex.cmd [INFO ] : ... indexing D:\Work\DumpDemo\Release\DumpDemo.pdb
ssindex.cmd [INFO ] : ... wrote C:\Users\Nemo\AppData\Local\Temp\index109B5.stream to D:\Work\DumpDemo\Release\DumpDemo.pdb ...
C:\Users\Nemo>svnindex
/
debug
/
source
=
"D:\Work\DumpDemo\DumpDemo"
/
symbols
=
"D:\Work\DumpDemo\Release"
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
ssindex.cmd [STATUS] : Server ini
file
: C:\Program Files (x86)\Windows Kits\
8.1
\
Debuggers\x64\srcsrv\srcsrv.ini
ssindex.cmd [STATUS] : Source root : D:\Work\DumpDemo\DumpDemo
ssindex.cmd [STATUS] : Symbols root : D:\Work\DumpDemo\Release
ssindex.cmd [STATUS] : Control system : SVN
ssindex.cmd [STATUS] : SVN Executable : svn.exe
ssindex.cmd [STATUS] : SVN Revision : <N
/
A>
ssindex.cmd [STATUS] : SVN Username : <N
/
A>
ssindex.cmd [STATUS] : SVN Password : <N
/
A>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
ssindex.cmd [STATUS] : Running... this will take some time...
ssindex.cmd [STATUS] : Processing svn.exe properties output ...
ssindex.cmd [INFO ] : ... indexing D:\Work\DumpDemo\Release\DumpDemo.pdb
ssindex.cmd [INFO ] : ... wrote C:\Users\Nemo\AppData\Local\Temp\index109B5.stream to D:\Work\DumpDemo\Release\DumpDemo.pdb ...
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
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
C:\Windows\system32>srctool D:\Work\DumpDemo\Release\DumpDemo.pdb
[d:\work\dumpdemo\dumpdemo\stdafx.h] cmd: 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"
[d:\work\dumpdemo\dumpdemo\dump.h] cmd: cmd
/
c svn.exe cat
"https://nemo-pc/svn/Work/DumpDemo/DumpDemo/dump.h@38"
-
-
non
-
interactive >
"C:\Windows\system32\svn\Work\DumpDemo\DumpDemo\dump.h\38\dump.h"
[d:\work\dumpdemo\dumpdemo\dumpdemo.cpp] cmd: cmd
/
c svn.exe cat
"https://nemo-pc/svn/Work/DumpDemo/DumpDemo/DumpDemo.cpp@38"
-
-
non
-
interactive >
"C:\Windows\system32\svn\Work\DumpDemo\DumpDemo\DumpDemo.cpp\38\dumpdemo.cpp"
[d:\work\dumpdemo\dumpdemo\targetver.h] cmd: cmd
/
c svn.exe cat
"https://nemo-pc/svn/Work/DumpDemo/DumpDemo/targetver.h@38"
-
-
non
-
interactive >
"C:\Windows\system32\svn\Work\DumpDemo\DumpDemo\targetver.h\38\targetver.h"
[d:\work\dumpdemo\dumpdemo\stdafx.cpp] cmd: cmd
/
c svn.exe cat
"https://nemo-pc/svn/Work/DumpDemo/DumpDemo/stdafx.cpp@38"
-
-
non
-
interactive >
"C:\Windows\system32\svn\Work\DumpDemo\DumpDemo\stdafx.cpp\38\stdafx.cpp"
D:\Work\DumpDemo\Release\DumpDemo.pdb:
5
source files are indexed
-
302
are
not
.
C:\Windows\system32>srctool D:\Work\DumpDemo\Release\DumpDemo.pdb
[d:\work\dumpdemo\dumpdemo\stdafx.h] cmd: 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"
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2020-10-10 16:07
被comor编辑
,原因: 修改超链接