【问题标题】:gdb: how to get a complete backtrace when fglrx_dri.so segfaults?gdb:当 fglrx_dri.so 段错误时如何获得完整的回溯?
【发布时间】:2012-06-25 11:44:15
【问题描述】:

在运行我自己的基于 Qt 的 OpenGL 应用程序时,我在 fglrx dri 库中遇到分段错误。我从 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 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

【问题讨论】:

    标签: linux debugging gdb backtrace ati


    【解决方案1】:

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

    【讨论】:

    • 我已经在使用调试符号进行构建了。我刚刚使用 -O0 而不是 -O2 重新编译和重新测试,但回溯保持不变。
    • 那么这不是问题!可能你在弄乱函数指针;其中一个已损坏,程序控制转到一个随机位置,该位置显然与任一符号都不匹配,因此 gdb 打印 ??为函数名。然后它会出现段错误。
    • fglrx 是专有 (AMD CAtalyst) 图形驱动程序,因此您可能不会得到调试符号。如果你找到了免费软件,你可以试试。
    • @H2CO3 我怎样才能知道在我的程序执行过程中,函数指针之一在什么时候损坏了?我现在的回溯没有给我任何线索。
    • @BasileStarynkevitch 即使中间的某些库没有任何调试符号,我也应该能够获得完整的回溯。切换到开源驱动使崩溃消失,但我特别想使用 fglrx 驱动。
    【解决方案2】:

    简单而糟糕的答案是你不能。 According to Graham Sellers of AMD,驱动程序是使用-fomit-frame-pointer flag 编译的,如果它位于堆栈的更深处,这会使 gdb 感到困惑。

    【讨论】:

      猜你喜欢
      • 2017-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多