我正在尝试在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
标志。我也尝试过:7777
、127.0.0.1:7777
和host:7777
。我尝试了几个不同的端口。
我不确定我的问题在哪里。可能是 GDBServer正在运行,问题出在我的 CLion 设置中,但我对此表示怀疑。我设置了路径映射,target remote args
tcp: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 中的项目目录的绝对路径,以及本地机器上同一项目目录的绝对路径(同一卷)
就像一个魅力。