2008-10-09 47 views
6

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

我有一个问题:与以前的版本相比,这些DLL的最新发行版的尺寸已经增加了三倍,并且它们不再适合文件系统。 DLL的功能没有太多变化,所以我怀疑开发者忘了在这个下拉菜单中去掉调试符号。我会问他们,但由于时区和语言的差异,得到答案往往需要几天的时间。

有人可以解释一下,对于不熟悉VisualC的人使用简单步骤,如何确定DLL是否仍包含调试信息以及如何去除它?

回答

3

即使很痛苦,您也会希望从开发人员那里获得发布版本,因为默认情况下,调试版本是在禁用代码优化的情况下编译的。所以,即使你以某种方式除去了调试信息,你仍会留下代码效率不高的代码。 (更不用说无论调试陷阱和消息可能在那里。)

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

5

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

dumpbin /imports whatever.dll 

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

5

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

底垫-i 0x10000000的-a -x。\ -p

你应该在理论上试图确定如果DLL已经开始建造一个独特的基地址,并使用它。或者,选择一个基地址以尽可能减少与应用程序使用的任何其他dll碰撞的机会,以便窗口在加载时不必修补dll。在这样一个时代,加载器通常随机地将模块的加载地址作为安全特性进行随机化。我不确定它的价值在于特别设置基地址。

2

依赖项沃克确实显示依赖项,但不显示调试信息是否已被删除。使用PeStudio可以看到两者。

0

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

如果他们希望你能够使用调试器和他们的代码,他们可以为你创建公共PDB文件。他们想要使用的选项有:

/PDB:filename 
    /PDBSTRIPPED:filename 

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

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