Удаленный GDB останавливается на каждом событии

У меня удаленный ARM Linux box, который мне нужно отладить.

Сервер запущен:

gdbserver :12345 ./my_app

Клиент:

./arm-am3354-linux-gnueabihf-gdb ~/
(gdb) target remote dev_r:12345
(gdb) continue

Затем я пытаюсь приостановить приложение с помощью Ctrl + C, но GDB останавливается с:

[Нижний 1 (процесс 2766) вышел с кодом 01]

И на сервере:

Ребенок вышел со статусом 1
GDB-сервер выходит

История:
Я пытался использовать удаленную отладку в QtCreator, но при установке точек останова во время выполнения GDB аварийно завершал работу таким же образом. Также точки останова и пауза не работают в QtCreator.
Я пытался также другой GDB, как GDB-Multiarch и один из Android-SDK.

Обновить:
Отладка небольшой программы ака Hello World работает. Локальная отладка (на x86) тоже работает. Само приложение имеет сотни тысяч строк кода, разделяемых и статических библиотек.

Частичное решение:
Вероятно, у меня недействительный системный корень для встроенной платформы. После копирования / lib / и / usr / с целевого устройства и установки его как

set sysroot /home/karel/sysroot

Я могу установить точки останова, и приложение останавливается на них. Однако пауза все еще останавливает удаленное приложение. То же самое для QtCreator: Инструменты-> Параметры-> Отладчик-> GDB-> Дополнительные команды присоединения

0

Решение

У меня была похожая (или даже точно такая же?) Проблема с отладкой моего приложения, работающего на платформе EGLFS. Отладка при сборке с Qt 5.4 работала отлично, отладка с Qt 5.5 велась так, как вы описали.

После нескольких часов поиска я обнаружил, что мое приложение на Qt 5.5 закрылось при получении SIGINT, тогда как на Qt 5.4 отладчик мог приостановить приложение, как и ожидалось. Поскольку GDB отправляет SIGINT при попытке приостановить приложение или установить / удалить точку останова, именно здесь начались проблемы.

После еще одного исследования я наконец нашел следующий коммит в Qt 5.5: Исправить обработку сигналов в QFbVtHandler. В самом конце вы видите, что при получении SIGINT или SIGTERM, handleInt() Обработчик вызывается там, где мы наконец сталкиваемся _exit(1), Установка там точки останова подтвердила, что это именно то, что происходит при попытке приостановить или установить точку останова с помощью GDB.

Решение, которое сработало для меня: Я создал патч для qfbvthandler.cpp, просто удалив #define VTH_ENABLED линия.

Отладка GDB теперь снова работает как шарм.

Примечание. Несмотря на то, что qfbvthandler.cpp был обновлен в Qt5.6 и выше, я подозреваю, что поведение будет таким же. У меня, однако, нет настроенного рабочего пространства, чтобы проверить это.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]