在 Docker 内部运行时,GDBServer 未启动或侦听端口

Apo*_*llo 6 debugging gdbserver rust docker clion

我试图在 Docker 容器内编译一个“hello world”Rust 程序,然后使用 GDBServer 和 CLion 远程调试它,但我认为gdbserver启动不正确。当我启动它时,我没有收到我期望的“进程已启动”和“正在侦听端口...”消息;我什么也没得到。

我已经在家庭网络上使用 Raspberry Pi 成功完成了此操作,但在使用 Docker 时无法使其工作。

我的最终目标是在 Digital Ocean Droplet 上部署此 Docker 容器,并从本地计算机进行远程调试。目前,我已在本地计算机上运行 Docker。

我正在 Mac (Mojave) 上工作,运行 Docker (v18.09),并启动一个 Docker 容器,该容器是使用 Rust 构建的 Debian 镜像并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
Run Code Online (Sandbox Code Playgroud)

我启动默认docker run --rm -it -v $(pwd):/source -p 7777:7777 schickling/rust启动的容器。bash

进入容器后,我使用rustc -g -o ./program ./src/main.rs它编译 Rust 程序,输出单个文件:program. 我可以很好地运行该程序(它只输出Hello World)。

当我gdbserver localhost:7777 ./program在 Docker 中运行时,终端就挂起。我让它静置了 20 分钟。我无法从 CLion 连接到它,甚至ping无法在我的 Mac 上工作。我尝试添加--debug输出my_waitpid (11, 0x0)然后挂起的标志。我也尝试过:7777127.0.0.1:7777、 和host:7777。我尝试了几个不同的端口。

我不确定我的问题出在哪里。可能 GDBServer正在运行,问题出在我的 CLion 设置中,但我对此表示怀疑。我有路径映射设置并且target remote argstcp:127.0.0.1:7777. 我刚刚得到Connection closed。符号文件和系统根目录是空的,但这在过去适用于我的 Raspberry Pi。

Apo*_*llo 6

我弄清楚了如何运行我的 Docker 容器,以便--privileged正确gdbserver运行。我还更新了一些 CLion 配置并使其正常工作。

有用的链接:

我更新的 docker 命令docker run --rm -it -v $(pwd):/source -p 7777:7777 -e container=docker --privileged schickling/rust

我的运行配置:

  • GDB:捆绑
  • “目标远程”参数:tcp:localhost:7777
  • Symbolfile:我编译的二进制文件的本地副本(通过卷从 Docker 复制)
  • 系统根目录:(空白)
  • Pathmappings:我在Docker中的项目目录的绝对路径,以及我本地机器上同一个项目目录的绝对路径(同一个卷)

奇迹般有效。

  • 代替“--privileged”,“--cap-add SYS_PTRACE”应该也可以工作,并且给予容器更少的权限。 (9认同)