|Skip Navigation Links|
|Exit Print View|
|Oracle Solaris Studio 12.3: Debugging a Program With dbx Oracle Solaris Studio 12.3 Information Library|
The following tips and general concepts are provided to help you while debugging Fortran programs. For information on debugging Fortran OpenMP code with dbx, see Interacting With Events.
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 different breakpoints, depending on which file is current.
Fortran 95 and dbx must be in the same case-sensitive or case-insensitive mode:
If the source has a variable named LAST, then in dbx, both the print LAST or print last commands work. Fortran 95 and dbx consider LAST and last to be the same, as requested.
Compile and debug in case-sensitive mode using -U. The default value of the dbx input_case_sensitive environment variable is then true.
If the source has a variable named LAST and one named last, then in dbx, print last works, but print LAST does not work. Fortran 95 and dbx distinguish between LAST and last, as requested.
The following examples use a sample program called my_program.
Main program for debugging, a1.f:
PARAMETER ( n=2 ) REAL twobytwo(2,2) / 4 *-1 / CALL mkidentity( twobytwo, n ) PRINT *, determinant( twobytwo ) END
Subroutine for debugging, 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
Function for debugging, 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
You can do this in one or two steps.
Compile and link in one step, with -g:
demo% f95 -o my_program -g a1.f a2.f a3.f
Or, compile and link in separate steps:
demo% f95 -c -g a1.f a2.f a3.f demo% f95 -o my_program a1.o a2.o a3.o
demo% dbx my_program Reading symbolic information…
To stop at the first executable statement in a main program.
(dbx) stop in MAIN (2) stop in MAIN
Although MAIN must be all uppercase, subnam can be uppercase or lowercase.
(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.
Print value of n:
(dbx) print n n = 2
Print the matrix twobytwo; the format might vary:
(dbx) print twobytwo twobytwo = (1,1) -1.0 (2,1) -1.0 (1,2) -1.0 (2,2) -1.0
Print the matrix array:
(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.
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 the next command with the step command. 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:
The step command sets a breakpoint at the first source statement of the subprogram.
The nextcommand sets the breakpoint at the first source statement after the call, but still in the calling program.