Как я могу отладить сбой приложения User Space?
Я использую приложение Qt5.4.0 в моей встроенной системе Linux (на основе TI AM335x), и оно перестает работать, и мне трудно отлаживать это. Это пример QtWebKit QML (youtubeview), но другие примеры QtWebKit для меня аналогичны, поэтому это что-то вроде WebKit, основанного на моей системе.
Когда я запускаю приложение, оно запускается в течение секунды или около того, а затем заканчивается без сообщений. В системный журнал или dmesg также ничего не сообщается. Когда я запускаю его с помощью strace, я вижу следующее сообщение:
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) запустить
Запуск программы: / 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;
}
1 ответ
Запуск gdb на устройстве, особенно с огромной библиотекой, такой как WebKit, обязательно выведет вас из ошибок памяти. Вместо этого запустите на устройстве gdbserver и подключитесь к нему через gdb, работающий на хост-машине, используя для этого кросс-gdb инструментальной цепочки. В этом сценарии GDB на хосте загружает всю отладочную информацию, в то время как GDB-серверу на устройстве почти не требуется память. Можно даже иметь отдельную отладочную информацию, доступную на хосте и удаленные библиотеки на устройстве.
Обратите внимание, что части 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, а не в вашем приложении. Удачи!