SymStore (symstore.exe) 是用于创建符号存储的工具。它被包含在Windows调试工具包中。

SymStore按照某种格式存储符号,使得调试器可以通过时间戳、映像大小(对于.dbg或可执行文件)、签名和寿命(.pdb文件)来查找符号。 使用符号存储而不是常规的符号存储格式的好处是,所有符号都可以在同一个服务器上进行存储或引用,而调试器不需要知道具有哪些产品对应的符号。

注意,不同版本的.pdb符号文件(例如共有和私有符号)不能保存在相同的符号服务器中,因为他们具有相同的签名和寿命。

SymStore事务

每个对SymStore的调用都被记录为事务。有两种不同的事务:添加和删除。

当创建符号存储时,一个称为"000admin"的目录会在服务器根目录下被创建。000admin 为每个事务都包含一个文件,和日志文件server.txthistory.txt一样。server.txt 文件包含当前服务器上的所有事务的列表。history.txt 文件包含所有历史事务,按时间排序。

每次SymStore存储或移除符号文件时,都会创建一个新的事务号。然后,一个以事务号为名字的文件会在000admin中创建。文件中包含所有在该事务中添加到符号存储的文件或指针地列表。如果某个事务被删除,SymStore会读取它的事务文件来决定哪些文件和指针需要删除。

add 和del 选项用来指定是否进行事务添加或删除。在添加操作中包含/p 选项表示添加一个指针;忽略掉/p指定添加实际的符号文件。

也可以通过分来的两个步骤来创建符号存储。第一步,使用SymStore 和/x 选项来创建一个索引文件。第二步,使用SymStore 和/y选项通过索引文件中的信息来实际的存储文件或指针。

由于各种原因,这是一种很有用的技术。例如,这样使得符号存储由于某些原因丢失的时候能够方便的重建,只要索引文件还存在。或者包含符号文件的计算机和创建符号存储的计算机之间网络连接速度很慢时。这种情况下,可以在符号文件所在机器上创建索引文件,并将该文件传输到第二台机器,在第二台机器上创建符号存储。

SymStore参数的完整列表,查看SymStore命令行选项。

注意 SymStore不支持多个用户同时发起事务。建议指派一个用户作为符号存储的"管理员"并处理所有的add 和del事务。

事务示例

这里有两个SymStore在\\MyDir\symsrv 中添加Windows 2000 build 2195符号指针的示例:

symstore add /r /p /f \\BuildServer\BuildShare\2195free\symbols\*.* /s \\MyDir\symsrv /t "Windows 2000" /v "Build 2195 x86 free" /c "Sample add"
symstore add /r /p /f \\BuildServer\BuildShare\2195free\symbols\*.* /s \\MyDir\symsrv /t "Windows 2000" /v "Build 2195 x86 checked" /c "Sample add"

下面的示例中,SymStore将\\largeapp\appserver\bins 中的项目的实际的符号文件添加到\\MyDir\symsrv

symstore add /r /f \\largeapp\appserver\bins\*.* /s \\MyDir\symsrv /t "Large Application" /v "Build 432" /c "Sample add"

这是使用索引文件的示例。首先创建\\largeapp\appserver\bins\上的符号文件的索引文件。这种情况下,索引文件放在第三台计算机\\hubserver\hubshare上。 使用/g 选项来指定前缀"\\largeapp\appserver"可能会在未来改变:

symstore add /r /p /g \\largeapp\appserver /f \\largeapp\appserver\bins\*.* /x \\hubserver\hubshare\myindex.txt

假设现在将\\largeapp\appserver 机器上的所有符号文件移动到\\myarchive\appserver 上。可以使用如下方法从\\hubserver\hubshare\myindex.txt 上的索引文件创建符号存储本身:

symstore add /y \\hubserver\hubshare\myindex.txt /g \\myarchive\appserver /s \\MyDir\symsrv /p /t "Large Application" /v "Build 432" /c "Sample Add from Index"

