21

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

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

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

4

3 回答 3

21

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

于 2012-06-24T09:00:15.753 回答
14

阅读MSDN 上的PDB 文件文档:

程序数据库 (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 文件中。

您始终可以转到 Project Properties > Linker > Debugging > Generate Debug Info 并将其设置为 No。

于 2012-06-19T21:00:51.960 回答
6

如果您无法重建您的模块(即使用链接器开关 /PDBPATH:NONE,微软似乎已经删除了对它的支持),我为此目的编写了peupdate工具,只要您不介意使用第 3 方工具. 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
于 2016-08-17T15:36:42.567 回答