tracebackqq () с ifort приводит к ошибке сегментации
Почему следующий код приводит к ошибке сегментации при компиляции с
ifort
?
! testtrb.f90
program testtrb
call tracebackqq() ! This is for ifort
!call backtrace() ! This is for gfortran
print '(/1A/)', 'Finish.'
end program testtrb
Выполнениеifort testtrb.f90 ; ./a.out
, Я получил
forrtl: severe (174): SIGSEGV, segmentation fault occurred
Image PC Routine Line Source
a.out 0000000000409FFA Unknown Unknown Unknown
libpthread-2.31.s 00007F6E2C9903C0 Unknown Unknown Unknown
a.out 000000000040746D Unknown Unknown Unknown
a.out 000000000040383B Unknown Unknown Unknown
a.out 00000000004037E2 Unknown Unknown Unknown
libc-2.31.so 00007F6E2C7B00B3 __libc_start_main Unknown Unknown
a.out 00000000004036EE Unknown Unknown Unknown
Возвращение
ifort --version
является
ifort (IFORT) 19.1.1.217 20200306
. Я тоже пробовалifort (IFORT) 2021.1 Beta 20201112
, результат аналогичен. Значение
uname -r
является
5.9.0-050900-generic
, если это полезно.
Однако изменение
tracebackqq
к
backtrace
и бег
gfortran testtrb.f90 ; ./a.out
, Я получил
#0 0x7f789588ad3a
#1 0x557b8f35119d
#2 0x557b8f351254
#3 0x7f789569f0b2
#4 0x557b8f3510cd
#5 0xffffffffffffffff
Finish.
Это кажется правильным.
Так почему же
tracebackqq
вызвать SIGSEGV?
Мы будем благодарны за любые комментарии или критику. Благодарю.
1 ответ
Программа работает не так, как вы ожидаете, по двум причинам, обе из которых описаны на https://software.intel.com/content/www/us/en/develop/documentation/fortran-compiler-developer-guide-and-reference/top/language-reference/a-to-z-reference/t-to-z/tracebackqq.html
Tracebackqq
имеет необязательные аргументы. Таким образом, требуется, чтобы интерфейс был в области действия вызывающей точки. Это достигается за счет использованияifcore
модуль- Как ни странно по умолчанию
tracebackqq
прекращает исполнение. Чтобы программа продолжила выполнение, вам необходимо указать нестандартноеuser_exit_code
Таким образом, компилируя и запуская предоставленный код на узле входа в систему нашего локального кластера, я получаю то же поведение, что и выше:
[ijb@login12(arcus-b) stack]$ cat tb.f90
! testtrb.f90
program testtrb
call tracebackqq() ! This is for ifort
!call backtrace() ! This is for gfortran
print '(/1A/)', 'Finish.'
end program testtrb
[ijb@login12(arcus-b) stack]$ ifort --version
ifort (IFORT) 19.0.1.144 20181018
Copyright (C) 1985-2018 Intel Corporation. All rights reserved.
[ijb@login12(arcus-b) stack]$ ifort -g -traceback tb.f90
[ijb@login12(arcus-b) stack]$ ./a.out
forrtl: severe (174): SIGSEGV, segmentation fault occurred
Image PC Routine Line Source
a.out 0000000000409A03 Unknown Unknown Unknown
libpthread-2.12.s 000000381E40F710 Unknown Unknown Unknown
a.out 00000000004800CF Unknown Unknown Unknown
a.out 0000000000406BE6 Unknown Unknown Unknown
a.out 00000000004036A3 MAIN__ 3 tb.f90
a.out 0000000000403662 Unknown Unknown Unknown
libc-2.12.so 000000381E01ED5D __libc_start_main Unknown Unknown
a.out 0000000000403569 Unknown Unknown Unknown
Добавление использования модуля останавливает SIGSEGV, но код завершается до печати Finish, как описано в документации:
[ijb@login12(arcus-b) stack]$ cat tb2.f90
! testtrb.f90
program testtrb
Use ifcore, Only : tracebackqq
Implicit None
call tracebackqq() ! This is for ifort
!call backtrace() ! This is for gfortran
print '(/1A/)', 'Finish.'
end program testtrb
[ijb@login12(arcus-b) stack]$ ifort -g -traceback tb2.f90
[ijb@login12(arcus-b) stack]$ ./a.out
Image PC Routine Line Source
a.out 0000000000406EFA Unknown Unknown Unknown
a.out 00000000004036CE MAIN__ 5 tb2.f90
a.out 0000000000403662 Unknown Unknown Unknown
libc-2.12.so 000000381E01ED5D __libc_start_main Unknown Unknown
a.out 0000000000403569 Unknown Unknown Unknown
Наконец, добавив нестандартный
user_exit_code
дает желаемое поведение
[ijb@login12(arcus-b) stack]$ cat tb3.f90
! testtrb.f90
program testtrb
Use ifcore, Only : tracebackqq
Implicit None
call tracebackqq( user_exit_code = -1 ) ! This is for ifort
!call backtrace() ! This is for gfortran
print '(/1A/)', 'Finish.'
end program testtrb
[ijb@login12(arcus-b) stack]$ ifort -g -traceback tb3.f90
[ijb@login12(arcus-b) stack]$ ./a.out
Image PC Routine Line Source
a.out 0000000000406EFA Unknown Unknown Unknown
a.out 00000000004036CE MAIN__ 5 tb3.f90
a.out 0000000000403662 Unknown Unknown Unknown
libc-2.12.so 000000381E01ED5D __libc_start_main Unknown Unknown
a.out 0000000000403569 Unknown Unknown Unknown
Finish.