背景
- 微软的vscode代码开发工具使用者越来越多,笔者本人很早就开始基于vscode开发,无论是python还是C++,很早就放弃了专用的IDE工具
- 开发代码肯定需要调试代码,IDE在这块可能会更强,vsode整体可能不及IDE,但平时一般也足够使用,要想方便调试,工具(插件)必须要用对,这样才能事半功倍
- 平时的工作中,无论是自己写的python代码工程,还是开源的代码,一般都会提供运行脚本,shell脚本中会把参数或者环境变量设置好,如train.sh、val.sh等shell脚本,这种方法极大方便了用户,但很多用户却不知道怎么调试,一堆的启动参数该怎么设置?vscode中的launch.json中当然也可以配置,但实在是太麻烦了,并且每个项目都配一次,也不利于管理
- 如果能够不去配置这些参数,能直接利用现有的shell脚本直接启动,那该多方便,好在有现成的方法可用
- 如果我们想调试简单的python脚本,vscode也很简单,此处就不再赘述。本文主要说明如何直接将shell脚本作为入口来调试
依赖
- 基础的python依赖,请大家自己查找资料安装即可
- 本文核心依赖只有一个:debugpy ,安装也很简单
-
pip3 install debugpy
配置
shell脚本配置
一个常规的shell脚本如下所示
#!/usr/bin/env bash
export CUDA_VISIBLE_DEVICES=1
CONFIG=projects/config.py
OUTPUT_DIR=/data/deeplearning/debug_test
RUN_CMD="python3"
cmd="${RUN_CMD} tools/train.py $CONFIG \
--work-dir $OUTPUT_DIR
echo "cmd: $cmd"
$cmd
如果想使用 debugpy调试,只需要将脚本中启动命令修改下即可
#!/usr/bin/env bash
export CUDA_VISIBLE_DEVICES=1
CONFIG=projects/config.py
OUTPUT_DIR=/data/deeplearning/debug_test
# RUN_CMD="python3"
RUN_CMD="python3 -m debugpy --listen 888 --log-to ${OUTPUT_DIR} --wait-for-client"
cmd="${RUN_CMD} tools/train.py $CONFIG \
--work-dir $OUTPUT_DIR
echo "cmd: $cmd"
$cmd
以上配置,相当于起了一个端口为888的服务。--log-to参数可以去掉,该参数主要是存放调试日志用的,可以不用。
vs code的launch.json配置
在此给出一个本人使用的简单配置作为参考
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "Python:debugpy调试样例",
"type": "python",
"request": "attach",
"connect": {
"host": "localhost",
"port": 888
},
"pathMappings": [
{
"localRoot": "${workspaceFolder}/",
"remoteRoot": "/data/deeplearning/code/debug_project"
}
],
"logToFile": true,
"justMyCode": false
},
]
}
核心配置是connect部分,此处的端口必须和刚才debugpy中的端口一致;
另外,name字段为自定义字段,该字段在启动调试的时候需要选择。
另外:使用vscode的workspace工作区,可以在该工作区下开发多个python工程,这些工程共享一个launch.json文件,此时把pathMappings中的remoteRoot设置为workspace路径。
这样设置后,调试其他所有工程的时候,都不需要修改launch.json配置文件,只需要调整每个工程里的shell脚本启动命令即可
开始调试
启动脚本
bash train.sh
直接正常运行启动脚本即可,启动后,项目并没有实际运行,而是挂起后等待调试(wait-for-client)
启动调试
- 设置断点 :必须先把断点设置好,不然启动后程序就直接运行了,可以在程序入口处直接设置一个断点
- 启动调试:如下所示,点击vscode左侧的调试按钮,上方选择刚才配置的name,点击绿色运行按钮即可
至此,如果程序没有错误,会自动运行至第一个断点处,各位就可以开启美妙的调试流程了。
后记
- 本文主要针对从shell脚本作为入口进行直接调试,其他调试不需要这么复杂
- 不过对于正式的python项目或者C++项目,还是建议大家提供shell脚本的作为启动脚本,你好我好大家好,也是一个好习惯。