vs2013下的python远程调试支持

vs2013下的python远程调试支持

vs2013下通过PTVS插件可以很好的支持本地Python调试,而其远程调试功能却形同鸡肋。因为虽然PTVS也提供了一个远程调试的功能,但却只能连接到远程的windows主机,无法连接到Linux主机。

本文尝试让vs2013能够直接连接到远程的Linux主机上进行调试。

1    设计方案

下面就是一个本文希望实现的设想:

首先准备一个PythonWrapper的Console应用程序,配置PTVS使其认为这是python的解释器:

当PTVS调用此程序时,PythonWrapper相应地调用远程Linux主机上的python。

这里需要注意的是,Python调试接口的输出不能直接发送给PTVS,这是因为PTVS对于网络连接做了一个限制,只接受来自于localhost的连接。

2    交互窗口的实现

PTVS实现了一个Python交互运行的窗口:

当在此窗口中执行第一条命令时,PTVS将调用我们的PythonWrapper,其调用参数如下:

分析一下此文件再结合PTVS的源码,不难发现PTVS的实现流程如下:

首先PTVS打开一个TCP服务端口,再将此端口做为参数调用指定的python脚本,在此脚本中python将连接到此端口,后继的所有命令都通过此网络连接进行。

这里需要注意的是PTVS只接受来自localhost的连接,因此我们需要在PythonWrapper中打开一个新的端口,让远程python连接到此端口,再将此端口上收到的所有数据转发到PTVS打开的服务端口上,反之亦然。

在做好此项工作之后,我们将PTVS目录下的py文件复制到Linux主机下。

修改这些py文件中写死的本机IP:127.0.0.1,将之修改为windows主机的IP,如:

    def connect(self, port):

        self.conn =socket.socket(socket.AF_INET, socket.SOCK_STREAM)

       self.conn.connect(('127.0.0.1', port))

         # start a new threadfor communicating w/ the remote process

       start_new_thread(self._repl_loop, ())

 最后修改PythonWrapper,让它自动连接到远程Linux主机上调用python并执行此脚本。

经过修改之后,就可以使用vs2013下的远程交互窗口了!

当然此时Linux下的python进程是没有任何控制台输出的。

vs2013下的python远程调试支持(2) :工程调试

当我们按F5启动python工程调试时,PTVS以下面的参数调用PythonWrapper:

在visualstudio_py_laucher.py中明确指明了此文件可以接受的参数含义:

# Arguments are:

# 1. Working directory.

# 2. VS debugger port to connect to.

# 3. GUID for the debug session.

# 4. Debug options (as integer - see enum PythonDebugOptions).

# 5. '-m' or '-c' to override the default run-as mode. [optional]

# 6. Startup script name.

# 7. Script arguments.

与交互窗口的修改一样,我们做同样的处理,所不同的是这里需要将要调试的Python文件复制到Linux主机上,而后相应修改文件路径。

经过此处理后,vs的python调试功能就可以正常使用了。

但当我们打开一个交互调试的窗口并输入语句时就悲剧了:

Unhandled exception in thread started by <bound methodDebuggerLoop.connect_to_repl_backend of<visualstudio_py_debugger.DebuggerLoop object at 0xb751d30c>>

Traceback (most recent call last):

  File"/usr/local/lib/python2.7/socket.py", line 228, in meth

    returngetattr(self._sock,name)(*args)

error: [Errno 111] Connection refused

Press Enter to continue . . .

想来除了调试用的端口外,PTVS还打开了一个交互调试用的端口。

查看visualstudio_py_debugger.py文件可以很容易发现此端口的痕迹:

    defcommand_connect_repl(self):

        port_num =read_int(self.conn)

       _start_new_thread(self.connect_to_repl_backend, (port_num,))

同样在PythonWrapper中将此端口做个转发,搞定!



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值