.lib(静态库)是否需要.pdb文件,或者dll/exe的pdb文件是否足够?

问题描述 投票:0回答:2

我粗略地知道,当从 .exe 静态链接到 .lib 时,代码被放置在 .exe 中(当然缺少一些细节)。

但是,当从像WinDbg这样的东西获取堆栈跟踪时,我是否需要为exe和lib都提供一个pdb,或者exe的pdb是否包含lib的pdb中的信息(与exe的方式相同)包含库)?

我问这个问题是因为在使用 MSVC(使用 CMake)进行调试构建时,我获得了 .lib、.ddls、.exe 的 pdb,但在发布版本中我只能获得 .dll 和 .exe 的 pdb

windows visual-studio
2个回答
2
投票

我的公司构建启用了调试信息的版本,
但是嵌入调试信息(使用

/Z7
)对我们来说不是一个选择,
因为我们不想让逆向工程变得简单。

因此,我们手动测试,例如:

  • 我们创建了一个非常小的应用程序。
  • 然后按原样构建一次,生成App的
    *.pdb
    文件。
  • 并再次构建它,但链接到一个巨大静态库,以再次生成应用程序的
    *.pdb
  • 所说的静态库有它自己的
    *.pdb
    文件。
  • 最后,我们比较了
    *.pdb
    文件的大小。

结论:

该应用程序的

*.pdb
文件变得巨大,
意思是,静态库的
*.pdb
文件已嵌入。

要么是这样,要么 MSVC 有巨大的错误;-)

我们可以更进一步,在静态库中添加一个有意的崩溃,看看

*.dmp
文件的堆栈跟踪是否真的可以转换为文件路径和行号,但上面对我们来说已经足够了。


1
投票

检查这个答案。有编译选项。

如果使用 /ZI 或 /Zi(C/C++ -> 常规 -> 调试信息格式),则会创建 vc$(PlatformToolsetVersion).pdb,其中包含创建的所有 .obj 文件的调试信息。如果交替使用 /Z7,调试信息将嵌入到 .obj 文件中,然后嵌入到 .lib 中。这可能是分发静态库调试信息的最简单方法。

© www.soinside.com 2019 - 2024. All rights reserved.