通过http设置公共(或私有)符号服务器

时间:2011-03-11 22:20:54

标签: visual-studio http symbol-server

我发现的每一篇文档(参考文献1到5)都讨论了如何使用共享的UNC路径设置符号服务器,然后将正确的设置用于本地调试器实例(无论是_NT_SYMBOL_PATH还是Visual Studio) IDE调试设置)。

Microsoft提供了一个符号服务器(参考6),可通过http获取其公共符号存储。

我想为自己的代码创建一个可通过http传输访问的符号服务器,而不是通过UNC文件共享。 Mozilla人似乎已经这样做了(参考文献7),但它不再有用了。

到目前为止,是否有更好的参考资料可用于执行此任务?


参考

  1. https://msdn.microsoft.com/en-us/library/b8ttk8zy(v=vs.80).aspx
  2. http://msdn.microsoft.com/en-us/library/ms680693(v=vs.85).aspx
  3. http://stackhash.com/blog/post/Setting-up-a-Symbol-Server.aspx
  4. http://entland.homelinux.com/blog/2006/07/06/ ...
  5. http://msdn.microsoft.com/en-us/windows/hardware/gg462988
  6. http://support.microsoft.com/kb/311503
  7. http://developer.mozilla.org/en/Using_the_Mozilla_symbol_server

4 个答案:

答案 0 :(得分:13)

我相信答案非常简单,“只需通过某种http路径共享目录。”根据{{​​3}},这将有效。

换句话说,symstore.exe用于存储符号的目录(当提供为Chad Austin's entry on "Creating Your Very Own Symbol Server"时)将可用作Windows调试工具的符号服务器目标。

答案 1 :(得分:12)

让多个用户直接针对同一符号存储区使用Symstore.exe时要小心。微软关于这个主题的白皮书让你觉得你只需创建一个共享,让所有人都通过作为Windows调试工具的一部分提供的SYMSTORE.EXE程序进行更新。白皮书建议你在每次构建时完成这项工作。

它适用于单个用户或通过为团队更新符号服务器的单个人汇集所有更新。

不幸的是,一些白皮书底部的“精细打印”表示只有一个运行symstore.exe的用户可以同时更新共享符号服务器而不会破坏内容。

(示例:在http://msdn.microsoft.com/en-us/library/ms681417(VS.85).aspx,Microsoft说:“注意SymStore不支持来自多个用户的同时交易。建议将一个用户指定为符号存储的”管理员“,并负责所有添加和del transactions。“)

因此,没有固有的机制来序列化符号存储的更新。似乎多次同时尝试更新符号存储可能会破坏符号存储和/或其索引。

我们不能为所有时区的整个数千人,国际公司建立依赖于通过一个地方的一个人协调的建设。

基于这些白皮书,我在2009年3月向微软提出了这个问题。谁证实这是一个可能的问题。在讨论之后,我们选择实现符号更新服务,该服务通过直接Windows调试工具SDK DbgEng.DLL SymbolSrvStoreFile()API调用来序列化更新,因此永远不可能同时针对相同的符号区域同时进行两次更新。用户具有构建操作,该操作通过服务对其符号进行排队,而不是直接更新符号存储。然后,该服务将更新序列化,以确保永远不会发生真正的并发更新尝试。

有关使用SymSrvStoreFile的有限文档当时并不十分清楚。我确实让它运转了。希望从那时起它有所改进。如果不是,最关键的问题是输入路径必须以类似于_NT_SYMBOL_PATH的格式指定。因此,不要使用“C:\ Data \ MyProject \ bin”作为输入路径,而是指定“srv * C:\ Data \ MyProject \ bin”。

我们的服务现在还通过数据库记录更新。数据库既可以作为符号存储的备份(如果它已经损坏并且必须重建),也可以创建一个报告点,以便管理人员和支持人员知道谁实际上是在保存符号,哪些不是。我们生成每周一次的“符号签到”报告,该报告是自动发生给利益相关者的。

答案 2 :(得分:5)

我们的(Mozilla)符号服务器工作正常,AFAICT。我们没有做任何特别复杂的事情,我们只是把PDB文件放到正确的目录结构中(我们有a script for that,但您可以使用symstore.exe)并通过Apache提供它。我认为我们唯一的特殊事情是允许以非大小写敏感的方式访问文件的一些重写规则,因为Microsoft的工具在文件名/ GUID情况下确实不一致。

答案 3 :(得分:4)

通过HTTP提供的符号服务器与通过UNC文件路径提供的符号服务器具有相同的结构,因此最简单的方法是使用symstore.exe将文件存储在某个文件夹中,然后使用简单的通过HTTP公开该文件夹的HTTP服务器(即使在符号dir中运行python -m SimpleHTTPServer也可以)。

一个小问题是,如果符号文件不存在,HTTP服务器必须返回404错误代码(至少在Visual Studio 2013下测试)。我遇到一个问题,HTTP服务器返回403丢失的文件导致Visual Studio在第一次失败的请求后停止发出请求。

symstore.exe会创建许多辅助文件和文件夹(000Admin/文件夹,refs.ptrfiles.ptr文件。符号服务器无需工作。

如果要在不使用symstore.exe的情况下创建符号存储,可以上传具有以下结构的文件:

BinaryName.pdb/$BUILD_ID/BinaryName.pdb BinaryName.exe/$LINK_ID/BinaryName.exe

其中BUILD_ID是嵌入在PDB文件和可执行文件中的GUID,LINK_ID是可执行文件中构建时间戳和文件大小的组合。这些可以通过从breakpad库读取dump_syms.exe工具的输出来获得。见http://www.chromium.org/developers/decoding-crash-dumps