【问题标题】:Remove PDB references from released file从发布的文件中删除 PDB 引用
【发布时间】:2012-06-21 23:27:52
【问题描述】:

在使用任何 IDE 调试和创建文件后,我总是查看最终的二进制可执行文件或 DLL。现在我正在尝试 Visual C++ 2010,寻找最好的版本,没有垃圾或不必要的引用。 因此,我创建了一个包含两个项目的新解决方案:一个可执行文件及其 DLL。 VC++ 在代码和最终文件之间创建了很多中间文件。我用十六进制编辑器打开了 .exe 和 .dll,看到了一些我不喜欢的东西。 文件中的某处有一个 .PDB 文件的绝对路径。

为什么?如何从 VC++ 中删除它?

为此必须有一些预处理器命令。 .PDB 文件的绝对路径有什么用,例如 "D:\My Projects\Project1\Release\Project1.pdb" 在文件的二进制文件中,该文件将在计算机上分发不同的文件夹?除此之外,我不喜欢看到我的驱动器路径之一保存在我想与其他人共享的二进制文件中。我处于发布模式,我看不到那些不必要的信息的使用。我怎样才能删除它?

【问题讨论】:

标签: visual-c++ reference release portable-executable


【解决方案1】:

阅读 MSDN 上的PDB Files 文档:

程序数据库 (PDB) 文件包含调试和项目状态信息,允许增量链接程序的调试配置。当您使用 /ZI 或 /Zi 编译 C/C++ 程序或使用 /debug 编译 Visual Basic/C#/JScript .NET 程序时,将创建 PDB 文件。

在 Visual C++ 中,/Fd 选项命名编译器创建的 PDB 文件。当您使用向导在 Visual Studio 中创建项目时,/Fd 选项设置为创建名为 project.PDB 的 PDB。

请注意,文档中提到了绝对路径:

Visual Studio 调试器直接使用链接器创建的 project.PDB 文件,并将 PDB 的绝对路径嵌入到 EXE 或 DLL 文件中。

您始终可以转到项目属性>链接器>调试>生成调试信息并将其设置为否。

【讨论】:

  • 奇怪的是,即使我处于发布模式,仍然会生成 .PDB 文件。感谢您的回答
  • @ali:这是您创建新项目时的默认设置。但是,您始终可以将其关闭。请注意,只有 调试增量链接 需要 PDB,并且您不需要发布它(除非您希望您的客户能够调试)。跨度>
  • 好的。谢谢!现在我改变了,它起作用了!我讨厌看到二进制代码中显示的字符串!
【解决方案2】:

您可以使用/pdbpath:none(或/pdbaltpath:%_PDB%on newer versions of link.exe)删除 PDB 文件的完整路径名,但仅保留 PDB 的名称和扩展名。为已发布的图像保留 PDB 的名称(和扩展名)是调试有缺陷的图像的唯一方法。 Windows 映像几乎总是保留 PDB 的名称和扩展名!

【讨论】:

  • @BenVoigt 你碰巧知道哪个 VS 版本弃用了/pdbpath:none 并开始需要/pdbaltpath:%_PDB%
【解决方案3】:

如果您无法重建您的模块(即使用链接器开关 /PDBPATH:NONE,Microsoft 似乎已经删除了对它的支持),我为此目的编写了 peupdate 工具,只要您不介意使用第三方工具。 Peupdate 可用于列出、删除或更改可执行模块中的 PDB 字符串。下面是一些例子:

peupdate -c <module_path>           //clear entire PDB path
peupdate -k <module_path>           //remove PDB path, but retain filename
peupdate -u <newpath> <module_path> //set your own path string

【讨论】:

    猜你喜欢
    • 2015-12-14
    • 2021-03-15
    • 2022-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多