Skip to main content

如何进行远程调试

在程序开发过程中,经常需要我们去配置各种开发环境,并且如果本地与线上存在环境依赖的不同,还可能导致出现一些不知原因的bug,比较推荐使用的便是Docker

在日常开发过程中,项目代码往往存放在远程的主机中,我们通常利用本地机器通过SSH连接到远程主机进行开发。

那么,如何进入到远程主机docker内部进行代码调试呢?本节以使用较为广泛的vscode为例,介绍如何通过vscode远程到docker容器内部进行c++/python部分的开发/调试工作。其他的IDE,感兴趣的用户可以自行Google。

要完成这个主要有两步骤:

  • 步骤一、配置远程主机的docker
  • 步骤二、配置vscode

下面详细介绍每一步的具体操作!

步骤一:远程主机docker配置

1. 启动docker

为了能够让vscode能够ssh连接到docker中,我们需要在启动docker容器的时候为其分配端口号。具体的启动方式如下:(8022为宿主端口,可修改,防止冲突。22为docker内的固定端口,默认即可)

docker_image_name=nvcr.io/nvidia/pytorch:22.12-py3
docker run -it --gpus all --ipc=host --shm-size 1G --ulimit memlock=-1 --ulimit stack=67108864 -p 8022:22 -v `pwd`:/workspace -w/workspace --name="debug_tp" --cap-add=SYS_PTRACE $docker_image_name bash

2. docker内增加密码

passwd

3. 安装openssh

apt-get update -y
apt-get install -y openssh-server openssh-client vim gdb

4. 修改系统配置

vim /etc/ssh/sshd_config

修改以下三句:

Port 22
PermitRootLogin yes
PubkeyAuthentication yes

启动服务: /etc/init.d/ssh start 或者 /etc/init.d/ssh restart

启动服务后可以进行连接验证:ssh -p 22 root@127.0.0.1,如果启动失败,会报Connection refused的错误,成功则会让你输入密码,并有Welcome字样提示。

6. 编译torchpipe为debug模式

进入到torchpipe目录

## debug模式,
DEBUG=1 pip3 install -e .
## debug模式, 并且子线程异常不转发到主线程,就地宕机,以便定位位置
DEBUG=1 NCATCH_SUB=1 pip3 install -e .

步骤二:vscode配置

1. vscode连接远程docker

按如下方式配置ssh的config文件,注意User为root,启动vscode,安装Remote-SSH插件,配置config如下:

Host docker_debug  #docker_debug为名字,随便起
HostName xxxx #服务器IP地址
User root
Port 8022 #步骤一中启动docker容器的时候设定的服务器的端口号
国内用户

如果觉得网速过慢,参考 离线安装vscode server 及其置顶评论。

2. vscode安装扩展

在扩展商店内:

  • 搜索 c++ 安装相应语言扩展

  • 搜索 python 安装相应语言扩展

3. vscode配置

点击 run - open configurations, 按照如下场景完成配置文件launch.json的配置。

3.1 情境一:仅调试Python部分代码

配置文件:

{
"name": "Python: Current File",
"type": "python",
"request": "launch",
"program": "${file}", // 或者修改为指定的某个文件
"console": "integratedTerminal",
"justMyCode": true,
"cwd": "${workspaceFolder}/examples", //修改为合适的目录,如果没有全路径指定文件
"env": {
"DEBUG": "1", //用于调试jit编译的c++代码
"LD_LIBRARY_PATH": "${LD_LIBRARY_PATH}:/path/to/you/want",//用于加载额外的动态库
}
}

调试步骤: 选择要跑的文件,利用鼠标设置断点,启动"Python: Current File"即可进行调试! 注: 如果程序中出现找不到相对路径的bug, 可以按照这样修改cwd配置。"cwd": "${fileDirname}"

附加方法:不启动IDE,快速调试Python方法:

如果是很简单的python代码,也可以直接使用pdb进行调试,无需启动IDE,在需要停止的地方加上如下代码设置断点。

import pdb;

pdb.set_trace()

3.2 情境二:仅调试C++部分代码

配置文件

// 根据 ``which python`` 的结果修改 "program": "/usr/bin/python"
{
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) Attach",
"type": "cppdbg",
"request": "attach",
"program": "/usr/bin/python", /* My virtual env */
"processId": "${command:pickProcess}",
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
}

调试步骤:

可以直接执行你的python文件, 如python3 a.py , 然后启动 (gdb) Attach 绑定这个python进程; 如果python进程过快退出,可睡眠一段时间,即可进行调试

3.3 情境三:python和C++联调

参考链接: Example debugging mixed Python C++ in VS Code

配置文件

直接将上面两个配置文件都配置上就行了。


{
"version": "0.2.0",
"configurations": [
{
"name": "Python: Current File",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal",
"justMyCode": true,
"cwd": "${fileDirname}",
"env":{
"DEBUG":"1",
}
},

{
"name": "(gdb) Attach",
"type": "cppdbg",
"request": "attach",
"program": "/usr/bin/python", /* My virtual env */
"processId": "${command:pickProcess}",
"MIMode": "gdb",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
}
]
}

调试步骤:

  1. 首先启动"Python: Current File",等断点停了之后,
  2. 启动“(gdb) Attach”,就可以完成python和C++联调了。

附加方法:不启动IDE,快速调试方法:

如果不想启动IDE,可以用gdb命令行快速启动调试

## gdb 调试
gdb python
# set environment DEBUG=1 # <= 如果需要jit编译c++代码,可以以此编译为debug模式
run your.py

宕机后追踪堆栈: bt

4. vscode头文件补全(可选)

修改 项目配置 ./.vscode/c_cpp_properties.json 补充相应头文件路径

{
"configurations": [
{
"name": "Linux",
"includePath": [
"${workspaceFolder}/**",
"/opt/conda/lib/python3.8/site-packages/torch/include",
"/usr/local/cuda/targets/x86_64-linux/include"
],
"defines": [],
"compilerPath": "/usr/bin/gcc",
"cStandard": "gnu17",
"cppStandard": "gnu++14",
"intelliSenseMode": "linux-gcc-x64"
}
],
"version": 4
}