【问题标题】:Program received signal SIGSEGV: Segmentation fault - invalid memory reference. Backtrace for this error:程序收到信号 SIGSEGV:分段错误 - 无效的内存引用。此错误的回溯:
【发布时间】:2014-09-27 16:08:27
【问题描述】:

我在 Ubuntu 14.04 中编译了一个 fortran 95 程序。运行时,我收到以下错误: 这不同于:(1)

Program received signal SIGSEGV: Segmentation fault - invalid memory reference.

Backtrace for this error:
^Z
[9]+  Stopped                 ./a.out

我什至尝试过

gfortran -g -fcheck=all -Wall DoubExchange.f95

但是得到了同样的错误信息。

我的程序:

! HAMILTONIAN Diagonalization for a 2D Lattice of N sites or (N_X) X (N_Y) size, with DOUBLE EXCHANGE.
!                                                       !
            !           D O U B L E    E X C H A N G E                   !
!                                                       !
 PROGRAM DOUBLE_EXCHANGE
   implicit none
   integer:: I, J, K, M, Z, P, L, SIZ, CONT, POINT, S
   integer,parameter :: seed = 8645642
!   character:: N, U
   real*8:: H
   real :: start, finish
!     .. Parameters ..
      INTEGER          N, N_X, N_Y
      INTEGER          LDA
      INTEGER          LWMAX
      PARAMETER        ( LWMAX = 1000 )
!
!     .. Local Scalars ..
!
      INTEGER          INFO, LWORK
!
!     .. Local Arrays ..
!     RWORK dimension should be at least MAX(1,3*N-2)
!
      DOUBLE PRECISION,ALLOCATABLE,DIMENSION(:):: EIG
      REAL*8,ALLOCATABLE,DIMENSION(:,:):: F1
      REAL*8,ALLOCATABLE,DIMENSION(:):: WORK
        call cpu_time(start)
        open(1,file='DOUBLE_EXCHANGE.dat')
        open(2,file='DOUBLE_EXCHANGE.txt')
!
!   We are considering a 2D square lattice of 3 X 3
!
    CALL srand(seed)
    !!  LATTICE DESCRIPTION  !!
    N_X = 2
    N_Y = 2
    SIZ = 2 * N_X * N_Y
    N = SIZ*SIZ
    LDA = N
    !   PROGRAM STARTING POINT  !
    ALLOCATE(F1( SIZ, SIZ ), EIG(SIZ), WORK(3*siz-1))
    CONT = 1
    S = (N_X*2)-1
    M = N_Y-1
DO P=1,1
    DO I=0,M
       DO J=0,S
         POINT = 1
          DO K=0,M
            DO L=0,S
                IF(I==K .AND. ABS(J-L)==2) THEN
                  Z = -1

                ELSE IF(J==L .AND. ABS(I-K)==1) THEN
                  Z = -1

                ELSE IF(J==L .AND. ABS(I-K)==M) THEN
                  Z = -1

                ELSE IF(I==K .AND. ABS(J-L)==S-1) THEN
                  Z = -1

                ELSE IF(I==K .AND. J==L) THEN
                  Z = (-1)**POINT

                ELSE
                  Z = 0                                 !       Potential     0
                ENDIF
            F1(CONT,POINT) = Z
                POINT = POINT + 1
            ENDDO
         ENDDO
            CONT = CONT + 1
       ENDDO
    ENDDO

    WRITE(1,*)
!
       WRITE(1,*),'Displaying Matrix for the given Hamiltonian'
!
       DO i=1,SIZ
            WRITE(1,'(18g15.1)') (F1(i,j), j=1,SIZ)
       ENDDO
!
!
!       DSYEV Example Program Results
!
!   ALLOCATE(WORK(SIZ))
       WRITE(1,*)
       LWORK = -1
       CALL DSYEV( 'Vectors', 'Upper', SIZ, F1, LDA, Eig, WORK, LWORK, INFO )

       LWORK = INT( WORK( 1 ) )

!   DEALLOCATE(WORK)

!   ALLOCATE(WORK(LWORK))
!
!   Solve eigenproblem.
!
       CALL DSYEV( 'Vectors', 'Upper', SIZ, F1, LDA, Eig, WORK, LWORK, INFO )
