如何进行远程调试
在程序开发过程中,经常需要我们去配置各种开发环境,并且如果本地与线上存在环境依赖的不同,还可能导致出现一些不知原因的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
}
]
}
]
}
调试步骤:
- 首先启动"Python: Current File",等断点停了之后,
- 启动“(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
}