我试图弄清楚什么散列算法用于Microsoft符号本地缓存目录.
例如,本地缓存可以是如下所示
L:\Symbols
\browseui.dll
\44FBC679fe000
browsue.dll
\browseui.pdb
\44F402F62
browseui.pdb
\explorer.exe
\3EBF1F14f7000
explorer.exe
\explorer.pdb
\3EBF1F141
explorer.pdb
\msvcr71.pdb
\60D915C6AB6A4F3586E9096E2F8856482
msvcr71.pdb
文件与其调试数据库之间似乎存在某种对应关系.除此之外,我无法弄清楚如何生成这些(可能)十六进制字符串文件夹的名称.
其中一些是9位数,大约13位数,其他是33位数.它看起来像一个实际的实时文件(由于某种原因存储在符号缓存中)具有13位哈希,而其(几乎相似)调试数据库获得9位哈希.一些调试数据库获得13位哈希值; 虽然他们没有相应的实时文件,却无法弄清楚是什么让这些特殊.
我已经尝试使用我所知道的各种哈希算法(其中39个)对文件进行哈希处理,并且没有任何匹配(直接向上,反向,备用字节序等)
有任何想法吗?
更新 我想我终于找到了它.来自符号存储格式:
SymStore将文件系统本身用作数据库.它创建了一个大型目录树,其目录名称基于符号文件时间戳,签名,年龄和其他数据.
编辑 Dang,不幸的是它只提到目录名是从各个方面派生的(我猜不是很好的哈希),但并没有提到具体如何.搜索继续...... :-(
我正在寻找symstore用于创建目录名称的哈希算法.我发现此链接Microsoft符号服务器/本地缓存哈希算法描述了用于生成哈希的数据元素,但它没有详细说明如何计算哈希值.我有兴趣看看symstore如何生成哈希目录,如果有人有任何可以显示的示例代码,那就太棒了!
有很多手动方法可以让WinDBG在没有符号存储的情况下找到mscordacwks.dll(将文件放在某处的路径中,将其放在与windbg.exe相同的文件夹中,将其放在我的Framework\v文件夹中,指定路径WinDBG使用.cordll -lp c:\dacFolder等),但他们都只为我修复它.对于使用我的符号存储的每个人,我需要更普遍地修复它.
我能想到的可能的解决方案是:
问:这些事情中的任何一个都是可能的,或者是否有其他方式我没有考虑解决问题?
在分析.NET进程时,我遇到了(显然很常见的)问题,即psscor2(和sosex)在我的机器上找不到合适的mscordacwks.dll.WinDBG中的错误是:
Failed to load data access DLL, 0x80004005
Verify that 1) you have a recent build of the debugger (6.2.14 or newer)
2) the file mscordacwks.dll that matches your version of mscorwks.dll is
in the version directory
3) or, if you are debugging a dump file, verify that the file
mscordacwks_<arch>_<arch>_<version>.dll is on your symbol path.
4) you are debugging on the same architecture …Run Code Online (Sandbox Code Playgroud) 我们希望能够在删除物理构建区域时删除符号服务器内容,symstore del 命令对事务 ID 起作用。这是未知的。
如何根据二进制或PDB提取交易ID?是否有工具可以根据二进制或 PDB 路径删除 symstore 信息?
更多上下文 - 我们有许多旧版本,包括发布和调试二进制文件和 PDB。这些都是我们前段时间添加到我们的符号服务器中的。因此,对于每个旧版本,都会为“发布”和“调试”存储一堆文件,它们都具有相同的版本号。存储的版本通常是“Build 7.0.0.200 (DEBUG)”和“Build 7.0.0.200 (Release)”二进制文件将带有版本标记,通常我们希望同时删除 Release 和 Delete。
我正在尝试为我的组织及其各种产品设置一个中央符号服务器.每个产品都有每晚构建,以及"一次性"测试版,RC和发布版本.
我的目标是保持大约一个月的夜间构建符号,因为我们在这里做了很多"dogfooding",所以人们使用内部构建,我们希望在可能的情况下轻松调试我们从内部winqual获得的文件.
我还需要能够永久保留所有beta,RC和发布构建符号.
在做了大量研究之后,我认为这里最好的方法是有两个符号服务器:一个用于夜间构建(其中包含之前的~30个构建版本),另一个用于永久存储beta,RC和发布符号.我会使用产品和版本标记将构建脚本添加到符号存储中以记录产品和内部版本号.成功构建后,脚本将使用符号服务器中的history.txt标识未删除的最旧构建,然后从symstore中删除它.
对于beta版,RCs版和发行版的"一次性"版本,它们将在创建后由构建和安装人员识别,并添加到第二个符号服务器(用于永久存储).
所以我有几个问题:这看起来是否合理?必须有一种更简单的方法来实现这一点,大多数拥有符号服务器的组织都不需要解决这个问题吗?
其次,如果我要采用这种方法,是否有一种简单的方法来识别在服务器上注册的最早的已知符号集?我考虑过使用最后修改日期,但是history.txt似乎是最合适的,但是脚本解析可能容易出错.我希望能够只添加带有产品和版本信息的符号,以及删除带有产品和版本信息的符号.
在此先感谢您的帮助.我很乐意回答任何人可能提出的任何问题,或提供任何澄清.
我正在尝试使用将一堆.pdb文件添加到符号服务器symstore.exe。并非目录中的所有.pdb,而是其中的一部分(基于日期)。
为了将它们添加到单个事务中,我使用的是symstore ... /f '@filelist.txt'where filelist.txt是.pdb每行包含一个真实文件的文件-正如命令行帮助所述:
/f File Network path of files or directories to add.
If the named file begins with an '@' symbol, it is treated
as a response file which is expected to contain a list of
files (path and filename, 1 entry per line) to be stored.
Run Code Online (Sandbox Code Playgroud)
(此信息仅存在于的命令行帮助中symstore,而不存在于相应的联机帮助页面中。)
这只是行不通,它存储了0个文件。我认为此功能-从文件列表添加多个文件-并未真正实现。
有人在与的单个事务中添加文件列表成功symstore.exe吗?