我在我的嵌入式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设置断点,也会出现此问题,只要它开始运行它就会卡住并耗尽内存。
我现在不确定在哪里解决这个问题。
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;
}
答案 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本身看起来像一个问题,而不是在你的应用程序中。祝你好运!