VSCode是MS推出的一款免费的开源并跨平台的轻量级代码编辑器,内置Git和Debug等常用功能,强大的插件扩展功能以及简单的配置几乎可以打造成任意编程语言的IDE。本文简单聊一下其本地attach和remote debug功能。

默认在vscode中打开py文件可以直接使用断点调试,使用的Debug模式为:Python: Current File (Integrated Terminal),这是针对vscode中当前打开的文件。

对于独立于vscode之外运行程序的debug,根据是否和vscode位于同一主机可以分为local attach和remote debug。

0. 配置环境

下面以python为例简单讲一下debug功能。

  • 安装vscode版本1.31.1
  • python第三方库ptvsd
  • vscode插件python

实际使用根据需要下载最新版本即可。

1. 本地Local Attach

打开vscode工程目录下的.vscode/launch.json文件,添加如下内容:

{
"version": "0.2.0",
"configurations": [
{
"name": "Python: Local Attach",
"type": "python",
"request": "attach",
"port": 12345,
"host": "127.0.0.1",
"pathMappings": [
{
"localRoot": "${workspaceFolder}",
"remoteRoot": "."
}
]
},
]
}

如果没有launch.json,新建一个即可,或者打开左侧debug view,选择打开launch.json,vscode会打开或者创建一个默认的json配置文件,然后将上面configurations列表中的内容复制到已有的launch.json中即可。

新建一个python脚本文件./Main.py

# -*- coding:utf-8 -*-
import datetime, time
# import VSCodeDebug
import ptvsd host = "127.0.0.1" # or "localhost"
port = 12345
print("Waiting for debugger attach at %s:%s ......" % (host, port))
ptvsd.enable_attach(address=(host, port), redirect_output=True)
ptvsd.wait_for_attach() while True:
time.sleep(1)
cur_date = datetime.datetime.now()
print cur_date

脚本中的host和port必须和launch.json中当前debug模式中host与port的值一致。

ptvsd模块安装:python -m pip install --upgrade ptvsd

调试步骤如下:

  1. 直接运行Main.py或者在命令行中运行python Main.py
  2. 代码中加入断点
  3. F5启动Local Attach调试模式

注意:

  • 这个过程不能先启动local attach,否则会连接失败;
  • 首先要执行脚本,脚本执行到ptvsd.wait_for_attach()会挂起,等待vscode的链接;
  • 启动attach,连接到挂起状态的脚本,脚本继续执行;
  • 该过程中脚本和vscode没有严格的client与server角色划分;

结果如下:

2. 远端Remote Debug

远程调试可以让我们在本地使用vscode调试远程主机上运行的程序,而只需要在本地安装vscode。

在上面.vscode/launch.json文件"configurations"列表中加入下面的内容作为Remote Debug的配置:

{
"name": "Python: Remote Debug",
"type": "python",
"request": "attach",
"port": 12345, // valid port in remote host
"host": "1.2.3.4", // replace with your remote host IP
"pathMappings": [
{
"localRoot": "${workspaceFolder}",  //the path of the folder opened in VS Code, can be replaced by real path, such as: "D:\\Projects\\Cnblogs\\Alpha Panda"
       "remoteRoot": "~/demo" // Linux example; adjust as necessary for your OS and situation.
}
]
},

这里有两点需要注意:

  • 脚本中和launch.json需要替换远端主机有效的IP地址和Port;
  • pathMappings列表中字段localRoot和remoteRoot分别表示本地和远端工程目录的路径;

远端脚本添加如下代码:

import ptvsd

host = "1.2.3.4" # remote host ip
port = 12345 # remote host valid port
ptvsd.enable_attach(address=(host, port), redirect_output=True)
ptvsd.wait_for_attach()

由于remote debug要求本地和远端程序的源代码必须一致,因此

本地脚本添加如下代码:

# import ptvsd

# host = "1.2.3.4" # remote host ip
# port = 12345 # remote host valid port
# ptvsd.enable_attach(address=(host, port), redirect_output=True)
# ptvsd.wait_for_attach()

此外,本地和远端都需要安装ptvsd模块。

这样启动远端的脚本程序,本地vscode添加断点,启用新加的Python: Remote Debug模式debug即可进入调试环境。

本地可以通过ptvsd来启动远端的程序:

python -m ptvsd --host 1.2.3.4 --port 12345 --wait -m myproject

3. Others

经过上面操作,Debug 配置中有两种debug模式:

  • Python: Local Attach
  • Python: Remote Debug

python插件默认会提供几种不同的debug configs.

如Python: Django,Python: Flask等可以参考一下。

只有上面两种没法直接调试vscode中的文件,下面添加本地的debug 模式的配置:

{
"name": "Python: Current File (Integrated Terminal)",
"type": "python",
"request": "launch",
"program": "${file}",
"console": "integratedTerminal"
},

总之,vscode无论出身还是功能以及美观简单易用性等都是无可挑剔的,经常使用sublime text的话,可以尝试一下vscode.

如果使用Pycharm进行python开发可以参考一下我的另一篇博文:Pycharm远程调试原理及配置

参考:

https://code.visualstudio.com/docs/python/debugging

