使用/ Zi vs/Z7对Visual Studio C++项目有什么影响?

Zac*_*ame 36 compiler-construction visual-studio-2005 visual-studio-2008 visual-studio visual-c++

背景

您可以使用Visual Studio C++编译器使用几种不同的调试标志.他们是:

  • (没有)
    • 不创建调试信息
    • 编译时间更快
  • / Z7
    • 使用CodeView格式在.obj文件中生成完整的符号调试信息
  • /紫
    • 使用程序数据库格式在目标的.pdb文件中生成完整的符号调试信息.
    • 支持最小重建(/ Gm),这可以减少重新编译所需的时间.
  • / ZI
    • 除了支持Edit-and-Continue之外,生成像/ Zi这样的调试信息

问题

  • / Gm标志与多进程构建/ MP标志不兼容(Visual Studio 2005/2008)

  • 如果要启用最小重建,则/ Z7标志上需要/ Zi标志.

  • 如果你打算使用/ MP标志,/ Z7和/ Zi看起来在MSDN上似乎没有区别.但是,SCons文档声明必须使用/ Z7来支持并行构建.

问题

  • 在Visual Studio C++项目中使用/ Zi vs/Z7有什么含义?

  • 我错过了其中任何一种选择的其他优缺点吗?

  • 具体来说,目标的单个程序数据库格式(PDB)文件与每个源的多个CodeView格式(.obj)文件的好处是什么?

参考

MDSN/Z7,/ Zi,/ ZI(调试信息格式)

MSDN/MP(使用多个进程构建)

SCons构造变量CCPDBFLAG

调试信息

Ben*_*bee 8

Codeview是一种更老的调试格式,它是在20世纪80年代中期的"微软C编译器"时代与微软旧的独立调试器一起引入的.它在磁盘上占用更多空间,调试器解析需要更长的时间,在链接过程中处理起来很麻烦.当我在1998-2000中使用CodeWarrior for Windows时,我们从编译器生成了它.

一个优点是Codeview是一种文档格式,其他工具通常可以在它们无法处理PDB格式的调试数据库时进行处理.此外,如果您一次构建多个文件,则无法写入项目的调试数据库.但是,对于目前的大多数用途,使用PDB格式是一个巨大的胜利,无论是在构建时,尤其是在调试器启动时.

  • 我不能同意.使用Z7构建对我们的项目来说要快得多,特别是在虚拟机上.最后,链接/ DEBUG无论如何都会创建pdbs.但它不能与LTCG一起使用. (4认同)

sco*_*obi 7

旧C7格式的一个优点是它是一体机,存储在EXE中,而不是单独的PDB和EXE.这意味着你永远不会有不匹配.VS开发工具将确保PDB在使用之前与其EXE匹配,但是只需一个EXE就可以更轻松地拥有所需的一切.

这增加了在发布时需要能够剥离调试信息的新问题,以及巨大的EXE文件,更不用说古老的格式和缺乏对minrebuild等其他现代功能的支持,但它仍然可以帮助您尽量让事情变得简单.一个文件比两个文件容易.

并不是说我曾经使用C7格式,我只是把它作为一个可能的优势,因为你问.

顺便说一句,这就是GCC在我正在使用的几个平台上做事情的方式.DWARF2格式隐藏在输出ELF中.Unix人认为他们太热闹了.:)

BTW可以使用DIA SDK解析PDB格式.

  • 根据http://msdn.microsoft.com/en-us/library/xe4t6fc1%28v=vs.80%29.aspx,无法创建包含调试信息的.exe或.dll.调试信息始终放在.pdb文件中.这可能是Codeview时代的一个功能,但今天C7只增加了.obj文件,而不是.exe. (9认同)

Tra*_*s3r 6

/Z7将调试信息以 CodeView 格式保存在 .obj 文件中,并让链接器将它们提取到 .pdb 中,同时/Zi在编译期间通过与 mspdbsrv.exe 同步将其合并到通用 .pdb 文件中。

/Z7意味着更多的文件 IO、使用的磁盘空间以及链接器的更多工作(除非使用 /DEBUG:FASTLINK),因为这些 obj 文件中存在大量重复的调试信息。但这也意味着每个编译都是独立的,因此实际上仍然比/Zi足够的并行化更快。

到目前为止,他们已经/Zi通过减少与 mspdbsrv.exe 的进程间通信来改善这种情况: https: //learn.microsoft.com/en-us/cpp/build/reference/zf

的另一个用例/Z7是“独立”(虽然更大)静态库,如果您需要,不需要单独提供.pdbvcxxx.pdb只要您不使用正确的https://learn.microsoft.com/en-us/cpp/build/reference/fd-program-修复它,这也可以防止 cl 使用可怕的默认名称引起的烦人问题。数据库文件名,大多数人都会忘记。

/ZI类似于/Zi但添加了附加数据等以使“编辑并继续”功能正常工作。