The following tips and general concepts are provided to help you while debugging Fortran programs.
During a debug session, dbx defines a procedure and a source file as current. Requests to set breakpoints and to print or set variables are interpreted relative to the current function and file. Thus, stop at 5 sets one of three different breakpoints, depending on whether the current file is a1.f, a2.f, or a3.f.
If your program has uppercase letters in any identifiers, dbx recognizes them. You need not provide case-sensitive or case-insensitive commands, as in some earlier versions. (The current release of f90 is case-insensitive.)
FORTRAN 77 and dbx must be in the same case-sensitive or case-insensitive mode:
To compile and debug in case-insensitive mode, do so without the -U option. The default then is dbxenv case insensitive.
If the source has a variable named LAST, then in dbx, both the print LAST or print last commands work. Both f77 and dbx consider LAST and last to be the same, as requested.
To compile and debug in case-sensitive mode, use --U. The default is then dbxenv case sensitive.
If the source has a variable named LAST and one named last, then in dbx, print LAST works, but print last does not work. Both f77 and dbx distinguish between LAST and last, as requested.
File or directory names are always case-sensitive in dbx, even if you have set the dbxenv case insensitive environment attribute.
To debug optimized programs:
Compile the main program with --g but with no --On.
Compile every other routine of the program with the appropriate -On.
Start the execution under dbx.
Use fix -g any.f on the routine you want to debug, but no -On.
Use continue with that routine compiled.
a1.f PARAMETER ( n=2 ) REAL twobytwo(2,2) / 4 *-1 / CALL mkidentity( twobytwo, n ) PRINT *, determinant( twobytwo ) END
a2.f SUBROUTINE mkidentity ( array, m ) REAL array(m,m) DO 90 i = 1, m DO 20 j = 1, m IF ( i .EQ. j ) THEN array(i,j) = 1. ELSE array(i,j) = 0. END IF 20 CONTINUE 90 CONTINUE RETURN END
a3.f REAL FUNCTION determinant ( a ) REAL a(2,2) determinant = a(1,1) * a(2,2) - a(1,2) / a(2,1) RETURN END
The following examples use a sample program called my_program.
Compile and link with the dbx- -g flag. You can do this in one or two steps.
Compile and link in one step, with --g:
demo% f77 -o my_program -g a1.f a2.f a3.f
Or, compile and link in separate steps:
demo% f77 -c -g a1.f a2.f a3.f demo% f77 -o my_program a1.o a2.o a3.o
Start dbx on the executable named my_program:
demo% dbx my_program Reading symbolic information...
Set a simple breakpoint by typing stop in subnam, where subnam names a subroutine, function, or block data subprogram.
To stop at the first executable statement in a main program:
(dbx) stop in MAIN (2) stop in MAIN
Although MAIN must be in uppercase, subnam can be uppercase or lowercase.
Type the run command, which runs the program in the executable files named when you started dbx.
Run the program from within dbx:
(dbx) run Running: my_program stopped in MAIN at line 3 in file "a1.f" 3 call mkidentity( twobytwo, n )
When the breakpoint is reached, dbx displays a message showing where it stopped--in this case, at line 3 of the a1.f file.
To print a value, type the print command.
(dbx) print n n = 2
Print the matrix twobytwo; the format may vary:
(dbx) print twobytwo twobytwo = (1,1) -1.0 (2,1) -1.0 (1,2) -1.0 (2,2) -1.0
(dbx) print array dbx: "array" is not defined in the current scope (dbx)
The print fails because array is not defined here--only in mkidentity.
To advance execution to the next line, type the next command.
Advance execution to the next line:
(dbx) next stopped in MAIN at line 4 in file "a1.f" 4 print *, determinant( twobytwo ) (dbx) print twobytwo twobytwo = (1,1) 1.0 (2,1) 0.0 (1,2) 0.0 (2,2) 1.0 (dbx) quit demo%
The next command executes the current source line and stops at the next line. It counts subprogram calls as single statements.
Compare next with step. The step command executes the next source line or the next step into a subprogram. If the next executable source statement is a subroutine or function call, then:
step sets a breakpoint at the first source statement of the subprogram.
next sets the breakpoint at the first source statement after the call, but still in the calling program.
To quit dbx, type the quit command.
(dbx)quit demo%