Visual Studio .lib(静态库)是否需要.pdbs,或者dll/exe pdbs是否足够?

2guxujil  于 2023-01-27  发布在  其他
关注(0)|答案(2)|浏览(234)

我大致知道,当从.exe静态链接到.lib时,代码放在.exe中(当然缺少一些细节)。
但是,当从WinDbg之类的东西中获取堆栈跟踪时,我是否需要为exe和lib都设置一个pdb,或者exe的pdb包含lib的pdb中的信息(与exe包含lib的方式相同)?
我这样问是因为在使用MSVC(使用CMake)的调试构建中,我可以获得.libs、. ddl、.exes的pdf,但在发布版本中,我只能获得. dls和.exes的pdf

qzlgjiam

qzlgjiam1#

检查this答案。有编译选项。
如果您使用/ZI或/Zi(C/C++ -〉General -〉Debug Information Format),则会创建vc$(PlatformToolsetVersion).pdb,其中包含所创建的所有.obj文件的调试信息。如果您交替使用/Z7,则调试信息将嵌入到.obj文件中,然后嵌入到. lib中。这可能是为静态库分发调试信息的最简单方法。

tpgth1q7

tpgth1q72#

我的公司构建启用了调试信息的版本,

    • 但是**嵌入调试信息(使用/Z7)不是我们的选项,

因为我们不想让逆向工程变得简单。
因此,我们进行了手动测试,例如:

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

结论:

该App的*.pdb文件变得很大。
这意味着静态库的*.pdb文件被嵌入。
不是这样,就是MSVC有巨大的bug;-)
我们可以更进一步,在静态库中添加一个故意的崩溃,看看*.dmp文件的堆栈跟踪是否真的可以转换为文件路径和行号,但以上对我们来说已经足够了。

相关问题