-Xlist 选项为分析源程序中的不一致及可能存在的运行时问题提供了一条颇有价值的途径。编译器执行的分析是全局性的,跨各个子程序。
–Xlist 报告子程序参数、公共块、参数在对齐、数值与类型一致性方面的错误,以及其他各种错误。
用 -Xlist 选项编译的程序会自动将其分析数据内置于二进制文件中。这样便能对库中的程序执行全局程序检查。
全局程序检查 (global program checking, GPC)(由 -Xlistx 选项调用)执行下列任务:
强制执行在不同机器或操作系统之间转移程序所需的一些可移植性限制
检测仍有可能未达到最佳或易于出错的合法构造
揭示其他潜在的错误和含混不清之处
特别地,全局检查会报告如下问题:
命令行中的 -Xlist 选项用于调用编译器的全局程序分析器。该选项有许多子选项,分别在以下各部分进行说明。
示例:为基本全局程序检查编译以下三个文件:
demo% f95 -Xlist any1.f any2.f any3.f |
在上述示例中,编译器:
在文件 any1.lst 中生成输出列表
在无错误时编译并链接程序
通常会将 -Xlistx 生成的输出列表写到文件中。要直接显示到屏幕上,请使用 -Xlisto 将输出文件写到 /dev/tty。
示例:显示到终端:
demo% f95 -Xlisto /dev/tty any1.f |
–Xlist 选项提供了可用于输出的功能组合。不使用其他 -Xlist 选项,缺省情况下会获得以下结果:
列表文件名取自出现的第一个输入源文件或目标文件,同时扩展名替换为 .lst
描述例程间不一致性的错误消息(嵌入在列表中)
标识符的交叉引用表
以每页 66 行、每行 79 列编页码
无调用图
不扩展 include 文件
检查进程可识别编译器命令行中以 .f、.f90、.f95、.for、.F、.F95 或 .o 结尾的所有文件。.o 文件仅向进程提供与全局名称(如子例程和函数名)有关的信息。
此处列出了下列示例中使用的 Repeat.f 源代码:
demo% cat Repeat.f PROGRAM repeat pn1 = 27.005 CALL subr1 ( pn1 ) CALL newf ( pn1 ) PRINT *, pn1 END SUBROUTINE subr1 ( x ) IF ( x .GT. 1.0 ) THEN CALL subr2 ( x * 0.5 ) END IF END SUBROUTINE newf( ix ) INTEGER PRNOK IF (ix .eq. 0) THEN ix = -1 ENDIF PRINT *, prnok ( ix ) END INTEGER FUNCTION prnok ( x ) prnok = INT ( x ) + .05 END SUBROUTINE unreach_sub() CALL sleep(1) END SUBROUTINE subr2 (x) CALL subr1(x+x) END |
示例:使用 -XlistX 显示错误、警告和交叉引用
demo% f95 -XlistX Repeat.f demo% cat Repeat.lst Repeat.f Mon Mar 18 18:08:27 2002 page 1 FILE "Repeat.f" program repeat 4 CALL newf ( pn1 ) ^ **** ERR #418: argument "pn1" is real, but dummy argument is integer See: "Repeat.f" line #14 5 PRINT *, pn1 ^ **** ERR #570: variable "pn1" referenced as real but set as integer in line #4 subroutine newf 19 PRINT *, prnok ( ix ) ^ **** ERR #418: argument "ix" is integer, but dummy argument is real See: "Repeat.f" line #22 function prnok 23 prnok = INT ( x ) + .05 ^ **** WAR #1024: suspicious assignment a value of type "real*4" to a variable of type "integer*4" subroutine unreach_sub 26 SUBROUTINE unreach_sub() ^ **** WAR #338: subroutine "unreach_sub" never called from program subroutine subr2 31 CALL subr1(x+x) ^ **** WAR #348: recursive call for "subr1". See dynamic calls: "Repeat.f" line #10 "Repeat.f" line #3 Cross Reference Mon Mar 18 18:08:27 2002 page 2 C R O S S R E F E R E N C E T A B L E Source file: Repeat.f Legend: D Definition/Declaration U Simple use M Modified occurrence A Actual argument C Subroutine/Function call I Initialization: DATA or extended declaration E Occurrence in EQUIVALENCE N Occurrence in NAMELIST L Use Module Cross Reference Mon Mar 18 15:40:57 2002 page 3 P R O G R A M F O R M Program ------- repeat <repeat> D 1:D Cross Reference Mon Mar 18 15:40:57 2002 page 4 Functions and Subroutines ------------------------- INT intrinsic <prnok> C 23:C newf <repeat> C 4:C <newf> D 14:D prnok int*4 <newf> DC 15:D 19:C <prnok> DM 22:D 23:M sleep <unreach_sub> C 27:C subr1 <repeat> C 3:C <subr1> D 8:D <subr2> C 31:C subr2 <subr1> C 10:C <subr2> D 30:D unreach_sub <unreach_sub> D 26:D Cross Reference Mon Mar 18 15:40:57 2002 page 5 Variables and Arrays -------------------- ix int*4 dummy <newf> DUMA 14:D 16:U 17:M 19:A pn1 real*4 <repeat> UMA 2:M 3:A 4:A 5:U x real*4 dummy <subr1> DU 8:D 9:U 10:U <subr2> DU 30:D 31:U 31:U <prnok> DA 22:D 23:A ------------------------------------------------------------------ STATISTIC Mon Mar 18 15:40:57 2002 page 6 Date: Mon Mar 18 15:40:57 2002 Options: -XlistX Files: 2 (Sources: 1; libraries: 1) Lines: 33 (Sources: 33; Library subprograms:1) Routines: 6 (MAIN: 1; Subroutines: 4; Functions: 1) Messages: 6 (Errors: 3; Warnings: 3) |
基本的全局交叉检查选项是不带子选项的 -Xlist。它是子选项的组合,其中的每一项都可以单独指定。
以下部分介绍用于生成列表、错误或交叉引用表的选项。命令行中可以出现多个子选项。
按下列规则添加子选项:
将子选项添加到 -Xlist 的末尾。
不要在 -Xlist 和子选项间置入空格。
每个 -Xlist 只使用一个子选项。
按下列规则合并子选项:
最常用的选项是 -Xlist(列表、错误、交叉引用表)。
使用 -Xlistc、-XlistE、-XlistL 或 -XlistX 可以合并特定的功能。
其他子选项进一步指定其他细节。
示例:以下两个命令行中的每一个执行相同的任务:
demo% f95 -Xlistc -Xlist any.f |
demo% f95 - Xlistc any.f |
下表展示单独由这些基本的 -Xlist 子选项生成的报告:
表 5–1 基本的 Basic Xlist 子选项
生成的报告 |
选项 |
---|---|
错误、列表、交叉引用 |
–Xlist |
仅错误 |
–XlistE |
仅错误以及源码列表 |
–XlistL |
–XlistX |
|
–Xlistc |
下表展示所有 -Xlist 子选项。
表 5–2 -Xlist 子选项的完整列表
有些编译器选项对于调试很有用。它们可以用来检查下标、发现未声明的变量、显示编译链接过程中的各个阶段、显示软件的版本,等等。
Solaris 链接程序还具有其他调试辅助选项。请参见 ld(1),或在 shell 提示符下运行命令 ld –Dhelp 来查看联机文档。
如果使用 -C 编译,编辑器在运行时会增加对每个数组下标上的跨界引用以及数组一致性的检查。此操作有助于捕获某些会引起段故障的情况。
示例:超出范围的索引:
demo% cat range.f REAL a(10,10) k = 11 a(k,2) = 1.0 END demo% f95 -o range range.f demo% range ****** FORTRAN RUN-TIME SYSTEM ****** Subscript out of range. Location: line 3 column 9 of ’range.f’ Subscript number 1 has value 11 in array ’A’ Abort demo% |
-u 选项会使所有变量被初始标识为未声明,这样,所有未用类型语句或 IMPLICIT 语句显式声明的变量都会被加上错误标志。-u 标志对于发现类型不匹配的变量很有用。如果设置了 -u,在显式声明之前会将所有变量视为未声明。一旦使用了未声明变量,便会出现错误消息。
–V 选项可将编译器每一阶段的名称和版本 ID 显示出来。该选项可用于跟踪不明错误消息的起源、报告编译器故障以及验证所安装编译器补丁程序的级别。
demo% f95 -V wh.f f95: Sun Fortran 95 7.0 DEV 2002/01/30 f90comp: Sun Fortran 95 7.0 DEV 2002/01/30 f90comp: 9 SOURCE LINES f90comp: 0 ERRORS, 0 WARNINGS, 0 OTHER MESSAGES, 0 ANSI ld: Solaris Link Editors: 5.8-1.272 |
Sun Studio 为调试用 Fortran、C 和 C++ 编写的应用程序提供了一个紧密集成的开发环境。
dbx 程序提供了事件管理、过程控制和数据检查。您可以监视程序执行期间发生的事件,并且可以执行下列任务:
收集性能调节数据
监视变量、结构和数组
在行或函数中设置断点(设置程序中的停止位置)
显示值-一旦停止,便可显示或修改变量、数组、结构
单步执行程序,每次执行一行源码或汇编码
跟踪程序流程-显示已发生的调用序列
调用正在调试的程序中的过程
步过或步入函数调用;向下单步执行并跳出函数调用
在下一行或某一其他行运行、停止和继续执行
保存然后重新运行调试执行过程的全部或一部分
检查调用栈,或上下移动调用栈
在嵌入的 Korn shell 中编写脚本
在程序执行 fork(2) 和 exec(2) 时跟随它们
要调试经过优化的程序,请使用 dbx fix 命令重新编译想要调试的例程:
用适当的 -On 优化级别编译程序。
在 dbx 下开始执行。
使用 fix-g any.f,不对要调试的例程进行优化。
对已编译的该例程使用 continue。
如果编译命令中存在有 -g,某些优化将被禁止。有关详细信息,请参见 dbx 文档。
有关详细信息,请参见 Sun Studio 手册《使用 dbx 调试程序》以及 dbx(1) 手册页。