如何调试此User Space应用程序崩溃?

时间:2015-01-13 16:23:34

标签: linux qt debugging embedded futex

我在我的嵌入式Linux系统(基于TI AM335x)上运行Qt5.4.0应用程序并且它停止运行,我很难调试它。这是一个QtWebKit QML示例(youtubeview),但其他QtWebKit示例对我来说也是如此,所以它是基于我的系统的WebKit。

当我运行应用程序时,它会运行一秒左右,然后以没有消息结束。没有任何报告给syslog或dmesg。当我用strace开始时,我可以看到这个futex消息:

futex(0x2d990, FUTEX_WAKE_PRIVATE, 1)   = 0
futex(0x2d9ac, FUTEX_WAIT_PRIVATE, 7, NULL <unfinished ...>
+++ exited with 1 +++

然后停止。不是很有帮助......我的下一步是用GDB调试它,但是当我尝试运行它时GDB崩溃了:

  

-sh-4.2 #gdb youtubeview
  GNU gdb(GDB)7.5
  版权所有(C)2012 Free Software Foundation,Inc。
  ...
  (gdb)运行
  启动程序:/ usr / share / qt5 / examples / webkitqml / youtubeview / youtubeview
  /home/mike/ulf_qt_450/ulf/build-ulf/out/work/armv7ahf-vfp-neon-linux-gnueabihf/gdb/7.5-r0.0/gdb-7.5/gdb/utils.c:1081:internal-error :虚拟内存耗尽:无法分配64652911个字节   已检测到GDB内部的问题,

即使我首先在main设置断点,也会出现此问题,只要它开始运行它就会卡住并耗尽内存。

  • 是否有其他可用于帮助隔离问题的工具或技术?
  • 也许是GDB限制内存使用的参数,或者提供一些关于Qt程序崩溃原因的更多信息?
  • 也许我可以使用一些FD或系统变量来弄清楚为什么FUTEX被保持和失败?

我现在不确定在哪里解决这个问题。

Qt代码本身非常简单,我不会在这里预见到任何问题:

#include <QGuiApplication>
#include <QQuickView>
int main(int argc, char* argv[])
{
    QGuiApplication app(argc,argv);
    QQuickView view;
    view.setSource(QUrl("qrc:///" QWEBKIT_EXAMPLE_NAME ".qml"));
    view.setResizeMode(QQuickView::SizeRootObjectToView);
    view.show();
    return app.exec();
return 0;
}

1 个答案:

答案 0 :(得分:2)

在设备上运行gdb,特别是使用像WebKit这样的大型库,必然会让你失去内存错误。 相反,在设备上运行gdbserver,并通过主机上运行的gdb连接到它,使用工具链的交叉gdb。在这种情况下,主机上的gdb加载所有调试信息,而设备上的gdbserver几乎不需要内存。 甚至可以在主机上提供单独的调试信息,并在设备上提供剥离的库。

请注意,部分WebKit始终以发布模式构建,即使Qt的其余部分是在调试模式下构建的,如果您要调试到WebKit,您可能希望在构建系统中更改它。

这是一个最小的例子:

设备:

# gdbserver 192.168.1.2:12345 myapp
Process myapp created; pid = 989
Listening on port 12345

主机:

# arm-none-linux-gnueabi-gdb myapp
GNU gdb (Sourcery G++ Lite 2009q1-203) 6.8.50.20081022-cvs
(gdb) set solib-absolute-prefix /opt/targetroot
(gdb) target remote 192.168.1.42:12345
Remote debugging using 192.168.1.42:12345
(gdb) start
The "remote" target does not support "run".  Try "help target" or "continue".
(gdb) break main
Breakpoint 1 at 0x1ab9c: file myapp/main.cpp, line 12.
(gdb) cont
Continuing.
Breakpoint 1, main (argc=1, argv=0xbecfedb4) at myapp/main.cpp:12
12          QApplication app(argc, argv, QApplication::GuiServer);

你是对的,它在QtWebKit本身看起来像一个问题,而不是在你的应用程序中。祝你好运!