最后,这是一个SymStore删除之前的事务中添加的文件的示例。查看后面的server.txt 和history.txt文件小节获得关于事务ID的说明。(本例中为0000000096)。

symstore del /i 0000000096 /s \\MyDir\symsrv

压缩文件

SymStore可以使用两种方法使用压缩文件:

  1. 使用SymStore和/p选项来保存符号文件的指针。SymStore 完成之后,压缩指针指向的文件。
  2. 使用SymStore和/x选项来创建索引文件。SymStore完成之后,压缩索引文件中列出的文件。然后,使用SymStore和/y选项(如果愿意,也可以使用/p)来将这些文件或指针保存到符号存储。 (SymStore在这个操作中不需要解压文件。)

符号服务器会负责在适当的时候解压这些文件。

如果使用SymSrv作为符号服务器,必须使用随Microsoft Windows SDK发布的 compress.exe 工具来进行压缩。压缩文件扩展名的最后一个字符必须是下划线 (例如module1.pd_ 或module2.db_)。详细信息,查看SymSrv。

server.txt history.txt 文件

添加事务之后,会在server.txt history.txt 中添加一些信息为未来使用。下面是一次添加事务在server.txt history.txt 中产生的行的示例:

0000000096,add,ptr,10/09/99,00:08:32,Windows NT 4.0 SP 4,x86 fre 1.156c-RTM-2,Added from \\mybuilds\symbols,

这是用逗号分隔的行。下面是每个部分的说明:

字段 说明
0000000096 事务ID号,由SymStore创建
add 事务类型,这个字段可以是adddel
ptr 添加的是文件或指针。该字段可以是fileptr
10/09/99 事务发生的日期。
00:08:32 事务开始的时间。
Windows NT 产品
x86 fre 版本(可选)。
Added from 注释(可选)。
Unused (保留为以后使用)。

这是事务文件0000000096中的一些示例行。每行都记录了添加到目录中的文件或指针的目录和位置。

canon800.dbg\35d9fd51b000,\\mybuilds\symbols\sp4\dll\canon800.dbg
canonlbp.dbg\35d9fd521c000,\\mybuilds\symbols\sp4\dll\canonlbp.dbg
certadm.dbg\352bf2f48000,\\mybuilds\symbols\sp4\dll\certadm.dbg
certcli.dbg\352bf2f1b000,\\mybuilds\symbols\sp4\dll\certcli.dbg
certcrpt.dbg\352bf04911000,\\mybuilds\symbols\sp4\dll\certcrpt.dbg
certenc.dbg\352bf2f7f000,\\mybuilds\symbols\sp4\dll\certenc.dbg

如果使用del事务来撤销以前的add事务,这些行会从server.txt中删除,并添加下面这行到history.txt中:

0000000105,del,0000000096

删除事务的字段说明如下。

字段 说明
0000000105 事务ID号,SymStore创建。
del 事务类型。该字段可以是adddel
0000000096 被删除的事务。

符号存储格式

SymStore使用文件系统本身作为数据库。它创建一个大的目录树,目录名基于符号文件的时间戳、签名、寿命和其他数据。

例如一些不同的acpi.dbg添加到服务器之后,目录可能像下面一样:

Directory of \\mybuilds\symsrv\acpi.dbg
10/06/1999  05:46p      <DIR>          .
10/06/1999  05:46p      <DIR>          ..
10/04/1999  01:54p      <DIR>          37cdb03962040
10/04/1999  01:49p      <DIR>          37cdb04027740
10/04/1999  12:56p      <DIR>          37e3eb1c62060
10/04/1999  12:51p      <DIR>          37e3ebcc27760
10/04/1999  12:45p      <DIR>          37ed151662060
10/04/1999  12:39p      <DIR>          37ed15dd27760
10/04/1999  11:33a      <DIR>          37f03ce962020
10/04/1999  11:21a      <DIR>          37f03cf7277c0
10/06/1999  05:38p      <DIR>          37fa7f00277e0
10/06/1999  05:46p      <DIR>          37fa7f01620a0

