pdb 源码索引符号服务器创建过程
pdb是调试程序必不可少的东西,它保存着一个exe或dll的调试信息,对pdb进行源码索引可以快速找到软件对应该版本的代码,本文以subversion版本控制服务器进行介绍
一、需要安装的软件
- windbg,在ddk安装包中可找到
- TortoiseSVN,安装时要选上命令行工具
- ActivePerl
三个工具安装完成后要把windbg;windbg\srcsrv;TortoiseSVN\bin;Prel\bin加入到环境变量中
二、编译工程,索引PDB文件
以KFileRecovery工程为例,编译后生成exe和PDB
执行svnindex命令进行源码索引,执行命令前切保所的修改的代码已提交到svn
svnindex /source="E:\work\c++\tu\KFileRecovery" /symbols="E:\work\c++\tu\KFileRecovery\bin" /debug
source:表示源工程路径(必须是绝对路径),可以有多个,用分号分隔
symbols:表示pdb文件所在的路径(必须是绝对路径),可以有多个,用分号分隔。svnindex会查找子目录下的pdb
debug:表示输出调试信息
注:svnindex对空格支持的不好,源代码路径中不能存在空格
svnindex.cmd调用ssindex.cmd完成操作,ssindex.cmd使用Perl脚本,脚本中调用了windbg的srctool和pdbstr完成pdb文件索引,流程如下:
调用srctool -r $pdbfile,获取pdb文件中的把有源文件,处理每个文件,获取svn路径和修订版本号,写入.stream临时文件中,最后调用pdbstr把.stream写入pdb文件中
如:pdbstr -w -p:KFileRecovery -s:srcsrv -i:"C:\Users\tuxingkai\AppData\Local\Temp\index11780.stream"
注:-s选项一定要是srcsrv,不然调试器不认
下面来看一下ssindex.cmd生成的.stream文件格式
SRCSRV: ini ------------------------------------------------
VERSION=1
INDEXVERSION=2
VERCTRL=Subversion
DATETIME=Sat Mar 1 00:49:12 2014
SRCSRV: variables ------------------------------------------
SVN_EXTRACT_TARGET=%targ%\%fnbksl%(%var3%)\%var4%\%fnfile%(%var1%) //%targ%:索引时pdb文件路径,%fnbksl%表示转换'/'为'\',%fnfile%表示取路径中的文件名,%varn%表示下面souce files的各个字段,以*分隔
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 ---------------------------------------
e:\work\c++\tu\kfilerecovery\disklib\pubfun.cpp*https://tuxingkai-pc/*svn/tu/KFileRecovery/DiskLib/PubFun.cpp*3
e:\work\c++\tu\kfilerecovery\disklib\pubfun.h*https://tuxingkai-pc/*svn/tu/KFileRecovery/DiskLib/PubFun.h*3
e:\work\c++\tu\kfilerecovery\stdafx.h*https://tuxingkai-pc/*svn/tu/KFileRecovery/stdafx.h*3
e:\work\c++\tu\kfilerecovery\disklib\kdiskenum.cpp*https://tuxingkai-pc/*svn/tu/KFileRecovery/DiskLib/KDiskEnum.cpp*3
e:\work\c++\tu\kfilerecovery\disklib\kdiskenum.h*https://tuxingkai-pc/*svn/tu/KFileRecovery/DiskLib/KDiskEnum.h*3
e:\work\c++\tu\kfilerecovery\disklib\kdisk.h*https://tuxingkai-pc/*svn/tu/KFileRecovery/DiskLib/KDisk.h*3
e:\work\c++\tu\kfilerecovery\disklib\kdisk.cpp*https://tuxingkai-pc/*svn/tu/KFileRecovery/DiskLib/KDisk.cpp*3
e:\work\c++\tu\kfilerecovery\disklib\kdiskdef.h*https://tuxingkai-pc/*svn/tu/KFileRecovery/DiskLib/KDiskDef.h*3
e:\work\c++\tu\kfilerecovery\stdafx.cpp*https://tuxingkai-pc/*svn/tu/KFileRecovery/stdafx.cpp*3
e:\work\c++\tu\kfilerecovery\selectpartitiondlg.cpp*https://tuxingkai-pc/*svn/tu/KFileRecovery/SelectPartitionDlg.cpp*3
e:\work\c++\tu\kfilerecovery\resource.h*https://tuxingkai-pc/*svn/tu/KFileRecovery/resource.h*3
e:\work\c++\tu\kfilerecovery\selectpartitiondlg.h*https://tuxingkai-pc/*svn/tu/KFileRecovery/SelectPartitionDlg.h*3
e:\work\c++\tu\kfilerecovery\kfilerecoveryview.h*https://tuxingkai-pc/*svn/tu/KFileRecovery/KFileRecoveryView.h*3
e:\work\c++\tu\kfilerecovery\mainfrm.cpp*https://tuxingkai-pc/*svn/tu/KFileRecovery/MainFrm.cpp*3
e:\work\c++\tu\kfilerecovery\aboutdlg.h*https://tuxingkai-pc/*svn/tu/KFileRecovery/AboutDlg.h*3
e:\work\c++\tu\kfilerecovery\mainfrm.h*https://tuxingkai-pc/*svn/tu/KFileRecovery/MainFrm.h*3
e:\work\c++\tu\kfilerecovery\childfrm.h*https://tuxingkai-pc/*svn/tu/KFileRecovery/ChildFrm.h*3
e:\work\c++\tu\kfilerecovery\kfilerecoveryview.cpp*https://tuxingkai-pc/*svn/tu/KFileRecovery/KFileRecoveryView.cpp*3
e:\work\c++\tu\kfilerecovery\kfilerecovery.cpp*https://tuxingkai-pc/*svn/tu/KFileRecovery/KFileRecovery.cpp*3
e:\work\c++\tu\kfilerecovery\childfrm.cpp*https://tuxingkai-pc/*svn/tu/KFileRecovery/ChildFrm.cpp*3
e:\work\c++\tu\kfilerecovery\aboutdlg.cpp*https://tuxingkai-pc/*svn/tu/KFileRecovery/AboutDlg.cpp*3
SRCSRV: end ------------------------------------------------
SVN_EXTRACT_TARGET和SVN_EXTRACT_CMD是环境变量,供下面的SRCSRVTRG、SRCSRVCMD选项使用
SRCSRVTRG: 执行srctool -x从pdb源码服务器下载文件时,下载到这个目录下
SRCSRVCMD: 执行srctool -x从pdb源码服务器下载文件时,对于每个源码文件要执行的命令及命令行参数
三、查看索引后的pdb文件信息
srctool KFileRecovery.pdb
看到上面信息,表示索引成功
四、将pdb文件加入到符号服务器
执行sysmstore add /f *.* /s "E:\symserver" /t "KFileRecovery" /v "Build 1023" 把bin目录下的KFileRecovery.exe和KFileRecovery.pdb存储到符号服务器
五、配置HTTP符号服务器
符号服务器可以是UNC路径,也可以是Http路径,对于UNC路径设置共享目录,加入权限就可以访问了。下面重点说一下HTTP方式的符号服务器配置
需要软件:tomcat 6及以上版本
将符号服务器目录设置为tomcat的虚拟目录,这样就可以通过http的方式访问符号服务器
创建Symbols.xml内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<Context
docBase="E:\symserver"
reloadable="true">
</Context>
将Symbols.xml复制到tomcat\conf\Catalina\localhost目录下,Catalina\localhost不存在就新建。然后启动tomcat即可。
六、VS2005 配置
Tools->Option中选择Debugging->Symbols,配置如下:
到这里源码索引符号服务器搭建过程就完成了。
pdb 源码索引符号服务器创建过程的更多相关文章
- 源码分析netty服务器创建过程vs java nio服务器创建
1.Java NIO服务端创建 首先,我们通过一个时序图来看下如何创建一个NIO服务端并启动监听,接收多个客户端的连接,进行消息的异步读写. 示例代码(参考文献[2]): import java.io ...
- Spring源码解析 – AnnotationConfigApplicationContext容器创建过程
Spring在BeanFactory基础上提供了一些列具体容器的实现,其中AnnotationConfigApplicationContext是一个用来管理注解bean的容器,从AnnotationC ...
- OpenJDK源码研究笔记(十三):Javac编译过程中的上下文容器(Context)、单例(Singleton)和延迟创建(LazyCreation)3种模式
在阅读Javac源码的过程中,发现一个上下文对象Context. 这个对象用来确保一次编译过程中的用到的类都只有一个实例,即实现我们经常提到的"单例模式". 今天,特意对这个上下文 ...
- Spring Ioc源码分析系列--Bean实例化过程(一)
Spring Ioc源码分析系列--Bean实例化过程(一) 前言 上一篇文章Spring Ioc源码分析系列--Ioc容器注册BeanPostProcessor后置处理器以及事件消息处理已经完成了对 ...
- QT源码解析(一) QT创建窗口程序、消息循环和WinMain函数
QT源码解析(一) QT创建窗口程序.消息循环和WinMain函数 分类: QT2009-10-28 13:33 17695人阅读 评论(13) 收藏 举报 qtapplicationwindowse ...
- MyBatis 源码分析 - 映射文件解析过程
1.简介 在上一篇文章中,我详细分析了 MyBatis 配置文件的解析过程.由于上一篇文章的篇幅比较大,加之映射文件解析过程也比较复杂的原因.所以我将映射文件解析过程的分析内容从上一篇文章中抽取出来, ...
- Bytom侧链Vapor源码浅析-节点出块过程
Bytom侧链Vapor源码浅析-节点出块过程 在这篇文章中,作者将从Vapor节点的创建开始,进而拓展讲解Vapor节点出块过程中所涉及的源码. 做为Vapor源码解析系列的第一篇,本文首先对Vap ...
- Spring源码分析之`BeanFactoryPostProcessor`调用过程
前文传送门: Spring源码分析之预启动流程 Spring源码分析之BeanFactory体系结构 本文内容: AbstractApplicationContext#refresh前部分的一点小内容 ...
- Spring源码-IOC部分-容器初始化过程【2】
实验环境:spring-framework-5.0.2.jdk8.gradle4.3.1 Spring源码-IOC部分-容器简介[1] Spring源码-IOC部分-容器初始化过程[2] Spring ...
随机推荐
- python 作用域知识点整理
1.块级作用域 想想此时运行下面的程序会有输出吗?执行会成功吗? 1 2 3 4 5 6 7 8 9 10 11 12 #块级作用域 if 1 == 1: name = "lzl ...
- 006-HotSpot JVM收集器
一.概述 1.1.图解 上面有7中收集器,分为两块,上面为新生代收集器,下面是老年代收集器.如果两个收集器之间存在连线,就说明它们可以搭配使用. JVM给出了3类选择:串行收集器.并行收集器.并发收集 ...
- CDN 环境下获取用户IP方法
CDN 环境下获取用户IP方法 1 cdn 自定义header头的X-Real-IP,在后端使用$http_x_real_ip获得 proxy_set_header X-Real-IP $remote ...
- 科班学习java遇到瓶颈,每天云里雾里怎么办?
声明:这个问题困扰了我好久,今天在知乎找到了答案.知乎链接https://www.zhihu.com/question/24240982,感谢大神@Tony He的回答. 作者:Tony He链接:h ...
- win10下安装TensorFlow(CPU only)
TensorFlow安装过程 1 环境 我的安装环境:win10 + 64位 +miniconda2+miniconda创建的python3.5.5环境+pip 由于目前TensorFlow在wind ...
- mysql忽略一些错误代码
模拟的故障,在从库中新建一个库,然后主库新建一个与从库相同名字的库,然后进入下面的show Mysql从库复制故障解决 当show slave status:报错 slave_io_running:y ...
- 自动化测试管理平台ATMS(V1.0.1_7.29)下载
自动化测试管理平台ATMS(V1.0.1_7.29)下载http://automationqa.com/forum.php?mod=viewthread&tid=2582&fromui ...
- html使用笔记
1. HTML 表单内容设置最大长度:<input type="text" name="fullname" maxlength="85&quo ...
- linux命令详解之(at)--6/24
在Linux下,有两个命令可以用来作为计划任务而执行,at:一次性定时任务计划执行crontab :每天定时任务计划执行 以下仅说一下一次性任务计划执行(at)要使用一次性任务计划,linux必须要有 ...
- Linux下SSH中配置说明
SSH 协议:安全外壳协议.为 Secure Shell 的缩写.SSH 为建立在应用层和传输层基础上的安全协议. sshd服务使用SSH协议可以用来进行远程控制,或在计算机之间传送文件.而实现此功能 ...