https://code.visualstudio.com/docs/editor/variables-reference

vscode local attach 和 remote debug的更多相关文章

  1. Java:Remote Debug

    Java  Remote Debug -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,add ...

  2. [Reomting Debug] 巧用VS 的remote debug 功能远程调试程序 经验分享.

    前言: 有时候我们Dev(开发人员)需要debug tester(测试人员)或者customer(客户)的环境,可tester的机器上没有Code,是不是有点着急? 而且是多版本应用且tester 发 ...

  3. How to use VS2012 remote debug Windows Azure Cloud Services

    Background: Windows Azure Cloud Services 可以在本地调试,使用Visual Studio 2012 + 模拟器 Emulator.但是模拟器的工作状态和环境和真 ...

  4. VS 开发工具中的Remote Debug 功能远程调试程序经验分享

    前言: 有时候我们Dev(开发人员)需要debug tester(测试人员)或者customer(客户)的环境,可tester的机器上没有Code,是不是有点着急? 而且是多版本应用且tester 发 ...

  5. QT Creator 环境使用 remote debug 调试 arm 程序

    这里使用的 4.8.5 QTE 环境,之前尝试过远程使用 GDB 来调试板子上的 QT 程序,但是没成功.没有调试手段比较痛苦,今天又花了点时间,居然搞定了.粗做记录. 工具版本: 1. QtCrea ...

  6. golang remote debug和docker debug

    在编写 Go 代码的时候,因为很多时候都是需要调试服务器上的代码的,作为一个年长的工程师,肯定不能用 log.Printf 来调试问题,所以我选择了 delve 这个工具,通过 delve 我可以像本 ...

  7. iOS web remote debug 正确的姿势

    在使用iOS Remote debug需要做以下准备 1. iOS devices 开启java script and web inspector 开启方式如下: 2. mac OS 自带的Safar ...

  8. paip. java resin 远程 调试 java resin remote debug

    paip. java resin 远程 调试 java resin remote debug 作者Attilax  艾龙,  EMAIL:1466519819@qq.com 来源:attilax的专栏 ...

  9. Tomcat Remote Debug操作和原理

    操作篇 这部分主要讲,如何开启tomcat远程调试,并佐以实例.本文方式适用于windows和linux. 假设有两台机器,A是tomcat服务器所在机器,B是IDE安装机器.A和B可以是同一台机器, ...

随机推荐

  1. gitlab-ci-runner安装

    前言 什么是CI/CD? CI (Continuous Integration) 持续集成, CD (Continuous Delivery) 持续部署 个人理解 本地开发代码, 提交远程仓库 仓库接 ...

  2. Solr的中英文分词实现

    对于Solr应该不需要过多介绍了,强大的功能也是都体验过了,但是solr一个较大的问题就是分词问题,特别是中英文的混合分词,处理起来非常棘手. 虽然solr自带了支持中文分词的cjk,但是其效果实在不 ...

  3. java基础 —— properties 使用

    目的:分别读取myPro*.properties文件内容,复习一下项目中读取资源配置文件的方法. 项目下载地址:http://pan.baidu.com/s/1jHuzPxs 项目结构如图,ReadP ...

  4. 干货,分享一次完整的CentOS升级内核脚本。

    一.安装常用包 yum install wget vim screen net-tools lrzsz -y wget -O /etc/yum.repos.d/epel.repo http://mir ...

  5. RabbitMQ和Kafka到底怎么选?

    前言 开源社区有好多优秀的队列中间件,比如RabbitMQ和Kafka,每个队列都貌似有其特性,在进行工程选择时,往往眼花缭乱,不知所措.对于RabbitMQ和Kafka,到底应该选哪个? Rabbi ...

  6. Filter、Interceptor、Aspect 区别及实现

    Fliter 过滤器 请求在到达Controller之前进行与返回去之后 调用 入参为 reuqest,response,chian,过滤器获取不了具体调用哪一个类,哪一个方法. 实现: 1.继承 F ...

  7. 4K视频在线看,网速跟不上怎么办?

    灿烂的阳光,温柔的风,二狗子一打开窗,觉得春天到了. “天气这么好,宅家玩电脑.”二狗子说着,点开了爱奇怪 App,最近一期的版本更新提到了支持 4K 视频播放,这是二狗子等了好久的功能. “今天我就 ...

  8. Vue.js-09:第九章 - 组件基础再探(data、props)

    一.前言 在上一章的学习中,我们学习了 Vue 中组件的基础知识,知道了什么是组件,以及如何创建一个全局/局部组件.不知道你是否记得,在上一章中,我们提到组件是一个可以复用的 Vue 实例,它与 Vu ...

  9. 谈一谈对象池SafeObjectPool能干什么

    前言 首先从ado.net的连接池开始了解,数据库操作通常是 new SqlConnection(). Open(). 使用完后 Close(),整个过程相当耗时,特别是频繁建议套字接连接的过程.ad ...

  10. netty之NioEventLoopGroup源码分析二

    大家好,今天我准备死磕NioEventLoopGroup的源码,首先讲下概念,NioEventLoopGroup 它是一个线程池,存放NioEventLoop,一个数组,今天打算先看下这行代码的初始化 ...