Использование GDB Backtrace для отладки MPI-кода

Использование GDB с backtrace дает следующий вывод,

[Thread debugging using libthread_db enabled]
[New Thread 0x2aaaaffd3700 (LWP 32109)]
[Thread 0x2aaaaffd3700 (LWP 32109) exited]
Detaching after fork from child process 32110.
Detaching after fork from child process 32111.
Detaching after fork from child process 32112.
Detaching after fork from child process 32113.
Detaching after fork from child process 32114.
Detaching after fork from child process 32115.
Detaching after fork from child process 32116.
Detaching after fork from child process 32117.
Detaching after fork from child process 32118.
Detaching after fork from child process 32119.
Detaching after fork from child process 32120.
Detaching after fork from child process 32121.
Detaching after fork from child process 32122.
Detaching after fork from child process 32123.
Detaching after fork from child process 32124.
Detaching after fork from child process 32125.
Detaching after fork from child process 32126.
Detaching after fork from child process 32127.
Detaching after fork from child process 32128.
Detaching after fork from child process 32129.
Detaching after fork from child process 32130.
Missing separate debuginfos, use: debuginfo-install     fftw-3.2.1-3.1.el6.x86_64 glibc-2.12-1.80.el6_3.5.x86_64 nss-pam-ldapd-0.7.5-14.el6_2.1.x86_64
Detaching after fork from child process 32131.
Detaching after fork from child process 32133.
Detaching after fork from child process 32134.
Detaching after fork from child process 32135.
Detaching after fork from child process 32136.
Detaching after fork from child process 32137.
Detaching after fork from child process 32138.
Detaching after fork from child process 32139.
Detaching after fork from child process 32140.
Detaching after fork from child process 32141.
Detaching after fork from child process 32142.
Detaching after fork from child process 32143.
Detaching after fork from child process 32144.

Программа получила сигнал SIGFPE, Арифметическое исключение.

0x00000000004a3104 in phase::Mobility::Average ()
#0  0x00000000004a3104 in phase::Mobility::Average ()
#1  0x00000000004a3523 in phase::Mobility::Average(phase::Field&, phase::BoundaryConditions&) ()
#2  0x000000000046fcda in phase::Diffusion::CalculateMobility(phase::Field&, phase::Composition&, phase::BoundaryConditions&, phase::Mobility&) ()
#3  0x0000000000441a3e in MyParallelism<MyParallelBlock>::Run() ()
#4  0x00000000004436dc in main ()

На что указывает порядок функций вывода? я должен искать последнюю функцию вывода? Как я могу еще сузить линию, которая вызвала арифметическое исключение?

РЕДАКТИРОВАТЬ Запуск с опцией -g дает,

Program received signal SIGFPE, Arithmetic exception.
0x00000000004a5fa4 in phase::Mobility::Average ()
#0  0x00000000004a5fa4 in phase::Mobility::Average ()
#1  0x00000000004a63c3 in phase::Mobility::Average(phase::Field&, phase::BoundaryConditions&) ()
#2  0x0000000000472fea in phase::Diffusion::Mobility(phase::Field&, phase::Composition&, phase::BoundaryConditions&, phase::Mobility&) ()
#3  0x000000000042686e in MyParallelBlock::DoTimestep (this=0x7c9368)
    at Parallelism.cpp:100
#4  0x00000000004450d9 in MyParallelism<MyParallelBlock>::Run (
    this=0x7fffffffd2f0) at Parallelism.cpp:164
#5  0x0000000000446ad3 in main (argc=1, argv=0x7fffffffdcd8)
    at Parallelism.cpp:242

но причина арифметического исключения не сужается. это добавило информацию, что исключение находится в цикле выполнения (который уже был известен). Я ожидал больше информации в функции phase::Mobility::Average (), Каково значение чисел 0x0000000000446ad3, 0x00000000004450d9 так далее? Могу ли я получить некоторую информацию из этих номеров?

1 ответ

Решение

gdb трассировка стека показывает функции в порядке их расположения в стеке вызовов сверху вниз (в то время как стек растет снизу вверх).

Если GDB обнаруживает ошибку арифметического исключения или сегментации, функция, вызвавшая ошибку, будет показана в позиции #0 в трассировке стека GDB.

Чтобы получить файл и информацию о строке, где произошла ошибка, перекомпилируйте вашу программу с символами отладки. Используйте компиляторы -g флаг, чтобы сделать это. Обязательно перекомпилируйте хотя бы те файлы, в которых сбойная функция (см. #0 на трассировке стека) объявлен и реализован.

В вашем случае вам придется перекомпилировать файл, который реализует класс / пространство имен phase::Mobility с -g вариант.

Другие вопросы по тегам