Vscode Python Remote Debug & Remote Docker Container Debug

"Vscode Debug"

Posted by Stephen on January 2, 2021

前言

配置基于VS Code的Python远程调试环境,并且基于VS Code 的Python 远程调试docker容器中代码。

解决本地物理机无需安装相关的依赖库和依赖包进行代码调试

环境

环境名 系统 ip 项目目录
本地 window 192.168.5.133 D:\hello_ftp_sync_debug
远程服务器 linux 192.168.10.200 /home/workspace/hello_world
远程docker容器 linux 172.17.0.2 /hello_world

正文

1、准备

拓展安装“Python” 使用pip在本地计算机和远程计算机安装:pip install ptvsd

2、使用ptvsd实现远程调试

第一步:配置launch.json

配置launch.json文件,它的位置一般在VS Code当前的工作目录下的/.vscode/launch.json。没有找到也没关系,等会配置时会自动创建。

在VS Code的侧边栏 -> debug -> python -> 远程连接 -> 输入主机名,端口号 配置lauch.json文件内容如下:

{
    // Use IntelliSense to learn about possible attributes.
    // Hover to view descriptions of existing attributes.
    // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": "Python: 远程连接",
            "type": "python",
            "request": "attach",
            "connect": {
                "host": "192.168.10.200",
                "port": 5678
            },
            "pathMappings": [
                {
                    "localRoot": "${workspaceFolder}",
                    "remoteRoot": "/home/workspace/hello_world"
                }
            ]
        },
        {
            "name": "Python: 当前文件",
            "type": "python",
            "request": "launch",
            "program": "${file}",
            "console": "integratedTerminal"
        }
    ]
}

第二步:创建ptvsd的python文件

在本地的main.py文件写入以下内容

import ptvsd 
# Allow other computers to attach to ptvsd at this IP address and port.
ptvsd.enable_attach(address =('192.168.8.133',5678)) ## 禁止使用0.0.0.0
# Pause the program until a remote debugger is attached
ptvsd.wait_for_attach()

import sys
while True:
    print(sys.platform)
    print("****************这只是个测试****************")

第三步:复制到远程服务器并注释本地ptvsd

将main.py文件上传到远程Linux服务器上面(为了方便同步远程和本地的文件,建议采用ftp-sync文件同步插件), 确保本地和远程的测试文件内容完全相同,然后将本地main.py的头部代码注释掉,切记不要删除!本地代码如下所示:

# import ptvsd 
# # Allow other computers to attach to ptvsd at this IP address and port.
# ptvsd.enable_attach(address =('192.168.8.133',5678)) ## 禁止使用0.0.0.0
# # Pause the program until a remote debugger is attached
# ptvsd.wait_for_attach()

import sys
while True:
    print(sys.platform)
    print("****************这只是个测试****************")

第四步:在Linux远程服务器上输入以下命令行

利用ptvsd运行程序main.py

python3 -m ptvsd --host 192.168.10.200 --port 5678 --wait main.py

## 没成功过
#如果要以包的方式运行程序,只需在前面加上 -m , 例如 
python3 -m ptvsd --host 192.168.10.200 --port 5678 --wait -m hello_world

第五步:在本地执行remote attch debug

在远程执行ptvsd命令后,服务器程序进入等待debug状态,此时在本地代码中设置断点,选择remote attach 执行debug,出现以下debugging toolbar,则表示配置成功;否则,请看备注,或者自行google解决问题

此时,本地端出现正常的debug界面,远程端出现

$ python3 -m ptvsd --host 192.168.10.200 --port 5678 --wait main.py
linux
****************这只是个测试****************

3、Ftp-sync 文件同步

前面我提到本地和远程服务器的文件同步的问题,其实只需要在VScode中安装扩展插件ftp-sync 就可以完美地解决这个问题,下面介绍其配置过程。

ftp-sync配置:

在安装好ftp-sync插件后,使用快捷键Ctrl+Shift+P打开菜单,输入ftp-sync,出现八种可用的ftp-sync命令,我们首先使用Ftp-sync: Init打开ftp-sync的配置文件ftp-sync.json,配置内容如下: 在这里插入图片描述

{
    "remotePath": "/home/workspace/hello_world",     //服务器代码的存放位置 ,只能绝对路径
    "host": "127.0.0.1",     //远程服务器的ip地址
    "username": "root",		 //服务器的username
    "password": "123456",    //服务器的password
    "port": 22,              // 端口号,sftp默认为22,ftp默认为21
    "secure": false,
    "protocol": "sftp",      //协议 sftp 或者 ftp 均可
    "uploadOnSave": false,
    "passive": false,
    "debug": false,
    "privateKeyPath": null,
    "passphrase": null,
    "agent": null,
    "allow": [],
    "ignore": [
        "\\.vscode",
        "\\.git",
        "\\.DS_Store"
    ],
    "generatedFiles": {
        "extensionsToInclude": [
            ""
        ],
        "path": ""
    }
}

常用命令解析:

  1. Ftp-sync: Init //初始化Ftp-sync配置文件

  2. Ftp-sync: Upload File //同步本地文件或文件夹到远程

  3. Ftp-sync: Download File //从远程下载文件

  4. Ftp-sync: Local to Remote //同步本地文件到远程

  5. Ftp-sync: Remote to Local //同步远程文件到本地

  6. Ftp-sync: Commit // 提交

  7. Ftp-sync: Sync current file to Remote 同步当前文件到远程

4、使用ptvsd实现远程服务器的容器调试

第一步:先配置使用ptvsd实现远程调试

配置使用ptvsd实现远程调试

第二步:启动指定docker容器

启动容器,映射ip端口,挂载本地目录到容器目录中

$ docker run -it --rm --name pt1 -v $(realpath ~/workspace/hello_world):/hello_world -p 8888:8888 -p 5678:5678 pytorch/pytorch:1.9.0-cuda10.2-cudnn7-devel 

第三步: 容器内安装ptvsd

$ cd /hello_world
pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple

第四步:容器内查看ip地址以及启动ptvsd

$ apt-get update && apt install net-tools
$ ipconfig
$ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.2  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:02  txqueuelen 0  (Ethernet)
        RX packets 10907  bytes 30934846 (30.9 MB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 9890  bytes 589169 (589.1 KB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        loop  txqueuelen 1000  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

$ python -m ptvsd --host 172.17.0.2 --port 5678 --wait main.py

第五步:在本地执行remote attch debug

在远程执行ptvsd命令后,服务器程序进入等待debug状态,此时在本地代码中设置断点,选择remote attach 执行debug,出现以下debugging toolbar,则表示配置成功;否则,请看备注,或者自行google解决问题

此时,本地端出现正常的debug界面,远程端出现

$ python -m ptvsd --host 172.17.0.2 --port 5678 --wait main.py
linux
****************这只是个测试****************

备注

通常你选择的端口可能会存在被其他程序占用的情况,此时会报Address already in use的错误,建议使用Linux命令 netstat -anp 查询可用的端口号,或者用命令netstat -tunpl|grep 端口号查看占用当前端口的进程,并kill(此方法慎用)。

参考

  1. 配置基于VS Code的Python远程调试环境
  2. VS Code + ptvsd :本地调试远程服务器代码的神器
  3. How to remote debug python code in a Docker Container with VS Code