vscode 远程调试 linux python_vscode c语言 调试的时候怎么输入


一、目的

本文的主要解决的问题:手上有性能较差的轻便办公本和云服务器。怎么用VS Code 让两者产生关系,并经过一系列的操作使得我们能够在轻便地用办公本(such as MBP)调用服务器强劲的计算性能。

除了C++,其他东西我现在全用vscode来写了,爽的一笔,毫无竞争对手。——某知友
VS Code 自出生以来就能看出其强大,同宇宙第一大IDE( Visual Studio ) 一以贯之的的设计风格,但又和VS 存在本质的区别——轻便的编辑器和无限可能的后端。
VS Code是一个平台,提供了Debug API,Source Control API,Language Extension,允许整个生态基于这些 API开发Extension。

二、方法

VS Code 涵盖各种插件,本文通过各种插件实现用服务器运行本地代码、同步本地和服务器代码、本地调试服务器代码。

2.1 jupyter 大法好

jupyter 提供了一套完整了remote 的服务器方案。jupyter 有千千万万的优点,但是就不是IDE,为什么不把 Jupyter 的remote 解决方案移植到VS Code 中来,既有了jupyter 各种花里胡哨的表现能力又有了了IDE该有的代码编辑能力,顺带还通过Jupyter完成了本地代码编写+远程服务器计算的方案。真是两全其美。

既然要在Jupyter上做文章,第一步就是在服务器上安装jupyter 相信这一步大家都很熟悉了,不熟悉的话,我这里随便推个知友的连接 豆豆:Jupyter Notebook介绍、安装及使用教程。其中比较重点的就是在服务器端需要设置让jupyter监听所有IP。那怎么设置呢?

就是打开jupyter_notebook_config.py


vim .jupyter/jupyter_notebook_config.py


加入如下代码


c.NotebookApp.ip = '*'
c.NotebookApp.open_browser = False
c.NotebookApp.port = 8888
c.NotebookApp.allow_remote_access = True


其中 ip = “*” 指的是监听所有ip 发过来的请求 ,其他几项字面意思。

设置好之后直接在明两行输入jupyter notebook,就出现了这段冗长的东西,我们等下要用到的就是URLs: 这段东西。


vscode 远程调试 linux python_vscode 暂停运行_02

图1. 截图 From ubuntu


OK, 设置清楚了服务器端的东西,现在,把目光转移到我们的本地主机上。既然有了URLs, 我们的思路通过VS Code 直接连接到这个服务器的这个窗口(图一所示,端口号8888)。好了现在就需要VS Code 的插件登场了。安装插件jupyter


vscode 远程调试 linux python_vscode c语言 调试的时候怎么输入_03

图2. 搜索插件jupyter直接安装

安装好之后,直接按快捷键 command+shift+p , 调出Python: Specify Jupyter server URI。 选择type in the URI for Jupyter server。


vscode 远程调试 linux python_服务器_04

图3. 调出 URI 输入

然后输入 jupyter的URI:服务器的地址加端口(such as https://127.0.0.1:8888) + "/?token=blabla#$%%&^&*^%%$" 。 完成以上简单步骤,开袋即食。如下看看效果。


vscode 远程调试 linux python_服务器_05

图4. jupyter 在vs code 中的使用

TIPs:如果在URI中直接用服务器的地址,有可能会出现服务器未响应的可能(我就经历了,我也不懂为什么,有懂的小伙伴赶紧告诉我,很急)。 我的解决方案是用ssh 映射服务器端口到本地端口,在终端输入下面代码:


ssh ubuntu@remote_address  -L 127.0.0.1:8888:127.0.0.1:8888


OK ,简而言之,就是把远程的8888端口映射到本地的8888端口。然后我们在输入URI的时候,URI 的输入地址就是本地地址(127.0.0.1:8888)。

2.2 好用的ptvsd

这个python包的出现完全是针对vscode远程调试所开发,它的基本原理就是:预设本地和服务器存在相同的代码文件(在要调试的文件开头需要有专门的识别代码,后文会提到),首先服务器端运行代码,程序运行到这段识别代码后,就会暂停,等待本地IDE的调试指令,当本地调试指令开始,两边就确立了同步关系,在这个时候本地就能接收远程返回的调试参数。从而达到目的。

其实也非常简单,步骤分为三步:

第一步:准备代码,在代码开头植入以下代码:


import ptvsd
ptvsd.enable_attach(address = ('127.0.0.1', 8848))
ptvsd.wait_for_attach()


这几段代码只在远程服务器起作用。它的意思呢,就是远程服务器监听 127.0.0.1:8848 的消息,等待和本地IDE的py交易。

当然这份代码如前面所说,需要拷贝两份分别在本地和服务器。通常我们的方法是通过ssh 把文件传到服务器上去。代码如下:


scp demo.py ubuntu@remote_address:/path


OK 远程端口已经准备好了,之后就是设置VS code 的参数访问远程服务器的8848端口。

第二步:准备本地VScode的启动参数。所有的一切都可以在Vscode 的 lunch,json 里设置,


{
            "name": "Remote",
            "type": "python",
            "request": "attach",      //这个必须attach
            "host": "remote_address", //云服务器地址
            "port": 8848,             //刚才在代码里设置的端口
            "pathMappings": [
                {
                "localRoot": "${workspaceRoot}",
                "remoteRoot": "/home/vito/Mac"  //云服务器文件的跟目录
                }
            ],
        },


设置调试的方式为“Remote”.

第三步: 调试,确保两边的代码完全相同,然后在远程段启动代码。


vscode 远程调试 linux python_vscode 暂停运行_06

图5. 远程程序进入等待本地调试的响应

vscode 远程调试 linux python_vscode 暂停运行_07

图6. 本地和远程两端同步运行代码

当然可能也会存在2.1提到的,无法直接连接到远程服务器。so 可以接着沿用上面的小tips.