剥离 pdb 的路径

Posted

技术标签:

【中文标题】剥离 pdb 的路径【英文标题】:Strip the path to the pdb 【发布时间】:2011-09-29 11:25:50 【问题描述】:

默认情况下,在发布模式下编译 Visual Studio 项目时,会将 pdb 的完整路径放入图像文件中,例如:

c:\myprojects\demo\release\test.pdb

使用未记录的链接器开关 (/pdbpath:none) 可以强制 Visual Studio 2008 减少 pdb 的完整限定名,例如:

test.pdb

我需要对仍然使用 VC6 构建的项目执行相同操作。

我在项目设置级别尝试了“/pdbpath:none”开关,但链接器抱怨这个未知开关。

有没有人知道在链接 VC6 项目时或之后直接在映像级别完成此操作的方法(或工具)?

【问题讨论】:

此开关从 Visual Studio 2010 开始可用(已记录) 此开关也适用于 Visual Studio 2008。 有一个名为 peupdate (website here) 的工具可以删除、剥离或以其他方式将此 PDB 字符串更改为 EXE 或 DLL 的任意值。对于您的特定问题,您可以使用“-s”(strip)选项来删除路径,但保持文件名不变。 在Remove PDB references from released file中查看答案 【参考方案1】:

最好的办法是直接使用 MS 的pdbstr.exe。它允许直接提取、更新和其他功能,与编译器版本无关(直到最后一个支持的版本,我认为现在是 VS2013)。我们使用它直接将 SVN 链接添加到 PDB,然后使用 srctool 将其存储在本地符号存储中。

【讨论】:

谢谢!有趣的是,该实用程序使用备用数据流 (ADS)...“将版本控制信息插入到目标 .pdb 文件的“srcsrv”备用流中”。 使用 pdbstr.exe 的示例命令行是什么?即使有文档,我也无法弄清楚如何剥离路径。 @byteptr 抱歉回复晚了。我们使用 Poweshell 脚本在临时流文件 ($streamContent) 中构建我们的新块,然后像这样直接调用可执行文件: "$ToolPath"/pdbstr.exe -w -s:srcsrv "-p:$pdbFullName" "-i:$streamContent" 这会将给定流作为 srcsrv 流添加到 $pdbFullName 中指定的 pdb,其中包括路径和所有这些。【参考方案2】:

对于较新的link.exe 版本,语法发生了变化。

你想要的选项现在是/pdbaltpath:%_PDB%

记录在 MSDN 上:https://msdn.microsoft.com/en-us/library/dd998269.aspx

%_PDB% 扩展为实际 .pdb 文件的文件名,没有任何路径信息

对于 VC6,您可能希望继续使用相同的编译器,但使用新版本的 link.exe

Windows 驱动程序工具包还附带一个名为 binplace.exe 的工具,可以在构建后修改此信息。

【讨论】:

这似乎被静态库破坏了。 LNK4044:无法识别的选项 '/pdbaltpath:%_PDB%';忽略 @syplex:您使用的是什么版本的链接器?静态库与您的问题有什么关系? 尝试了几个版本。最高版本 14.12.25835.0。试图弄清楚如何指定或更改静态库的 PDB 路径。该路径嵌入到 .lib 中,就像 DLL/EXE 一样(尽管不同),但无法修改它。我希望像 PDBALTPATH 这样的东西可以解决这个问题,但没有找到任何东西。 /PDBALTPATH 可以是相对路径吗?例如..\PDBs\mydll.pdb ?

以上是关于剥离 pdb 的路径的主要内容,如果未能解决你的问题,请参考以下文章

获取pe文件调试符号文件pdb路径

VS2010 C++ 不包含 .pdb 的路径是我根据 dumpbin 编译的 .dlls

能把opencv的源码也进行调试吗?(需要pdb文件才行)

未从同一目录加载 C++ PDB 符号

Oracle12c 手动创建pdb

基于威胁情报的攻击组织画像与溯源——样本中提取PDB开发路径,进而关注到“neeru”等一些有特殊意义的用户名,然后去社交网站上找人名,关联黑客论坛作者信息,邮件等