Недавно я обновил свой образ WSL Ubuntu 20.04 с WSL1 до WSL2.
В WSL1 я мог прекрасно использовать отладчик QTCreator (обертку GDB). Но после обновления до WSL2 он теперь аварийно завершает работу, как только достигает конструктора QApplication().
Вот базовый пример сбоя:
#include "mainwindow.h" #include int main(int argc, char *argv[]) { QApplication a(argc, argv); Главное окно w; ш.шоу(); вернуть a.exec(); } Вот трассировка стека. Я установил пакет libqt5core5a-dbgsym, но, похоже, это не влияет на трассировку стека. Если вы знаете, как заставить символы отладки работать в этой среде без перекомпиляции всего QT, дайте мне знать!
Поток 1 (Поток 0x7ffff0b7bbc0 (LWP 31883)): #0 __GI_raise (sig=sig@entry=6) в ../sysdeps/unix/sysv/linux/raise.c:50 set = {__val = {0 , 228, 140737488338864, 140737488338864, 7758946189198844672}} pid = tid = ret = #1 0x00007ffff5397859 в __GI_abort() в abort.c:79 save_stage = 1 act = {__sigaction_handler = {sa_handler = 0x7ffffffc058, sa_sigaction = 0x7fffffffc058}, sa_mask = {__val = {140737488339488, 140737488339496, 140737354022076, 14073748833 8896, 140737354046956, 3, 140737312309764, 0, 7758946189198844672, 140737488339032, 140737322294875, 3, 140737488339032, 14 0737488339520, 140737312310041 , 0}}, sa_flags = 1318150912, sa_restorer = 0x7ffff61a1e5b} sigs = {__val = {32, 0 }} #2 0x00007ffff57ebaad в ?? () из /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 Информация о таблице символов отсутствует. #3 0x00007ffff5dcd7ae в QGuiApplicationPrivate::createPlatformIntegration() () из /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5 Информация о таблице символов отсутствует. #4 0x00007ffff5dce708 в QGuiApplicationPrivate::createEventDispatcher() () из /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5 Информация о таблице символов отсутствует. #5 0x00007ffff59f2f55 в ?? () из /usr/lib/x86_64-linux-gnu/libQt5Core.so.5 Информация о таблице символов отсутствует. #6 0x00007ffff5dd0543 в QGuiApplicationPrivate::init() () из /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5 Информация о таблице символов отсутствует. #7 0x00007ffff640b3bd в QApplicationPrivate::init() () из /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5 Информация о таблице символов отсутствует. #8 0x000055555555917f в основном (argc=1, argv=0x7fffffffe718) в /mnt/c/source/myProject/main.cpp:105 RC = 0 a = args = {_vptr.CLfxArgs = 0x0, m_threads = 0, m_autoFile = {static null = {}, d = 0x0}, m_firstFile = {static null = {}, d = 0x0} , m_fragDir = {static null = {}, d = 0x0}, m_forceFirst = false, m_materialsDir = {static null = {}, d = 0x0}, m_meshFile = {static null = { }, d = 0x0}, m_vmFile = {static null = {}, d = 0x0}, m_logFile = {static null = {}, d = 0x0}, m_lfxLog = false, m_testNum = 0, m_iterNum = 0, m_batch = false, m_noInit = false, m_qstarFile = {static null = {}, d = 0x0}, m_fragFuncNum = 42076, m_workingDir = {static null = { }, d = 0x7ffff5582510}} пТест = 0x0 dAccumTime = 0 пакет = ложь szMsg = {static null = {}, d = 0x0} Запуск обычной отладочной сборки работает нормально, все ведет себя так, как ожидалось. Он вылетает только в отладчике.
РЕДАКТИРОВАТЬ: Если я прикреплю GDB к работающему процессу, я смогу легко пройти мимо конструктора QApplication. Если я попытаюсь нормально запустить приложение с помощью GDB, то получу ошибку, похожую на ту, которая возникает, если не удается найти X-сервер:
[Включена отладка потоков с использованием libthread_db] Использование хост-библиотеки libthread_db "/usr/lib/x86_64-linux-gnu/libthread_db.so.1". qt.qpa.xcb: не удалось подключиться для отображения локального хоста: 0 qt.qpa.plugin: Не удалось загрузить плагин платформы Qt «xcb» в «», хотя он был найден. Это приложение не удалось запустить, поскольку не удалось инициализировать плагин платформы Qt. Переустановка приложения может решить проблему. Доступные плагины платформы: eglfs, linuxfb,минимальный,минимальный,offscreen,vnc,xcb. Программа получила сигнал SIGABRT, прервана. __GI_raise (sig=sig@entry=6) по адресу ../sysdeps/unix/sysv/linux/raise.c:50 Я правильно экспортировал переменную DISPLAY на основе /etc/resolv.conf, которая работает для запуска QTCreator. Так почему GDB это не нравится, я не знаю.
РЕДАКТИРОВАТЬ: Дополнительные журналы, если я включил QT_DEBUG_PLUGINS:
(gdb) запустить Стартовая программа: /mnt/c/build/ubuntu20wsl/debug/myProject [Отладка потоков с использованием libthread_db включена] Использование хост-библиотеки libthread_db "/usr/lib/x86_64-linux-gnu/libthread_db.so.1". QFactoryLoader::QFactoryLoader() проверяет путь к каталогу "/usr/lib/x86_64-linux-gnu/qt5/plugins/platforms" ... QFactoryLoader::QFactoryLoader() просматривает "/usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqeglfs.so" Метаданные найдены в lib /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqeglfs.so, метаданные= { "IID": "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.3", "Метаданные": { "Ключи": [ "эгльфс" ] }, «архрек»: 0, "className": "QEglFSIntegrationPlugin", «отладка»: ложь, "версия": 330752 } Получены ключи из метаданных плагина («eglfs») QFactoryLoader::QFactoryLoader() просматривает "/usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqlinuxfb.so" Метаданные найдены в lib /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqlinuxfb.so, метаданные= { "IID": "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.3", "Метаданные": { "Ключи": [ "линуксфб" ] }, «архрек»: 0, "className": "QLinuxFbIntegrationPlugin", «отладка»: ложь, "версия": 330752 } Получены ключи из метаданных плагина («linuxfb») QFactoryLoader::QFactoryLoader() просматривает "/usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqminimal.so" Метаданные найдены в lib /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqminimal.so, метаданные= { "IID": "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.3", "Метаданные": { "Ключи": [ "минимальный" ] }, «архрек»: 0, "className": "QMinimalIntegrationPlugin", «отладка»: ложь, "версия": 330752 } Получены ключи из метаданных плагина («минимальные») QFactoryLoader::QFactoryLoader() просматривает "/usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqminimalegl.so" Метаданные найдены в lib /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqminimalegl.so, метаданные= { "IID": "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.3", "Метаданные": { "Ключи": [ "минималегл" ] }, «архрек»: 0, "className": "QMinimalEglIntegrationPlugin", «отладка»: ложь, "версия": 330752 } Получены ключи из метаданных плагина («minimalegl») QFactoryLoader::QFactoryLoader() просматривает "/usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqoffscreen.so" Метаданные найдены в lib /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqoffscreen.so, метаданные= { "IID": "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.3", "Метаданные": { "Ключи": [ "за кадром" ] }, «архрек»: 0, "className": "QOffscreenIntegrationPlugin", «отладка»: ложь, "версия": 330752 } Получил ключи из метаданных плагина («за кадром») QFactoryLoader::QFactoryLoader() просматривает "/usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqvnc.so" Метаданные найдены в lib /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqvnc.so, метаданные= { "IID": "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.3", "Метаданные": { "Ключи": [ "ВНК" ] }, «архрек»: 0, "className": "QVncIntegrationPlugin", «отладка»: ложь, "версия": 330752 } Получены ключи из метаданных плагина («vnc») QFactoryLoader::QFactoryLoader() просматривает "/usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqxcb.so" Метаданные найдены в lib /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqxcb.so, метаданные= { "IID": "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.3", "Метаданные": { "Ключи": [ "хкб" ] }, «архрек»: 0, "className": "QXcbIntegrationPlugin", «отладка»: ложь, "версия": 330752 } Получены ключи из метаданных плагина («xcb») QFactoryLoader::QFactoryLoader() проверяет путь к каталогу "/mnt/c/build/ubuntu20wsl/debug/myProject/platforms" ... загруженная библиотека "/usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/libqxcb.so" qt.qpa.xcb: не удалось подключиться для отображения локального хоста: 0 qt.qpa.plugin: Не удалось загрузить плагин платформы Qt «xcb» в «», хотя он был найден. Это приложение не удалось запустить, поскольку не удалось инициализировать плагин платформы Qt. Переустановка приложения может решить проблему. Доступные плагины платформы: eglfs, linuxfb,минимальный,минимальный,offscreen,vnc,xcb. Если я устанавливаю переменную QT_QPA_PLATFORM=offscreen, то GDB действует после создания QApplication. Однако окно приложения никогда не появляется.
LIBGL_ALWAYS_INDIRECT, похоже, не помогает, и XServer, который мы используем (X410), явно не рекомендует его использовать, и в прошлом он вызывал у нас проблемы, если был установлен.
В некоторых других сообщениях по аналогичным вопросам упоминается пакет libxcb-cursor0, но он у меня уже есть. (версия 0.1.1-4ubuntu1). У меня также есть libxcb-xinerama0.
На всякий случай я также проверил содержимое /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms, и это libqeglfs.so libqlinuxfb.so libqminimal. поэтому libqminimalegl.so libqoffscreen.so libqvnc.so libqxcb.so. Таким образом, платформа X, похоже, присутствует, а не отсутствует.
[*]Версия QT: 5.12.8 [*]Версия GCC: 9.2 (Ubuntu 9.2-0ubuntu1~20.04.1) [*]Ubuntu: 20.04. [*]QTCreator: 4.11.0 [*]X410: 3.3.1
Текущий комплект:
