7

我通常不从事 Windows 开发工作,对工具链和构建系统完全不熟悉。我的嵌入式产品在其文件系统中包含一些来自第三方的 Windows DLL(由安装文件系统的 Windows 机器使用)。

我有一个问题:与以前的版本相比,这些 DLL 的最新版本的大小增加了两倍,并且它们不再适合文件系统。DLL 的功能没有太多变化,所以我怀疑开发人员只是忘记在这个 drop 中去除调试符号。我会问他们,但由于时区和语言差异,通常需要几天时间才能得到答案。

有人可以为不熟悉 VisualC 的人使用简单的步骤来解释如何确定 DLL 是否仍然包含调试信息以及如何将其删除?

4

5 回答 5

6

通常,调试信息本身是作为单独的*.pdb文件(程序数据库)构建的,而不是像在 unix 中那样附加到二进制文件中。如果开发人员确实构建了库的调试版本,那么更严重的问题可能是依赖关系。如果二进制文件的发布版本链接到MSVCRT.DLL,那么调试版本将链接到MSVCRTD.DLL(其他运行时库的名称类似地以 D 后缀命名)。要查找特定二进制文件的依赖项,请尝试:

dumpbin /imports whatever.dll

这将显示库的所有运行时依赖项whatever.dll(请注意,列出了这些库中的库名称和符号)。如果您没有看到您期望的依赖项列表,则可能存在只能通过让原始开发人员以正确的构建模式重新构建库来解决的问题。

于 2008-10-09T19:07:39.427 回答
6

Rebase 是微软工具集的一部分。除了设置 dll 的基地址外,它还可以将任何附加的调试信息剥离到单独的 .dbg 文件中。

变基 -i 0x10000000 -a -x .\ -p

从理论上讲,您应该尝试确定 dll 是否已经构建到唯一的基地址并使用它。或者,选择一个基地址以最大限度地减少与您的应用程序使用的任何其他 dll 冲突的机会,以便 Windows 在加载它时不必修补 dll。在一个加载程序经常随机化模块的加载地址作为安全功能的时代,我不确定是否值得再专门设置基地址。

于 2008-10-14T08:29:29.887 回答
3

您将希望从开发人员那里获得发布版本,即使这很痛苦,因为默认情况下调试版本是在禁用代码优化的情况下编译的。因此,即使您以某种方式剥离了调试信息,您也会留下没有尽可能高效的代码。(更不用说那里可能存在任何调试陷阱和消息。)

至于确定您拥有哪种 DLL,您可以使用Dependency Walker查看您的 DLL 是否链接到 VC 运行时库的调试或发布版本(假设这些库不是静态链接的。)

于 2008-10-09T19:13:51.130 回答
2

Dependency walker 确实显示了依赖关系,但不显示调试信息是否已被剥离。使用 PeStudio查看两者。

于 2010-09-21T02:51:51.193 回答
0

暂时忽略其他建议,例如获取有效的发布版本。开发人员正在寻找的工具实际上link.exe来自 Visual Studio(或 SDK 或 WDK)。

如果他们希望您能够将调试器与他们的代码一起使用,他们可以为您创建公共 PDB 文件。他们想要使用的选项是:

  /PDB:filename
  /PDBSTRIPPED:filename

但是,恐怕您自己对此无能为力。PDB 文件本身是单独的文件,调试信息通常不会包含在现代 MS 编译器的二进制文件中(尽管可能包含一些 RTTI 内容,更不用说文件名和字符串ASSERT以及类似的宏和“函数” - 这是最有可能解释感知到的膨胀)。

注意:binplace.exe来自 WDK 提供与上述标志相同的功能,但语法更复杂(尽管适合 WDK 构建过程)。

于 2012-05-04T23:16:52.783 回答