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



我正在尝试在Docker容器中编译一个"hello world"Rust程序,然后使用GDBServer和CLion远程调试它,但我认为gdbserver启动不正确。当我启动它时,我没有获得"进程启动"和"在端口上侦听..."我期待的消息;我一无所获。

我已经在我的家庭网络上用树莓派成功地做到了这一点,但在使用 Docker 时无法让它工作。

我的最终目标是将这个 Docker 容器部署在数字海洋液滴上,并从我的本地机器远程调试。现在,我已经在本地机器上运行了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启动。

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

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

我不确定我的问题在哪里。可能是 GDBServer正在运行,问题出在我的 CLion 设置中,但我对此表示怀疑。我设置了路径映射,target remote argstcp:127.0.0.1:7777.我只是得到Connection closed.符号文件和系统根是空的,但这过去在我的树莓派上已经有效。

我想出了如何像--privileged一样运行我的 Docker 容器,从而允许gdbserver正确运行。我还更新了一些 CLion 配置并让它工作。

有用的链接:

  • https://visualgdb.com/tutorials/linux/docker/
  • 在运行 systemd 的 docker 容器中运行 gdb
  • 当我从 Docker 容器内部运行它时,gdb 没有遇到任何断点
  • https://github.com/mdklatt/clion-remote

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

和我的运行配置:

  • GDB:捆绑
  • "目标远程"参数:TCP:本地主机:7777
  • 符号文件:我编译的二进制文件的本地副本(由于卷而从Docker复制)
  • 系统根:(空白)
  • 路径映射:我在 Docker 中的项目目录的绝对路径,以及本地机器上同一项目目录的绝对路径(同一卷)

就像一个魅力。

相关内容

最新更新