我大致知道,当从.exe静态链接到.lib时,代码放在.exe中(当然缺少一些细节)。
但是,当从WinDbg之类的东西中获取堆栈跟踪时,我是否需要为exe和lib都设置一个pdb,或者exe的pdb包含lib的pdb中的信息(与exe包含lib的方式相同)?
我这样问是因为在使用MSVC(使用CMake)的调试构建中,我可以获得.libs、. ddl、.exes的pdf,但在发布版本中,我只能获得. dls和.exes的pdf
我大致知道,当从.exe静态链接到.lib时,代码放在.exe中(当然缺少一些细节)。
但是,当从WinDbg之类的东西中获取堆栈跟踪时,我是否需要为exe和lib都设置一个pdb,或者exe的pdb包含lib的pdb中的信息(与exe包含lib的方式相同)?
我这样问是因为在使用MSVC(使用CMake)的调试构建中,我可以获得.libs、. ddl、.exes的pdf,但在发布版本中,我只能获得. dls和.exes的pdf
2条答案
按热度按时间qzlgjiam1#
检查this答案。有编译选项。
如果您使用/ZI或/Zi(C/C++ -〉General -〉Debug Information Format),则会创建vc$(PlatformToolsetVersion).pdb,其中包含所创建的所有.obj文件的调试信息。如果您交替使用/Z7,则调试信息将嵌入到.obj文件中,然后嵌入到. lib中。这可能是为静态库分发调试信息的最简单方法。
tpgth1q72#
我的公司构建启用了调试信息的版本,
/Z7
)不是我们的选项,因为我们不想让逆向工程变得简单。
因此,我们进行了手动测试,例如:
*.pdb
文件。*.pdb
。*.pdb
文件。*.pdb
文件的大小。结论:
该App的
*.pdb
文件变得很大。这意味着静态库的
*.pdb
文件被嵌入。不是这样,就是MSVC有巨大的bug;-)
我们可以更进一步,在静态库中添加一个故意的崩溃,看看
*.dmp
文件的堆栈跟踪是否真的可以转换为文件路径和行号,但以上对我们来说已经足够了。