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

/Z7/Zi/ZI 编译器选项可指定为程序创建的调试信息的类型,以及是将此信息保存在对象文件中,还是保存在程序数据库 (PDB) 文件中。

语法

/Z7
/Zi
/ZI

备注

指定调试选项时,编译器将为调试器会用到的函数和变量、类型信息以及行位置生成符号名称。 此符号化调试信息可以包含在编译器生成的对象文件(.obj 文件)中,也可以包含在可执行文件的单独的 PDB 文件(.pdb 文件)中。 以下部分介绍了调试信息格式选项。

默认情况下,如果未指定调试信息格式选项,编译器不会生成调试信息,因此编译速度较快。

/Z7

/Z7 选项生成的对象文件还包含调试器会用到的完整符号化调试信息。 这些对象文件及据其生成的任何库的大小要比不包含调试信息的文件大得多。 符号化调试信息包含变量的名称和类型、函数和行号。 编译器不会生成 PDB 文件。 但是,如果向链接器传递了 /DEBUG 选项,则仍可以从这些对象文件或库生成 PDB 文件。

对于调试版本的第三方库的分发服务器,不生成 PDB 文件是一个优点。 但是,用于预编译标头的对象文件对于库链接阶段期间和调试都是十分必需的。 如果 .pch 对象文件中只有类型信息(没有代码),则在生成库时,还必须使用 /Yl(为调试库插入 PCH 引用)选项(该选项默认处于启用状态)。

指定 /Z7 时,已弃用的 /Gm(启用最小重新生成)选项不可用。

/Zi

/Zi 选项生成一个单独的 PDB 文件,其中包含供调试器使用的所有符号化调试信息。 调试信息不包含在对象文件或可执行文件中,这使得这些文件小得多。

使用 /Zi 不会影响优化。 但是,/Zi 的确表示 /debug。 有关详细信息,请参阅 /DEBUG(生成调试信息)

指定 /Zi/clr 时,DebuggableAttribute 特性不会置于程序集元数据中。 如果需要,必须在源代码中对其进行指定。 该特性可影响应用程序的运行时性能。 有关 Debuggable 特性如何影响性能以及如何减轻性能影响的详细信息,请参阅使映像更易于调试

编译器将 PDB 文件命名为 <project>.pdb,其中 <project> 是项目的名称。 如果在项目外部编译文件,则编译器将创建名为 VC<x>.pdb 的 PDB 文件,其中 <x> 会串联所用编译器版本的主版本号和次要版本号。 编译器将在使用此选项创建的每个对象文件中嵌入 PDB 的名称和标识时间戳的签名。 此名称和签名将调试器指向符号化信息和行号信息所在的位置。 PDB 文件中的名称和签名必须与可执行文件匹配,才能在调试器中加载符号。 WinDBG 调试器可以使用 .symopt+0x40 命令加载不匹配的符号。 Visual Studio 没有类似的选项可以加载不匹配的符号。

如果从使用 /Zi 编译的对象创建库,则在将库链接到程序时,关联的 PDB 文件必须可用。 即,如果分发此库,还必须分发此 PDB 文件。 若要不使用 PDB 文件创建包含调试信息的库,必须选择 /Z7 选项。 如果使用预编译标头选项,则预编译标头和其他源代码的调试信息都会放在 PDB 文件中。

/ZI

/ZI 选项类似于 /Zi,但它生成的 PDB 文件的格式支持编辑并继续功能。 若要使用“编辑并继续”调试功能,必须使用此选项。 “编辑并继续”功能有助于提高开发人员的工作效率,但可能会导致代码大小、性能和编译器一致性出现问题。 因为大多数优化与“编辑并继续”不兼容,所以使用 /ZI 会禁用代码中的所有 #pragma optimize 语句。 /ZI 选项还与 __LINE__ 预定义宏的使用不兼容;使用 /ZI 编译的代码不能将 __LINE__ 用作非类型模板参数,尽管 __LINE__ 可以在宏扩展中使用。

/ZI 选项可强制在编译中使用 /Gy(启用函数级链接)/FC(所诊断源代码文件的完整路径)选项。

/ZI/clr(公共语言运行时编译)不兼容。

注意

/ZI 选项仅适用于面向 x86 和 x64 处理器的编译器。 此编译器选项不适用于面向 ARM 处理器的编译器。

在 Visual Studio 开发环境中设置此编译器选项

  1. 打开项目的“属性页” 对话框。 有关详细信息,请参阅在 Visual Studio 中设置 C++ 编译器和生成属性

  2. 选择“配置属性”>“C/C++”>“常规”属性页

  3. 修改“调试信息格式”属性。 选择“确定”以保存更改 。

以编程方式设置此编译器选项

另请参阅

MSVC 编译器选项
MSVC 编译器命令行语法