gdb:如何在fglrx_dri.so段错误时获得完整的回溯?

时间:2012-06-23 10:12:58

标签: linux debugging gdb backtrace ati

我在运行自己的基于Qt的OpenGL应用程序时遇到fglrx驱动库中的分段错误。我从gdb获得的回溯(为Qt和我自己的应用程序安装了dbg符号):

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文件库看到它?

编辑:确认我自己的应用程序是使用调试符号构建的:

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 个答案:

答案 0 :(得分:0)

您还必须为自己的二进制文件生成调试符号。使用GCC的-g选项编译您的应用程序。建议在调试时关闭优化;为此目的使用GCC的-O0标志。

答案 1 :(得分:0)

简单而可怕的答案是你不能。 According to Graham Sellers of AMD,驱动程序使用-fomit-frame-pointer flag编译,如果它在堆栈的深处,则会混淆gdb。