这个例子中,acpi.dbg的查找路径可能像这样:\\mybuilds\symsrv\acpi.dbg\37cdb03962040

在查找目录中可能有三个文件:

  1. acpi.dbg,如果保存了该文件的话
  2. 如果保存的是指针,file.ptr 包含实际的符号文件路径。
  3. refs.ptr,包含当前被添加到符号存储中的,具有该时间戳和映像大小的acpi.dbg的当前位置的完整列表。

显示\\mybuilds\symsrv\acpi.dbg\37cdb03962040 中的目录列表如下:

10/04/1999  01:54p                  52 file.ptr
10/04/1999  01:54p                  67 refs.ptr

file.ptr 文件包含字符串"\\mybuilds\symbols\x86\2128.chk\symbols\sys\acpi.dbg"。因为该目录中没有acpi.dbg 文件,所以调试器会试图从\\mybuilds\symbols\x86\2128.chk\symbols\sys\acpi.dbg中去查找。

refs.ptr 中的内容仅被SymStore使用,而不会被调试器使用。这个文件记录该目录中发生过的所有事务的记录。refs.ptr 中的一个示例行可能像这样:

0000000026,ptr,\\mybuilds\symbols\x86\2128.chk\symbols\sys\acpi.dbg

这表明指向\\mybuilds\symbols\x86\2128.chk\symbols\sys\acpi.dbg 的指针由事务"0000000026"添加。

一些符号文件在各种产品、版本或特殊产品中保持不变。这样的一个例子是Windows 2000的文件msvcrt.pdb。列举\\mybuilds\symsrv\msvcrt.pdb 目录显示只有两个版本的msvcrt.pdb 被添加到了符号服务器上:

Directory of \\mybuilds\symsrv\msvcrt.pdb
10/06/1999  05:37p      <DIR>          .
10/06/1999  05:37p      <DIR>          ..
10/04/1999  11:19a      <DIR>          37a8f40e2
10/06/1999  05:37p      <DIR>          37f2c2272

但是,列举\\mybuilds\symsrv\msvcrt.pdb\37a8f40e2 目录表明refs.ptr 中有一些指针。

Directory of \\mybuilds\symsrv\msvcrt.pdb\37a8f40e2
10/05/1999  02:50p              54     file.ptr
10/05/1999  02:50p           2,039     refs.ptr

\\mybuilds\symsrv\msvcrt.pdb\37a8f40e2\refs.ptr的内容如下:

