Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

how to stop a fortran program abnormally

When an exception occurs I would like to terminate abnormally my program. Right now, when an exception happens a write statement with an explanatory sentence is called, and then a stop statement is called.

I am debugging the program with idb (intel debugger), when the exception happens I get the write statement, but idb treats the program as terminated normally. I would like that when the exception happens the program is terminated abnormally and so that I can look to the memory with backtrace in the place where the exception happened.

I have tried changing stop in stop 1, so that a non zero value is returned, but this doesn't work

EDIT:

I have implemented the solution in one of the answer:

 interface
    subroutine abort() bind(C, name="abort")
    end subroutine
 end interface

 print *,1
 call abort()
 print *,2
end

with this solution I still do not get any backtrace when I am using ifort 13.0.1, but this works perfectly with ifort 14.0.2.

I have resorted to use idb instead of gdb, because often the latter cannot read the values of allocatable arrays in fortran.

like image 753
simona Avatar asked May 26 '15 15:05

simona


1 Answers

There are non-standard extensions for this. Gfortran uses backtrace() to print a backtrace anywhere, for the Intel's equivalent see the wander95's answer https://stackoverflow.com/a/38905855/721644.

In ifort and gfortran you can call the abort() subroutine and you will get backtrace if you used the -traceback (Intel) or -g -fbacktrace (gfortran) compiler option.

You could also call the C abort() directly using the C interoperability. (also non-standard and may not work in all circumstances):

  interface
    subroutine abort() bind(C, name="abort")
    end subroutine
  end interface

  print *,1
  call abort()
  print *,2
end
like image 194
Vladimir F Героям слава Avatar answered Oct 10 '22 14:10

Vladimir F Героям слава