Я нашел способ запустить GDB внутри плоского пакета с помощью одной команды (вместо трех шагов), но для этого нужно сделать что-то странное, чтобы обойти странность или, возможно, ошибку в GDB или Flatpak. Может ли кто-нибудь объяснить мне, почему Flatpak «Остановлен» и почему запуск sh с включенным управлением заданиями внутри Flatpak предотвращает это? Я думаю, что здесь есть какое-то странное взаимодействие между тем, как Flatpak, sh и GDB обрабатывают сигналы, но я не уверен.
Я установил «SDK отладки» для Minetest с Flathub:
Flatpak install org.freedesktop.Sdk.Debug/x86_64/23.08 Я хочу запустить GDB внутри плоского пакета. Это работает так, как и ожидалось, но требует трех шагов ( Flatpak, GDB, запуск):
Flatpak run --command=sh --devel net.minetest.Minetest [
Flatpak run --command=gdb --devel net.minetest.Minetest -ex run --args /bin/sleep 30 ... Чтение символов из /bin/sleep... Чтение символов из /usr/lib/debug//usr/bin/sleep.debug... Запуск программы: /usr/bin/sleep 30 Этот GDB поддерживает автоматическую загрузку отладочной информации со следующих URL-адресов: [1]+ Остановлен запуск Flatpak --command=gdb --devel net.minetest.Minetest -ex run --args /bin/sleep 30 Я подумал, что, возможно, для корректной работы GDB необходимо запустить через sh, но нет — результат тот же (примечание: я перезапустил оболочку, чтобы избавиться от остановленных заданий):
Flatpak run --command=sh --devel net.minetest.Minetest -c 'gdb -ex run --args /bin/sleep 30' ... Чтение символов из /bin/sleep... Чтение символов из /usr/lib/debug//usr/bin/sleep.debug... Запуск программы: /usr/bin/sleep 30 Этот GDB поддерживает автоматическую загрузку отладочной информации со следующих URL-адресов: [1]+ Остановлен запуск Flatpak --command=sh --devel net.minetest.Minetest -c 'gdb -ex run --args /bin/sleep 30' pstree обнаруживает кое-что интересное: в дереве процессов нет sh:
pstree $$ bash─┬─bwrap───bwrap───gdb─┬─sleep │ └─4*[{gdb}] └─пстри ОК. Легко исправить sh -c '; спать 0'. Все еще не работает, хотя sh находится в иерархии процессов:
Flatpak run --command=sh --devel net.minetest.Minetest -c 'gdb -ex run --args /bin/sleep 30; спать 0' ... Чтение символов из /bin/sleep... Чтение символов из /usr/lib/debug//usr/bin/sleep.debug... Запуск программы: /usr/bin/sleep 30 Этот GDB поддерживает автоматическую загрузку отладочной информации со следующих URL-адресов: [1]+ Остановлен запуск Flatpak --command=sh --devel net.minetest.Minetest -c 'gdb -ex run --args /bin/sleep 30; спать 0' пстри $$ bash─┬─bwrap───bwrap───sh───gdb─┬─sleep │ └─4*[{gdb}] └─пстри Я догадывался, что попробовал включить управление заданиями, и это устранило проблему:
Flatpak run --command=sh --devel net.minetest.Minetest -c 'set -m; gdb -ex run --args /bin/sleep 30; спать 0' ... Чтение символов из /bin/sleep... Чтение символов из /usr/lib/debug//usr/bin/sleep.debug... Запуск программы: /usr/bin/sleep 30 Этот GDB поддерживает автоматическую загрузку отладочной информации со следующих URL-адресов: Включить debuginfod для этого сеанса? (у или [н]) Debuginfod отключен. Чтобы сделать этот параметр постоянным, добавьте «set debuginfod Enabled Off» в .gdbinit. [Отладка потоков с использованием libthread_db включена] Использование хост-библиотеки libthread_db "/usr/lib/x86_64-linux-gnu/libthread_db.so.1". [Низший 1 (процесс 9) завершился нормально] (БГДБ) Примечание: управление заданиями действительно имеет какое-то значение, поскольку следующая команда получает статус «Остановлена» так же, как и примеры выше:
Flatpak run --command=sh --devel net.minetest.Minetest -c 'set -m; установить +м; gdb -ex run --args /bin/sleep 30; спать 0' Обратите внимание, что GDB внутри плоского пакета считывает входные данные и отвечает на команды просто, пока я не скажу ему запустить программу, которую я отлаживаю:
Flatpak run --command=gdb --devel net.minetest.Minetest --args /bin/sleep 30 ... Чтение символов из /bin/sleep... Чтение символов из /usr/lib/debug//usr/bin/sleep.debug... (gdb) информация о ОС Тип Описание cpus Список всех процессоров/ядер в системе файлы Список всех файловых дескрипторов модули Список всех загруженных модулей ядра. msg Список всех очередей сообщений процессы Список всех процессов procgroups Список всех групп процессов семафоры Список всех семафоров shm Список всех регионов общей памяти сокеты Список всех сокетов интернет-домена темы Список всех тем (БГД) запустить Запуск программы: /usr/bin/sleep 30 Этот GDB поддерживает автоматическую загрузку отладочной информации со следующих URL-адресов: [1]+ Остановлен запуск Flatpak --command=gdb --devel net.minetest.Minetest --args /bin/sleep 30 Почему я получаю сообщение «[1]+ Остановлено»? Что происходит? Почему set -m внутри sh inside Flatpak исправляет это?
cat /etc/fedora-release Выпуск Fedora 38 (Тридцать восемь) плоский пакет --версия Флэтпак 1.15.4 Flatpak run --command=sh --devel net.minetest.Minetest --version | голова --lines=1 GNU bash, версия 5.2.21(1)-выпуск (x86_64-unknown-linux-gnu) Flatpak run --command=gdb --devel net.minetest.Minetest --version | голова --lines=1 GNU ГБД (GDB) 13.2 информация о плоском пакете net.minetest.Minetest | Греп Версия Версия: 5.8.0