0000000001,ptr,\\mybuilds\symbols\x86\2137\symbols\dll\msvcrt.pdb
0000000002,ptr,\\mybuilds\symbols\x86\2137.chk\symbols\dll\msvcrt.pdb
0000000003,ptr,\\mybuilds\symbols\x86\2138\symbols\dll\msvcrt.pdb
0000000004,ptr,\\mybuilds\symbols\x86\2138.chk\symbols\dll\msvcrt.pdb
0000000005,ptr,\\mybuilds\symbols\x86\2139\symbols\dll\msvcrt.pdb
0000000006,ptr,\\mybuilds\symbols\x86\2139.chk\symbols\dll\msvcrt.pdb
0000000007,ptr,\\mybuilds\symbols\x86\2140\symbols\dll\msvcrt.pdb
0000000008,ptr,\\mybuilds\symbols\x86\2140.chk\symbols\dll\msvcrt.pdb
0000000009,ptr,\\mybuilds\symbols\x86\2136\symbols\dll\msvcrt.pdb
0000000010,ptr,\\mybuilds\symbols\x86\2136.chk\symbols\dll\msvcrt.pdb
0000000011,ptr,\\mybuilds\symbols\x86\2135\symbols\dll\msvcrt.pdb
0000000012,ptr,\\mybuilds\symbols\x86\2135.chk\symbols\dll\msvcrt.pdb
0000000013,ptr,\\mybuilds\symbols\x86\2134\symbols\dll\msvcrt.pdb
0000000014,ptr,\\mybuilds\symbols\x86\2134.chk\symbols\dll\msvcrt.pdb
0000000015,ptr,\\mybuilds\symbols\x86\2133\symbols\dll\msvcrt.pdb
0000000016,ptr,\\mybuilds\symbols\x86\2133.chk\symbols\dll\msvcrt.pdb
0000000017,ptr,\\mybuilds\symbols\x86\2132\symbols\dll\msvcrt.pdb
0000000018,ptr,\\mybuilds\symbols\x86\2132.chk\symbols\dll\msvcrt.pdb
0000000019,ptr,\\mybuilds\symbols\x86\2131\symbols\dll\msvcrt.pdb
0000000020,ptr,\\mybuilds\symbols\x86\2131.chk\symbols\dll\msvcrt.pdb
0000000021,ptr,\\mybuilds\symbols\x86\2130\symbols\dll\msvcrt.pdb
0000000022,ptr,\\mybuilds\symbols\x86\2130.chk\symbols\dll\msvcrt.pdb
0000000023,ptr,\\mybuilds\symbols\x86\2129\symbols\dll\msvcrt.pdb
0000000024,ptr,\\mybuilds\symbols\x86\2129.chk\symbols\dll\msvcrt.pdb
0000000025,ptr,\\mybuilds\symbols\x86\2128\symbols\dll\msvcrt.pdb
0000000026,ptr,\\mybuilds\symbols\x86\2128.chk\symbols\dll\msvcrt.pdb
0000000027,ptr,\\mybuilds\symbols\x86\2141\symbols\dll\msvcrt.pdb
0000000028,ptr,\\mybuilds\symbols\x86\2141.chk\symbols\dll\msvcrt.pdb
0000000029,ptr,\\mybuilds\symbols\x86\2142\symbols\dll\msvcrt.pdb
0000000030,ptr,\\mybuilds\symbols\x86\2142.chk\symbols\dll\msvcrt.pdb

这表明相同的msvcrt.pdb 在保存在\\mybuilds\symsrv 上的几个Windows 2000符号版本中都使用了。

这是同时包含了文件和附加指针的目录示例:

Directory of E:\symsrv\dbghelp.dbg\38039ff439000
10/12/1999  01:54p         141,232     dbghelp.dbg
10/13/1999  04:57p              49     file.ptr
10/13/1999  04:57p             306     refs.ptr

这种情况下, refs.ptr 有下面这样的内容:

0000000043,file,e:\binaries\symbols\retail\dll\dbghelp.dbg
0000000044,file,f:\binaries\symbols\retail\dll\dbghelp.dbg
0000000045,file,g:\binaries\symbols\retail\dll\dbghelp.dbg
0000000046,ptr,\\MyDir\bin\symbols\retail\dll\dbghelp.dbg
0000000047,ptr,\\foo2\bin\symbols\retail\dll\dbghelp.dbg

这样,事务43、44和45向服务器添加了同样的文件,事务46和47添加了指针。如果事务43、44和45被删除,dbghelp.dbg 文件也会从目录中删除掉。这时,目录具有如下内容:

Directory of e:\symsrv\dbghelp.dbg\38039ff439000
10/13/1999  05:01p                   49 file.ptr
10/13/1999  05:01p                 130 refs.ptr

新的file.ptr 包含"\\foo2\bin\symbols\retail\dll\dbghelp.dbg",而refs.ptr 包含:

0000000046,ptr,\\MyDir\bin\symbols\retail\dll\dbghelp.dbg
0000000047,ptr,\\foo2\bin\symbols\retail\dll\dbghelp.dbg

只要refs.ptr 的最后一项为指针,就会存在file.ptr文件,并且包含相关文件的路径。当refs.ptr 最后一项为文件时,目录中不会存在file.ptr。因此,任何对refs.ptr中最后一项的删除操作都可能使得file.ptr 被创建、删除或修改。

SymStore命令行选项

SymStore 事务支持下面这些语法形式。第一个参数必须是add 或del。 其他参数的顺序不重要。

