当编译应用程序遇到问题时,XL C/C++ 会发出诊断消息。您可以使用这些消息来帮助标识和更正这些问题。
本节提供由 XL C/C++ 提供的主要诊断消息的简短概述。有关可以帮助您解决应用程序的问题的相关编译器选项的更多信息, 请参阅 Options for error checking and debugging 和 Options that control listings and messages。
在编译结束时,在以下任何一种情况下,编译器将返回码设置为零:
否则,编译器将返回码设置为下列其中一个值:
返回码 | 错误类型 |
---|---|
1 | 发生了严重性级别比 -qhalt 编译器选项的设置更高的错误。 |
40 | 发生了选项错误或不可恢复错误。 |
41 | 发生了配置文件错误。 |
250 | 发生了内存不够错误。编译器调用命令不能再分配任何内存供它使用。 |
251 | 发生了“已接收到信号”错误。即,发生了不可恢复错误或中断信号。 |
252 | 发生了“找不到文件”错误。 |
253 | 发生了输入/输出错误 - 不能读取或写入文件。 |
254 | 发生了派生错误。不能创建新的进程。 |
255 | 当进程运行时检测到错误。 |
将根据 -qlist、-qsource、-qxref、-qattr、-qreport 和 -qlistopt 编译器选项的设置,在输出列表中生成诊断信息。-S 选项在单独的文件中生成汇编程序列表。
如果编译器在编译应用程序时遇到编程错误,则编译器将一条诊断消息发送到标准错误设备,如果选择了适当的编译器选项,则还会发送到一个列表文件。
要通过列表的帮助找到问题的原因,可以参阅以下各项:
- 源代码节(以查看源程序上下文中的任何编译错误)
- 属性和交叉引用节(以查找错误命名或在未声明的情况下使用的数据对象,或查找不匹配的参数)
- 变换和目标节(以查看生成的代码是否类似于您所期望的代码)
标题标识列表的每个主要节。节标题前有一串“大于”(>)号,以便您可以很容易找到它的开头:
>>>>> section name
可以通过指定适当的编译器选项来选择哪些节会出现在列表中。有关这些选项的更多信息,请参阅 Options for error checking and debugging 和 Options that control listings and messages。
列表文件有一个包含下列项的头部节:
- 由下列各项组成的编译器标识:
- 编译器名称
- 版本号
- 发行版号
- 修订版号
- 修订数
- 源文件名称
- 编译日期
- 编译时间
头部节总是在列表中存在,它是第一行且仅出现一次。当存在多个编译单元时,将对每个编译单元重复下列各节。
选项节总是在列表中存在。每个编译单元都有一个单独的节。它指示对编译单元生效的指定选项。当您遇到有冲突的选项时此信息很有用。如果您指定 -qlistopt 编译器选项,则此节列示所有选项的设置。
源代码节包含具有行号和文件号(可选)的输入源代码行。文件号指示产生源代码行的源文件(或包含文件)。所有主文件的源代码行(不是来自包含文件的那些行)都未打印文件号。每个包含文件都有一个与它相关联的文件号,来自包含文件的源代码行都打印了该文件号。文件号位于左边,行号位于文件号的右边,源代码行文本位于行号的右边。编译器将与每个文件相关的行进行编号。仅当 -qsource 编译器选项生效时,源代码行和与其相关联的号码才会出现。
如果 -qsource 选项生效,则错误消息散布在源列表中。在编译过程中生成的错误消息包含下列各项:
- 源代码行
- 指向出错列的指示符行
- 错误消息。
例如:
7 | for (i=0; i<100; i++) { 8 | for (j=0; j<100; j++) { 9 | a[i:j] = j; "loop.c", line 9.16: 1506-277 (S) Syntax error: possible missing ',' or ']'? 10 | } 11 | }
如果 -qnosource 选项生效,则错误消息全部位于源代码节中,错误消息包括下列各项:
- 用引号括起的文件名
- 错误的行号和列位置
- 错误消息。
例如:
"loop.c", line 9.16: 1506-277 (S) Syntax error: possible missing ',' or ']'?
C 和 C++ 诊断消息的格式为:
>>-15--cc-- ---nnn-- --+------------------------+--message_text->< '-(--severity_letter--) -'
编译错误可以具有下列严重性级别,这些严重性级别作为某些错误消息的一部分显示:
缺省情况下,如果编译器遇到严重错误(严重性级别 S),则它停止而不会生成输出文件。您可以通过使用 -qhalt 选项指定不同的严重性,使编译器因为严重性较小的错误而停止。例如,使用 -qhalt=w 时,如果编译器遇到严重性为 W 或更高严重性的任何错误,则它停止。此技术可以减少检查程序的语法和语义有效性所需要的编译时间量。可以通过使用 -qflag 选项来限制较低严重性的消息而不停止编译器。
如果 -qreport 选项生效,则编译器生成一个变换报告,显示 XL C/C++ 是如何对程序进行优化的。本节显示对应于原始源代码的伪码,以便您可以查看 -qhot 或 -qsmp 选项生成的并行化和循环变换。
本节提供关于在编译单元中使用的实体的信息。如果 -qxref 或 -qattr 编译器选项生效,则该节存在。根据生效的选项,本节包含全部或部分关于在编译单元中使用的实体的下列信息:
- 实体的名称
- 实体的属性(如果 -qattr 生效)。属性信息可以包括下列详细信息的任何部分或全部:
- 数据类型
- 名称的类
- 名称的相对地址
- 对齐
- 维数
- 对于数组,它是否是可分配的
- 它是指针、目标还是整数指针
- 它是否是参数
- 它是否是易失的
- 对于哑自变量,它的意向、它是否是值以及它是否是可选的
- 专用、公用或受保护模块
- 指示您在何处定义、引用或修改实体的坐标。如果您声明了实体,则坐标将用 $ 进行标记。如果您初始化了实体,则坐标将用 * 进行标记。如果您在相同位置声明并初始化了实体,则坐标将用 & 进行标记。如果设置了实体,则坐标将用 @ 进行标记。如果引用了实体,则不会标记坐标。
如果您指定带 -qxref 或 -qattr 的 full 子选项,则 C 和 C++ 会报告编译单元中的所有实体。如果您未指定此子选项,则仅出现您实际使用的实体。
仅当 -qlist 编译器选项生效时,XL C/C++ 才生成此节。它包含伪汇编程序目标代码列表,该列表显示源代码行号、以十六进制表示法表示的指令偏移量、指令的汇编程序助记符和指令的十六进制值。在右边,该节还显示指令的循环时间和编译器的中间语言。最后,将显示总循环时间(直线执行时间)和生成的机器指令总数。每个编译单元都有一个单独的节。
本节包含一个表,该表显示使用的每个主源文件和包含文件的文件号和文件名。 它还列示了引用包含文件的主源文件的行号。本节总是存在。
这是每个编译单元的列表的最后一节。它包含诊断总结并指示单元是否编译成功。如果文件仅包含一个编译单元,则本节在列表中不存在。
编译收尾节仅在列表的末尾出现一次。完成编译时,XL C/C++ 提供一个编译总结:读取的源记录数、编译开始时间、编译结束时间、总编译时间、总 CPU 时间和虚拟 CPU 时间。本节在列表中总是存在。
在编译时指定 -g 或 -qlinedebug 编译器选项将指示 XL C/C++ 编译器把调试信息包括在已编译的输出中。然后,可以使用 gdb 或其它任何的符号调试器来单步执行和检查已编译的应用程序的行为。