我该如何调试这个用户空间应用程序崩溃?

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 Copyright (C) 2012 Free Software Foundation, Inc. ... (gdb) run Starting program: /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: virtual memory exhausted: can't allocate 64652911 bytes. A problem internal to GDB has been detected,
即使我首先在main设置断点,只要它开始运行,它就会被卡住并耗尽内存。
这个问题即使我设置了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;
}

当Webkit崩溃时,是否会显示任何内容? - Valentin H
@ValentinHeinitz - 不,只是一个静默崩溃,显示器上没有任何东西,日志中也没有任何内容,在串行控制台上也没有任何信息。 - Mike
1个回答

2
在设备上运行gdb,特别是使用如WebKit这样的大型库时,很容易出现内存不足的错误。相反,在设备上运行gdbserver,并通过主机上运行的gdb连接到它,使用工具链的交叉gdb进行连接。在这种情况下,主机上的gdb加载所有的调试信息,而设备上的gdbserver几乎不需要内存。甚至可以在主机上拥有单独的调试信息,而在设备上则使用剥离了调试信息的库。
请注意,即使Qt的其余部分以调试模式构建,WebKit的某些部分始终以发布模式构建。如果您要对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本身的问题,而不是你的应用程序。祝你好运!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接