Мне нужно запустить gdb внутри Docker, и у меня есть сильные предпочтения для интерфейса, предоставляемого emacs.
Когда я выполняю Mx gdb, я ввожу "docker -compose -f ~ / docker -services / dev / docker -compose.yml exe c dev_rhel7 bash - c "gdb -i = mi" ", а затем он показывает мне следующее сообщение.
Текущий каталог - / home / drcoeurjoly / docker -services / dev /
Ошибка: вы не указали -i = mi в командной строке GDB! ВНИМАНИЕ: переменная MY_UID не установлена. По умолчанию используется пустая строка.
1-inferior-tty-set / dev / pts / 3
2-gdb-set height 0
3-gdb-set non -stop 1
4-enable-pretty-printing
5-file-list-exe c -source-files
6-file-list-exe c -source-файл
7-gdb-show приглашение
8-стек-информационный фрейм
9-нить-информация
10- список прерываний
11-нить-информация
12-брейк-лист
= группа добавленных потоков, id = "i1"
~ "GNU GDB (GDB) Red Hat Enterprise Linux 7.6.1-114.el7 \ n"
~ "Copyright (C) 2013 Free Software Foundation, In c. \ N"
~ "Лицензия GPLv3 +: GNU GPL версии 3 или более поздней http://gnu.org/licenses/gpl.html \ nЭто бесплатное программное обеспечение: вы можете изменять и распространять его. \ NНЕТ ГАРАНТИИ, в той степени, в которой это разрешено по закону. Для подробностей введите \ "Показать копирование \" \ nand \ "Показать гарантию \". \ n "
~" Этот GDB был настроен как \ "x86_64-redhat- linux -gnu \" . \ nДля получения инструкций по сообщению об ошибках см. \ n "* 1 045 *
~ "http://www.gnu.org/software/gdb/bugs/. \ N"
= изменение cmd-param, param = "сохранение истории", значение = "on"
= cmd-param-change, param = "имя файла истории", значение = "/ home / drcoeurjoly / dotfiles / gdb / .gdb_history"
= cmd-param-change, param = "print pretty", value = "on"
= cmd-param-change, param = "print object", value = "on"
= cmd-param-change, param = "print vtbl", value = "on"
= cmd-param-change, param = "demangle-style", value = "gnu-v3"
= cmd-param-change, param = "follow -fork-mode ", value =" child "
= cmd-param-change, param =" detach-on-fork ", value =" off "
(gdb)
1 ^ сделано
(ГБД)
2 ^ сделано
(ГБД)
3 ^ сделано
( GDB)
4 ^ сделано
(GDB)
5 ^ сделано, файлы = []
(GDB)
6 ^ error, msg = "Таблица символов не загружена. Используйте команду \ "file \". "
(gdb)
7 ^ done, value =" (gdb) "
(gdb)
8 ^ error, msg = "Нет регистров."
(gdb)
9 ^ done, threads = []
(gdb)
10 ^ сделано, BreakpointTable = {nr_rows = "0", nr_cols = "6", HDR = [{ширина = "7", выравнивание = "- 1", имя_столбца = "число", colhdr = "Num"}, { ширина = "14", выравнивание = "- 1", имя_столбец = "тип", colhdr = "Тип"}, {ширина = "4", выравнивание = "- 1", имя_столбец = "DISP", colhdr = "Disp "}, {ширина =" 3" , выравнивание = "- 1", имя_столбец = "включен", colhdr = "ENB"}, {ширина = "10", выравнивание = "- 1", имя_столбец = "ADDR", colhdr = "Address"}, {width = "40", alignment = "2", col_name = "what", colhdr = "What"}], body = []}
(gdb)
11 ^ сделано, потоки = []
(gdb)
12 ^ сделано, BreakpointTable = {nr_rows = "0", nr_cols = "6", hdr = [{ ширина = "7", выравнивание = "- 1", имя_столбец = "число", colhdr = "Num"}, {ширина = "14", выравнивание = "- 1", имя_столбец = "тип", colhdr = "Тип "}, {ширина =" 4" , выравнивание = "- 1", имя_столбец = "DISP", colhdr = "Disp"}, {ширина = "3", выравнивание = "- 1", имя_столбец = "включен", colhdr = "Enb"}, {Ширина = "10", выравнивание = "- 1", имя_столбец = "ADDR", colhdr = "Адрес"}, {ширина = "40", выравнивание = "2", имя_столбец = "что", colhdr = "Что "}], body = []}
(gdb)
Обратите внимание, что я успешно ввел GDB в Docker, поскольку GDB говорит:
"GNU GDB (GDB) Red Hat Enterprise Linux 7.6.1-114.el7 \ n"
В моей операционной системе (Debian): gdb --version
выводит:
GNU GDB (Debian 8.2.1-2 + b3) 8.2.1
В Debian я выполняю команду Docker: docker-compose -f ~/docker-services/dev/docker-compose.yml exec dev_rhel7 bash -c "gdb -i=mi"
и получаю машинно-ориентированный текстовый интерфейс.
Из предыдущего теста я понял, что это проблема emacs, а не Docker.
При вводе пути двоичного файла вместо опции -i = mi, он отлично читает символы: M-x gdb RETURN docker-compose -f ~/docker-services/dev/docker-compose.yml exec dev_rhel7 bash -c "gdb ~/babel_sandbox/build/foo"
, который выдает:
Текущий каталог - / home / drcoeurjoly / docker -services / dev /
Ошибка: вы не указали -i = mi в командной строке GDB!
ПРЕДУПРЕЖДЕНИЕ: переменная MY_UID не установлена. По умолчанию используется пустая строка.
1-inferior-tty-set / dev / pts / 3
2-gdb-set height 0
3-gdb-set non -stop 1
4-enable-pretty-printing
5-file-list-exe c -source-files
6-file-list-exe c -source-файл
приглашение 7-gdb-show
8-стек-информационный фрейм
9-нить-информация
10- список прерываний
11-thread-info
12-break-list
GNU GDB (GDB) Red Hat Enterprise Linux 7.6.1-114.el7
Авторские права (C) 2013 Free Software Foundation, In c.
Лицензия GPLv3 +: GNU GPL версии 3 или более поздней http://gnu.org/licenses/gpl.html
Это бесплатное программное обеспечение: вы можете изменять и распространять его.
ГАРАНТИИ НЕ ПРЕДОСТАВЛЯЮТСЯ в той степени, в которой это разрешено законом. Для получения подробной информации введите "show copying"
и "show гарантии".
Этот GDB был настроен как "x86_64-redhat- linux -gnu".
Для ошибки см. инструкции по созданию отчетов:
http://www.gnu.org/software/gdb/bugs/ ...
Чтение символов из /home/drcoeurjoly/babel_sandbox/build/foo...done.
(gdb) 1-inferior-tty-set / dev / pts / 3
Неопределенная команда: "1-inferior-tty-set". Попробуйте "help".
(gdb) 2-gdb-set height 0
Неопределенная команда: "2-gdb-set". Попробуйте "help".
(gdb) 3-gdb-set без остановки 1
Неопределенная команда: "3-gdb-set". Попробуйте "help".
(gdb) 4-enable-pretty-printing
Неопределенная команда: "4-enable-pretty-printing". Попробуйте "help".
(gdb) 5-file-list-exe c -source-files
Неопределенная команда: "5-file-list-exe c -source -файлы». Попробуйте "help".
(gdb) 6-file-list-exe c -source-file
Неопределенная команда: "6-file-list-exe c -source -файл". Попробуйте "help".
(gdb) Приглашение 7-gdb-show
Неопределенная команда: "7-gdb-show". Попробуйте "help".
(gdb) 8-stack-info-frame
Не определена команда: "8-stack-info-frame". Попробуйте "help".
(gdb) 9-thread-info
Неопределенная команда: "9-thread-info". Попробуйте "help".
(gdb) 10-break-list
Неопределенная команда: "10-break-list". Попробуйте "help".
(gdb) 11-thread-info
Неопределенная команда: "11-thread-info". Попробуйте "help".
(gdb) 12-break-list
Неопределенная команда: "12-break-list". Попробуйте "help".
(gdb)
Я также попытался поместить gdb -i=mi
в скрипт и вызывать его из emacs, но безрезультатно. Вызов напрямую из bash работал, а не из emacs.
Соответствующая информация:
Я не знаю, имеют ли значение dockerfile и docker -compose yml. Если это так, я создам репо.
Версии:
Хост: uname -a
Linux des26 4.19.0-6-amd64 # 1 SMP Debian 4.19.67-2 + deb10u2 (2019-11-11) x86_64 GNU / Linux
Emacs в хосте: emacs --version
GNU Emacs 26.3
GDB в хосте: gdb --version
GNU GDB (Debian 8.2.1-2 + b3) 8.2.1
Docker в хосте: docker --version
Docker версия 18.09.1, сборка 4c52b90
Docker - составить на хосте: docker-compose --version
docker - составить версию 1.21 .0, сборка неизвестна
Docker контейнер: cat /etc/redhat-release
CentOS Linux выпуск 7.5.1804 (Core)
GDB в docker контейнере: gdb --version
GNU GDB (GDB) Red Hat Enterprise Linux 7.6.1-114.el7
Эта проблема была Роберт Мекленбург сообщил здесь и здесь уже в августе 2017 года.