symstore add [/r] [/p [/l] [-:MSG Message] [-:REL] [-:NOREFS]] /f File /s Store /t Product [/v Version] [/o] [/c Comment] [/d LogFile] [/compress]

symstore add [/r] [/p [/l] [-:REL] [-:NOREFS]] /g Share /f File /x IndexFile [/a] [/o] [/d LogFile]

symstore add /y IndexFile /g Share /s Store [/p [-:MSG Message] [-:REL] [-:NOREFS]] /t Product [/v Version] [/o] [/c Comment] [/d LogFile] [/compress]

symstore query [/r] /File /s Store [/o] [/d LogFile]

symstore del /i ID /s Store [/o] [/d LogFile]

symstore /?

参数

/f File
指定要添加的文件或目录的网络路径。
/g Share
指定符号文件本来存储的服务器和共享。当使用/f时,Share 应该和File 指示符的开头相同。使用/y 时,Share 应该是原始符号文件的位置(不是索引文件)。这使得之后将符号文件移动到不同的服务器和共享时可以改变文件路径的一部分。
/s Store
指定符号存储的根目录。
/m Prefix
使得SymStore在存储文件或升级指针时使用以Prefix开始的路径来使用符号。该选项不能和/x一起使用。
/h { PUB | PRI }
使得SymStore在存储或升级符号时使用共有符号(如果指定了PUB),或私有符号(如果指定了PRI)。该选项对二进制文件没有影响。
/i ID
指定事务ID字符串。
/p
使得SymStore存储文件的指针,而不是文件本身。
/l
允许File 指定的文件在本地目录中而不是网络路径。(该选项仅在同时使用/f 和/p时使用。)
-:MSG Message
将指定的Message 添加到每个文件。(仅在使用/p时可以使用。)
-:REL
允许文件指针中的路径是相对路径。该选项隐含/l选项。(仅在使用/p时可以使用。)
-:NOREFS
省略被存储的文件和指针的引用指针文件的创建。如果被修改的存储是使用该选项创建的,那么这个选项仅在符号存储最初被创建时有效。
/r
使得SymStore递归的添加文件或目录。
/t Product
指定产品名字。
/v Version
指定产品的版本。
/c Comment
为事务指定一个注释。
/d LogFile
指定一个用于命令输出的日志文件。如果没有指定它,则事务信息和其他输出被发送给stdout
/o
使得SymStore显示详细输出。
/x IndexFile
使得SymStore不存储实际的符号文件。作为替代,SymStore记录IndexFile 中的信息,使得SymStore可以在之后再访问符号文件。
/a
让SymStore将新的索引信息添加到一个已存在的索引文件中。(该选项只和/x 一起使用。)
/y IndexFile
让SymStore从使用/x 创建的文件中读取数据。
/yi IndexFile
将事务ID和注释添加到由/x选项创建的索引文件末尾。
/z { PUB | PRI }
使得SymStore仅索引指定类型的符号。指定PUB时,仅有不包含任何源码信息的符号会被索引。如果指定PRI,仅有包含完整的源码信息的符号会被索引。SymStore总是为二进制符号创建索引。
/compress
使得SymStore为每个拷贝到符号存储中的文件创建一个压缩后的版本而不是使用未压缩的文件。该选项仅在存储文件而不是指针时使用,所以不能和/p选项一起使用。
/?
显示SymStore 命令的帮助文本。

其他信息

关于SymStore 的更多信息,查看使用符号服务器和符号存储。

转载于:https://www.cnblogs.com/txk1452/p/3575181.html

