2015-05-26 4 views
3

Когда возникает исключение, я хотел бы закончить аномально мою программу. Прямо сейчас, когда происходит исключение, вызывается оператор write с объяснительным предложением, а затем вызывается оператор stop.Как остановить программу fortran аномально

я отладка программы с idb (интелом отладчика), когда исключение происходит, я получаю write заявления, но idb лечит программы, как правило, прекращаются. Я хотел бы, чтобы, когда происходит исключение, программа прерывается ненормально и поэтому я могу посмотреть в память с backtrace в том месте, где произошло исключение.

Я попытался изменить stop в stop 1, так что возвращается ненулевое значение, но это не работает

EDIT:

Я выполнил решение в одном из ответа:

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

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

с этим решением Я все еще не получаю обратную линию, когда использую ifort 13.0.1, но это отлично работает с ifort 14.0.2.

Я использовал idb вместо gdb, так как часто последние не могут считывать значения распределяемых массивов в fortran.

+0

Что вы подразумеваете под этим не работает? –

+0

@francescalus 'error stop' также дает' program exited normal' – simona

ответ

3

Для этого существуют нестандартные расширения. Gfortran использует backtrace() для печати обратного пути в любом месте. В ifort и gfortran вы можете вызвать подпрограмму abort(), и вы получите обратную трассировку, если вы использовали опцию компилятора -traceback -g.

Вы также можете позвонить в C abort() напрямую, используя совместимость C. (Также нестандартное и может не работать при любых обстоятельствах):

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

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

Я думаю, что я не понимаю вас правильно: я изменил 'stop' на' call abort() ', но все-таки я получаю' выведенную программу нормально '. Я скомпилировал с '-g -traceback' – simona

+2

@simona Возможно, вы сталкиваетесь с этой проблемой? https://software.intel.com/en-us/forums/topic/487091 Я получаю backtrace с ifort 14.0.1, хотя, как ни странно, это SIGSEGV, а не SIGABRT. –

+0

да, на самом деле я использую 'ifort v 13.0.1' – simona

2

С Fortran 2008 ERROR STOP заявление было введено. Он в основном используется для программ Coarray Fortran для инициирования прерывания ошибок на всех изображениях.

+3

Сначала я спросил, помогала ли «ошибка остановить» (комментарий удалил до ответа, поскольку мне удалось проверить его сам). Похоже, idb не обрабатывает окончание ошибки желаемым образом, – francescalus

0

Я никогда не использовал idb, я использовал только gdb, так что это может не сработать. Я просто помещаю инструкцию чтения в точку ошибки, так что программа останавливается и ждет ввода. Затем я могу использовать CTRL-C, из-за чего gdb приостанавливает выполнение, из которого я могу получить обратную трассировку, перемещаться вверх и вниз по стеку, просматривать переменные и т. Д.

+0

проблема решена. Кстати, вы также можете поставить точки останова с помощью 'b : ' – simona

0

Обнаружил этот старый вопрос случайно. Если вы хотите аномальное завершение с помощью компилятора Intel, вы можете использовать процедуру tracebackqq. Последовательность вызова может быть:

 call TRACEBACKQQ(string=string,user_exit_code=user_exit_code) 

Процитирует руководство:

Содержит информацию отладочных сообщений. Использует средство трассировки библиотеки времени выполнения Intel® Fortran для создания трассировки стека, отображающей стек вызовов программ, который появился во время вызова TRACEBACKQQ()

Смежные вопросы