Linux gdb:当fglrx_dri.so发生故障时,如何获得完整的回溯?

Linux gdb:当fglrx_dri.so发生故障时,如何获得完整的回溯?,linux,debugging,gdb,backtrace,ati,Linux,Debugging,Gdb,Backtrace,Ati,在运行我自己的基于Qt的OpenGL应用程序时,我在fglrx dri库中遇到分段错误。我从gdb获得的回溯(为Qt和我自己的应用程序安装了dbg符号): 我无法从我的代码中看到我在哪里调用导致分段错误的fglrx函数。如何扩展此回溯,使其完全从main()函数扩展到fglrx dri库 编辑:要确认我自己的应用程序是使用调试符号构建的,请执行以下操作: Reading symbols from /home/user/fglrx crash/crashtest-build-desktop-Qt_

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

我无法从我的代码中看到我在哪里调用导致分段错误的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
从/home/user/fglrx crash/crashtest-build-desktop-Qt_4_8_1_Qt-4_8_1_调试/crashtest读取符号…完成。
(gdb)br main
0x804996d处的断点1:file../program/main.cpp,第21行。
(gdb)运行
启动程序:/home/user/fglrx crash/crashtest-build-desktop-Qt_4_8_1_Qt-4_8_1_调试/crashtest[启用使用libthread_db的线程调试]
断点1,main(argc=1,argv=0xbfff2a4)位于../program/main.cpp:21
21质量保证申请a(argc、argv);
(gdb)英国电信
#0 main(argc=1,argv=0xbfff2a4)位于../program/main.cpp:21
(gdb)n
[新螺纹0xb7d2bb70(LWP 2475)]
[新螺纹0xb752ab70(LWP 2476)]
22 Q主窗口w;
(gdb)英国电信
#0 main(argc=1,argv=0xbfff2a4)位于../program/main.cpp:22
(gdb)s
QFlags::QFlags(this=0xbfff164)位于/usr/local/Trolltech/Qt-4.8.1/include/QtCore/qglobal.h:2284
2284 Q_DECL_CONSTEXPR内联QFlags(0=0):i(0){
(gdb)英国电信
#0 QFlags::QFlags(this=0xbfff164)位于/usr/local/Trolltech/Qt-4.8.1/include/QtCore/qglobal.h:2284
#1 0x080499a4位于../program/main.cpp:22处的main(argc=1,argv=0xbfff2a4)中

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

简单而糟糕的答案是你不能,驱动程序是用编译的,如果gdb在堆栈的深处,这会混淆gdb。

我已经在用调试符号构建了。我刚刚用-O0而不是-O2b重新编译并重新测试,但是回溯保持不变。那么这不是问题所在!可能您正在处理函数指针;其中一个被破坏了,程序控制转到了一个随机位置,显然这两个符号都不匹配,所以gdb打印??函数名。fglrx是一个专有的(AMD CAtalyst)图形驱动程序,因此您可能无法获得调试符号。如果你找到了,你可以试试免费软件的等效版本。@H2CO3我怎么才能知道在我的程序执行过程中,某个函数指针在什么时候损坏了呢?我现在的回溯没有给我任何线索。@basilestrynkevich我应该能够得到一个完整的回溯,即使中间的一些库没有任何调试符号。切换到开源驱动程序会使崩溃消失,但我特别想使用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