!
!   Checking for convergence.
!
       IF( INFO.GT.0 ) THEN
          WRITE(*,*)'The algorithm failed to compute eigenvalues.'
          STOP
       END IF
!
!
!       Computes all eigenvalues and, optionally, eigenvectors of an
!       n x n real symmetric matrix A. The eigenvector v(j) of A satisfies
!
!             A*v_i(j) = λ(j)*v_i(j)
!
!
        !!   Print eigenvalues. !!
!
        write(1,*)
        write(1,*)'Eigenvalues'
        write(1,*)
            write(1,'(100g15.5)') (Eig(j), j=1,SIZ)
!
        !!     Print eigenvectors. Where ψ_(i)(eqv. F1(i,j)), i-label is for energy and j-label is for site.   !!
!
        write(1,*)
        write(1,*)'Orthonormal Eigenvectors (stored columnwise)'
        write(1,*)
        do i=1,SIZ
            write(1,'(100g15.5)') (F1(i,j), j=1,SIZ)
        end do
        write(1,*)

!
!        Calculation of number operator, ρ(i) at i-th site for n number of electrons
!
        WRITE(1,*)'Calculation of number operator, ρ(i) at i-th site'
!
!            Considering 3 electrons in the problem
!
    k = INT(SIZ/2)
       CONT = 1
       L    = 1
    DO I=1,SIZ
       H = 0D0
        DO J=1,K
           H = H + F1(I,J)*F1(I,J)     !  WE ARE CALCULATING Σ_n|ψ_n(i)|^2, Where ψ_n(i) are eigenvectors of i-th site with n-component.
        ENDDO
          IF(MOD(I,S) .NE. 0) THEN
             WRITE(2,'(100g15.5)')L,CONT,H
             CONT =CONT + 1

          ELSE
             WRITE(2,'(100g15.5)')L,CONT,H
             WRITE(2,*)
             CONT = 1
             L    = L + 1
          END IF
    ENDDO

        WRITE(1,*)
        WRITE(1,*)
        WRITE(1,*)
ENDDO
! 900    format (F8.3,F8.3)
          call cpu_time(finish)
              print '("Time = ",f6.3," seconds.")',finish-start
              write(1, '("Time = ",f6.3," seconds.")'),finish-start
       STOP
END PROGRAM

所以,错误主要是关于正确初始化 WORK。

【问题讨论】:

  • 您尝试-fbacktrace 还是通过调试器运行您的程序?
  • 如何通过调试器,我不知道。不是 -fbacktrace
  • 对于gdb 使用:gdb -ex run ./a.out...
  • 我知道了,我不知道。程序收到信号 SIGSEGV,分段错误。 0x00007ffff6fdebaf in _int_free (av=0x7ffff731e760 , p= , have_lock=0) at malloc.c:3996 3996 malloc.c: 没有这样的文件或目录。 (gdb) 退出
  • 您是否尝试过-g-fbacktrace 以及-fcheck=all -Wall ? “没用”是什么意思?我已经使用这些选项和 valgrind 成功调试了许多程序。

标签: segmentation-fault fortran gfortran fortran95


【解决方案1】:

是的,错误是关于WORK。您正在从DSYEV 工作区查询中请求并使用LWORK 的最佳值,但您没有相应地调整WORK 的大小。 (你有调整大小的代码,但它被注释掉了。)

我在启用-C=all -C=undefined 的情况下运行了 NAG Fortran 编译器:

Runtime Error: dsyev.f90, line 1: Invalid reference to procedure DSYEV - Dummy array WORK (number 7) has 80 elements but actual argument only has 23 elements

(我必须链接到同样使用 -C=undefined 构建的 LAPACK。)

【讨论】:

    【解决方案2】:

    感谢您了解WORK

    但我在我的程序中解决了错误。问题是因为 LDA = N(where, N = siz*siz) 的初始化,结果我的矩阵 F1(siz,siz*siz) 超过了分配。

    所以,我只需要初始化LDA = siz

    问题已解决。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-09
      • 1970-01-01
      相关资源
      最近更新 更多