Debugging a Program With dbx

Working With Arrays

dbx recognizes arrays and can print them:


demo% dbx a.out
Reading symbolic information... 
(dbx) list 1,25
    1           DIMENSION IARR(4,4) 
    2           DO 90 I = 1,4 
    3                   DO 20 J = 1,4 
    4                           IARR(I,J) = (I*10) + J 
    5   20              CONTINUE 
    6   90      CONTINUE 
    7           END
(dbx)  stop at 7
(1) stop at "Arraysdbx.f":7
(dbx) run
Running: a.out 


stopped in MAIN at line 7 in file "Arraysdbx.f" 
    7           END 
(dbx) print IARR
iarr =
	(1,1) 11 
	(2,1) 21 
	(3,1) 31 
	(4,1) 41 
	(1,2) 12 
	(2,2) 22 
	(3,2) 32 
	(4,2) 42 
	(1,3) 13 
	(2,3) 23 
	(3,3) 33 
	(4,3) 43 
	(1,4) 14 
	(2,4) 24 
	(3,4) 34 
	(4,4) 44 
(dbx) print IARR(2,3)
	iarr(2, 3) = 23  - Order of user-specified subscripts ok   
(dbx) quit

Fortran 90 Allocatable Arrays

The following example shows how to work with allocated arrays in dbx.


 Alloc.f90
  demo% f90 -g Alloc.f90
  demo% dbx a.out
  (dbx) list 1,99
      1   PROGRAM TestAllocate
      2   INTEGER n, status 
      3   INTEGER, ALLOCATABLE :: buffer(:)
      4           PRINT *, 'Size?'
      5           READ *, n
      6           ALLOCATE( buffer(n), STAT=status )
      7           IF ( status /= 0 ) STOP 'cannot allocate buffer'
      8           buffer(n) = n
      9           PRINT *, buffer(n)
     10           DEALLOCATE( buffer, STAT=status)
     11   END








Unknown size at line 6









Known size at line 9




buffer(1000) holds 1000
 (dbx) stop at 6
 (2) stop at "alloc.f90":6
 (dbx) stop at 9
 (3) stop at "alloc.f90":9
 (dbx) run
 Running: a.out 
 (process id 10749)
  Size?
 1000
 stopped in main at line 6 in file "alloc.f90"
     6           ALLOCATE( buffer(n), STAT=status )
 (dbx) whatis buffer
 integer*4 , allocatable::buffer(:) 
 (dbx) next
 continuing
 stopped in main at line 7 in file "alloc.f90"
     7           IF ( status /= 0 ) STOP 'cannot allocate buffer'
 (dbx) whatis buffer
 integer*4 buffer(1:1000) 
 (dbx) cont
 stopped in main at line 9 in file "alloc.f90"
     9           PRINT *, buffer(n)
 (dbx) print n
 n = 1000
 (dbx) print buffer(n)
 buffer(n) = 1000






    

Unknown size at line 6









Known size at line 9




buffer(1000) holds 1000
 (dbx) stop at 6
 (2) stop at "alloc.f90":6
 (dbx) stop at 9
 (3) stop at "alloc.f90":9
 (dbx) run
 Running: a.out 
 (process id 10749)
  Size?
 1000
 stopped in main at line 6 in file "alloc.f90"
     6           ALLOCATE( buffer(n), STAT=status )
 (dbx) whatis buffer
 integer*4 , allocatable::buffer(:) 
 (dbx) next
 continuing
 stopped in main at line 7 in file "alloc.f90"
     7           IF ( status /= 0 ) STOP 'cannot allocate buffer'
 (dbx) whatis buffer
 integer*4 buffer(1:1000) 
 (dbx) cont
 stopped in main at line 9 in file "alloc.f90"
     9           PRINT *, buffer(n)
 (dbx) print n     
 n = 1000
 (dbx) print buffer(n)
 buffer(n) = 1000

Slicing Arrays

The syntax for Fortran array-slicing:


print arr-exp(first-exp
:last-exp:stride-exp
)

Table 17-1 Variables for Array Slicing

Variable 

Description 

Default 

arr-exp

Expression that should evaluate to an array type 

 

first-exp

First element in range, also first element printed 

Lower bound 

last-exp

Last element in range, but may not be last element printed if stride is greater than 1 

Upper bound 

stride-exp

Stride 

To specify rows and columns:


demo% f77 -g -silent ShoSli.f 
demo% dbx a.out 
Reading symbolic information for a.out
(dbx) list 1,12
	1 		INTEGER*4 a(3,4), col, row 
	2 		DO row = 1,3 
	3 			DO col = 1,4 
	4 			  a(row,col) = (row*10) + col 
	5 			END DO
	6 		END DO
	7 		DO row = 1, 3
	8   			 WRITE(*,'(4I3)') (a(row,col),col=1,4)
	9		END DO
	10		END
(dbx) stop at 7 
(1) stop at "ShoSli.f":7 
(dbx) run 
Running: a.out 
stopped in MAIN at line 7 in file "ShoSli.f" 
	7 		 DO row = 1, 3

Print row 3:




(dbx) print a(3:3,1:4)
'ShoSli'MAIN'a(3:3, 1:4) =
        (3,1)   31
        (3,2)   32
        (3,3)   33
        (3,4)   34
(dbx)



















Print column 4:




(dbx) print a(1:3,4:4)
'ShoSli'MAIN'a(3:3, 1:4) =
        (1,4)   14
        (2,4)   24
        (3,4)   34
(dbx)