我怎样才能debugging这个用户空间应用程序崩溃?

我正在我的embedded式Linux系统(基于TI AM335x)上运行Qt5.4.0应用程序,它正在停止运行,而且我很难debugging这个。 这是一个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进行debugging,但是当我尝试运行这个时,GDB崩溃了:

-sh-4.2#gdb youtubeview
GNU gdb(GDB)7.5
版权所有(C)2012自由软件基金会,

(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内部的问题已经被发现,

即使我在第一个主要设置一个断点,即使它开始运行它会卡住和内存不足,会发生此问题。

  • 有没有其他的工具或技术可以用来帮助隔离这个问题?
  • 也许是GDB限制内存使用的参数,或者提供一些关于为什么这个Qt程序使其崩溃的更多信息?
  • 也许我可以用一些FD或系统variables来弄清楚为什么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; } 

在设备上运行gdb,尤其是使用WebKit这样一个巨大的库时,会导致内存错误。 相反,在设备上运行gdbserver ,并通过主机上运行的gdb使用工具链的cross-gdb连接到它。 在这种情况下,主机上的gdb会加载所有调试信息,而设备上的gdbserver几乎不需要内存。 甚至可以在主机上提供单独的调试信息,并在设备上剥离库。

请注意,WebKit的部分内容总是以释放模式构建,即使Qt的其余部分是以调试模式构建的,如果要调试到WebKit,您可能需要在构建系统中更改它。

这是一个最小的例子:

设备:

 # gdbserver 192.168.1.2:12345 myapp Process myapp created; pid = 989 listning 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本身的问题,而不是在你的应用程序。 祝你好运!