GDB: как получить полную обратную трассировку при fglrx_dri.so segfaults?
У меня возникают ошибки сегментации в библиотеке fglrx dri, когда я запускаю свое собственное приложение OpenGL на основе Qt. Обратный след, который я получаю от gdb (с установленными символами dbg для Qt и моего собственного приложения):
Thread 1 (Thread 0xb7fd9720 (LWP 1809)):
#0 0x06276705 in ?? () from /usr/lib/fglrx/dri/fglrx_dri.so
#1 0x000020dc in ?? ()
#2 0x000020d9 in ?? ()
#3 0x00000000 in ?? ()
Я не могу видеть, где из моего кода я вызываю функцию fglrx, которая вызывает ошибку сегментации. Как я могу расширить эту обратную трассировку, чтобы полностью увидеть ее от функции main() до библиотеки fglrx dri?
изменить: чтобы подтвердить, что мое собственное приложение построено с отладочными символами:
Reading symbols from /home/user/fglrx crash/crashtest-build-desktop-Qt_4_8_1__Qt-4_8_1__Debug/crashtest...done.
(gdb) br main
Breakpoint 1 at 0x804996d: file ../program/main.cpp, line 21.
(gdb) run
Starting program: /home/user/fglrx crash/crashtest-build-desktop-Qt_4_8_1__Qt-4_8_1__Debug/crashtest [Thread debugging using libthread_db enabled]
Breakpoint 1, main (argc=1, argv=0xbffff2a4) at ../program/main.cpp:21
21 QApplication a(argc, argv);
(gdb) bt
#0 main (argc=1, argv=0xbffff2a4) at ../program/main.cpp:21
(gdb) n
[New Thread 0xb7d2bb70 (LWP 2475)]
[New Thread 0xb752ab70 (LWP 2476)]
22 QMainWindow w;
(gdb) bt
#0 main (argc=1, argv=0xbffff2a4) at ../program/main.cpp:22
(gdb) s
QFlags<Qt::WindowType>::QFlags (this=0xbffff164) at /usr/local/Trolltech/Qt-4.8.1/include/QtCore/qglobal.h:2284
2284 Q_DECL_CONSTEXPR inline QFlags(Zero = 0) : i(0) {}
(gdb) bt
#0 QFlags<Qt::WindowType>::QFlags (this=0xbffff164) at /usr/local/Trolltech/Qt-4.8.1/include/QtCore/qglobal.h:2284
#1 0x080499a4 in main (argc=1, argv=0xbffff2a4) at ../program/main.cpp:22
2 ответа
Вы также должны генерировать символы отладки для своего собственного двоичного файла. Скомпилируйте вашу заявку с помощью GCC -g
вариант. Также желательно отключить оптимизацию на время отладки; использовать GCC -O0
флаг для этой цели.
Простой и ужасный ответ - ты не можешь. По словам Грэма Селлерса из AMD, драйвер скомпилирован с -fomit-frame-pointer
флаг, который сбивает с толку GDB, если он глубже в стеке.