3

我在我的嵌入式 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:内部错误:虚拟内存耗尽:无法分配 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;
}
4

1 回答 1

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 本身的问题,而不是你的应用程序。祝你好运!

于 2015-01-13T19:37:59.367 回答