GDBServer не запускается или не прослушивает порт при запуске внутри Docker - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь скомпилировать Rust-программу «hello world» внутри контейнера Docker, а затем удаленно отлаживать ее с помощью GDBServer и CLion, но я не думаю, что gdbserver запускается правильно.Когда я запускаю его, я не получаю ожидаемых сообщений «процесс запущен» и «прослушивание порта ...»;Я ничего не получаю.

Я успешно сделал это с Raspberry Pi в моей домашней сети, но не могу заставить его работать при использовании Docker.

Моя конечная цель - развернуть этот Docker.Контейнер на капле Digital Ocean и отлаживать удаленно с моей локальной машины.Пока у меня Docker работает на локальной машине.

Я работаю на Mac (Mojave), запускаю Docker (v18.09) и раскручиваю контейнер Docker, который образ, собранный из Debian с установленным Rust и gdbserver .GDBServer и Rust устанавливаются следующим образом:

# install curl (needed to install rust)
apt-get update && apt-get install -y curl gdb g++-multilib lib32stdc++6 libssl-dev libncurses5-dev

# install rust + cargo nightly
curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain nightly

Я запускаю контейнер с docker run --rm -it -v $(pwd):/source -p 7777:7777 schickling/rust, который по умолчанию запускается bash.

Оказавшись в контейнере, я компилирую программу Rust, используяrustc -g -o ./program ./src/main.rs, который выводит один файл: program.Я могу нормально запустить программу (она выводит только Hello World).

Когда я запускаю gdbserver localhost:7777 ./program в Docker, терминал просто зависает.Я оставил это на 20 минут.Я не могу подключиться к нему из CLion, и даже ping не работает с моего Mac.Я попытался добавить флаг --debug, который выводит my_waitpid (11, 0x0), а затем зависает.Я также пробовал :7777, 127.0.0.1:7777 и host:7777.Я пробовал несколько разных портов.

Я не уверен, где моя проблема.Возможно, GDBServer запущен и проблема в моей настройке CLion, но я сомневаюсь в этом.У меня есть настройки отображения пути, и target remote args - это tcp:127.0.0.1:7777.Я просто получаю Connection closed.Файл символов и Sys Root пусты, но это работало в прошлом с моим Raspberry Pi.

1 Ответ

0 голосов
/ 20 декабря 2018

Я понял, как запустить контейнер Docker как --privileged, что позволяет gdbserver работать правильно.Я также обновил некоторые из своих конфигов CLion и получил их в работу.

Полезные ссылки:

Мой обновленныйКоманда docker docker run --rm -it -v $(pwd):/source -p 7777:7777 -e container=docker --privileged schickling/rust

И моя конфигурация Run:

  • GDB: в комплекте
  • аргументы 'target remote': tcp: localhost: 7777
  • Symbolfile: локальная копия моего скомпилированного двоичного файла (скопирована из Docker благодаря томам)
  • Sysroot: (пусто)
  • Pathmappings: абсолютный путь к каталогу моего проекта в Docker и абсолютныйПуть к тому же каталогу проекта на моей локальной машине (тот же том)

Работает как чудо.

...