首页 > 技术文章 > 如何远程断点调试本地localhost项目

xxcanghai 2016-02-02 13:08 原文

前言

对于一般开发网站的IDE自带的服务器是都跑在 localhost 地址上的。(如下图的asp.net)

image

 

而这种地址是只能在本机通过 localhost 或 127.0.0.1 地址访问到,而无法直接通过本机的内网IP地址访问的。

所以就无法实现在虚拟机中访问本地localhost站点,以及在虚拟机访问时的代码断点,调试,以及用手机访问本地站点等。

虽然可以使用IIS等web服务器发布本地IP上,来实现外部访问,但是依然无法实现代码断点,当然可以用附加进程调试,不是本文讨论范围。
接下来就来讲解如何使用本机内网地址访问localhost上运行的网站

实现思路

期望目标是:在虚拟机中访问真实机的内网IP地址来访问真实机中运行的localhost的站点。

遂,在真实机中开启Fiddler,来充当虚拟机的代理服务器,去向真实机请求资源,同时由Fiddler修改虚拟机的请求报文,将虚拟机的Request请求报文中的真实机的IP地址改为localhost。

image

设置Fiddler

要用到的软件只有一个,Fiddler,没有的可以去官网下载:http://www.telerik.com/fiddler
进入Fiddler的Tools的FiddlerOptions...选项,Connections选项卡
勾选上“Allow remote computers to connect”选项,允许其他计算机连接

image


如果你的端口没有被占用的话默认应该是 8888 端口

设定虚拟机的代理服务器

之后进入虚拟机,设置系统代理为当前真实机的IP的8888端口,推荐使用我之前文章中写的“自动设置代理服务器批处理
设置完成后去查看设置情况, 10.0.1.11 是我的真实机的内网地址,端口8888。
 image

 

设置完成后从虚拟机访问 真实机的IP+8888 端口,如果能显示出FiddlerEchoService就说明代理没问题。

image


此时在虚拟机中访问百度已经可以被fiddler抓到了。
关于如何鉴别流量是本机的还是从远程访问的很容易,看Fiddler的Process列即可:

注意:本机流量可以追查到流量进程名及PID,而远程流量是无法显示进程的。

image

上图第一条就是由火狐发出的请求,而下面的流量都是从虚拟机发出的请求,没有进程名。

设置Fiddler自动化修改数据报文

现在从虚拟机已经可以通过我的真实机做代理向外访问了,所以接下来需要从代理服务器Fiddler中修改数据包即可。
需要一款FiddlerScript Editor的软件,可以从官网下载:http://www.telerik.com/download/fiddler/fiddlerscript-editor
关于FiddlerScript   的使用和介绍在之前的一篇文章中已经提到一些。

选择跳转至 OnBeforeRequest 函数。

通过右侧的API文档得知,oSession对象的属性hostname表示不包含端口号的HTTPHeader的host字段值。

image


在此函数最后写上如下代码,目的是要在数据发来请求后修改数据报文,将指向本机的URL修改localhost地址。

image

保存后回到虚拟机。访问10.0.1.11的localhost服务9527端口,可以发现,所有数据包都被修改为localhost地址
同时,我真实机上跑的localhost的服务也可以被内网其他计算机访问了。

image

 

手机端访问

前提是手机连接的wifi必须要和真实机在同一网段。
如图,虽然连接了同一网段的wifi下,但不设置也是无法访问的。

image

进入手机wifi设置,高级设置,代理设置,修改为“手动”
IP地址为我的真实机IP,10.0.1.11,
端口为Fiddler的监听端口:8888

image

 

设置了代理服务器后,就可以顺利通过IP地址访问localhost的服务了,当然也可以同步加断点,调试等。

image

注意事项

1,注意在使用过程中Fiddler不能关闭,关闭了就没有代理服务器了。
2,注意在使用完成后,把代理服务器设置删除,否则虚拟机/手机就无法正常上网了。

相关链接

工具下载(GitHub):

1、自动设置本机系统代理服务器.bat

2、删除本机代理服务器设置.bat

其他文章:

1、利用Fiddler断点功能,模拟网络问题

2、[批处理]自动设置本机系统代理服务器

推荐阅读