【转】Symstore 详细使用相关推荐

  1. jar包升级部署到服务器详细流程,将服务部署在linux中

    假设你已经准备好以下东西,即可进行服务部署 一台服务器(云服务器或虚拟机皆可) 已安装好的jdk 1.8 + 的环境(可自行百度) 打好的jar包(maven打jar包) 1. 在服务器中新建好你的项 ...

  2. Redis 难题突破,最经典 46 题含详细解析

    1.什么是 Redis? Redis 是完全开源免费的,遵守 BSD 协议,是一个高性能的 key-value 数据库. Redis 与其他 key - value 缓存产品有以下三个特点: (1)R ...

  3. 详细通俗重点CRF层讲解

    本文翻译自GitHub博客上的原创文章,结尾有原文链接.文章没有晦涩的数学公式,而是通过实例一步一步讲解CRF的实现过程,是入门CRF非常非常合适的资料. 相关项目代码: BERT-BiLSMT-CR ...

  4. 超详细中文预训练模型ERNIE使用指南-源码

    作者 | 高开远,上海交通大学,自然语言处理研究方向 最近在工作上处理的都是中文语料,也尝试了一些最近放出来的预训练模型(ERNIE,BERT-CHINESE,WWM-BERT-CHINESE),比对 ...

  5. Bert代码详解(一)重点详细

    这是bert的pytorch版本(与tensorflow一样的,这个更简单些,这个看懂了,tf也能看懂),地址:https://github.com/huggingface/pytorch-pretr ...

  6. 基于PyTorch的Seq2Seq翻译模型详细注释介绍(一)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/qysh123/article/deta ...

  7. NLP突破性成果 BERT 模型详细解读 bert参数微调

    https://zhuanlan.zhihu.com/p/46997268 NLP突破性成果 BERT 模型详细解读 章鱼小丸子 不懂算法的产品经理不是好的程序员 ​关注她 82 人赞了该文章 Goo ...

  8. k8s核心组件详细介绍教程(配超详细实例演示)

    本文实验环境基于上篇文章手把手从零开始搭建k8s集群超详细教程 本文根据B站课程云原生Java架构师的第一课K8s+Docker+KubeSphere+DevOps学习总结而来 k8s核心组件介绍 1 ...

  9. 手把手从零开始搭建k8s集群超详细教程

    本教程根据B站课程云原生Java架构师的第一课K8s+Docker+KubeSphere+DevOps同步所做笔记教程 k8s集群搭建超详细教程 1. 基本环境搭建 1. 创建私有网络 2. 创建服务 ...

最新文章

  1. Mysql与sqlite注意
  2. mysql-数据库模式定义语言(DDL)
  3. 17. Letter Combinations of a Phone Number
  4. 我要彻底给你讲清楚,Java就是值传递,不接受争辩的那种!
  5. OpenCV放大视频Upscaling video
  6. 开放下载!复旦大学邱锡鹏教授发布教科书《神经网络与深度学习》
  7. 使用maven时报错Dynamic Web Module 3.1 requires Java 1.7 or newe
  8. java addlast_Java中的LinkedList addLast()方法: java.util.LinkedList.addLast() - Break易站
  9. matlab2c使用c++实现matlab函数系列教程-std函数
  10. java 数据转成xml_java转换CSV文件生成xml格式数据
  11. 「长乐集训 2017 Day1」区间 线段树
  12. 3种常用的Redis缓存读写策略
  13. 实现远程开机(电脑)的各种方法总结
  14. 吴恩达机器学习系列15:学习曲线
  15. 虚拟化开源技术有哪些_您使用哪些开源虚拟化工具?
  16. Shader Graph学习(一)
  17. 关于0x3f和0x3f3f3f3f
  18. TI DSP 28335 ePWM实现单路带死区PWM
  19. 如何成为一名合格的数据科学家(IT专家网)
  20. 60款非常酷的国外名片设计作品欣赏(上篇)

热门文章

  1. 计算机一级在线练习,计算机一级练习系统
  2. idea 调试java技巧_Intellij IDEA Debug 调试技巧
  3. 微服务:更愉快还是更嘈杂?
  4. 老旧小区安防升级改造有机遇也有难度
  5. 老外写的关于协程的性能文章-主打http协议
  6. LookUpEditPopup自动调整宽度
  7. Spring Framework 4.2 中的新功能和增强功能
  8. 线性代数与MATLAB2
  9. 精确的力量:完美SNES仿真器的一个3GHz追求
  10. SharePoint:扩展DVWP - 第8部分:挂接了工作流列表表单操作