【breakpoint】不依赖浏览器控制台的JavaScript断点调试方法

标签: breakpoint Aardwolf javascript调试 Web前端 javascript断点调试 | 发表时间:2013-11-14 21:47 | 作者:ryan
出处:http://www.webryan.net

【背景描述】

随着浏览器的逐渐强大,绝大多数情况下的代码调试都是可以通过浏览器自带的一些调试工具进行解决。然而对于一些特殊情况仍然无法享受到浏览器的强大调试能力,比如QQ客户端内嵌web的调试(虽然说QQ目前已经可以编译开发者工具,但是仍需要安装指定文件包或工具)、非正常浏览器web、移动场景下的内嵌等场景。 基于这个场景我们团队已经在nohost下引入了weinre,并得到了广泛的使用。 但是weinre是有一定的局限性,只能做到console.log和DOM查看等,不能支持断点调试。这里之前老文章已经有过一些描述,可参见 http://www.webryan.net/2013/04/talk-about-remote-debugging-on-mobile-phone/


  111413_1344_breakpoint1.png

本文重点讲解不依赖浏览器控制台能力,单纯通过JavaScript方式来实现断点调试的能力,为大家解决问题提供另一种思路和方法。首先会给出工具的使用方法,让大家有感性认识,然后再讲解具体实现原理。

【测试使用】

1、cmd命令下执行”npm install breakpoint -g”(npm安装不赘述,-g为了全局安装且注册bin命令)
2、cmd命令行下执行”breakpoint”(会给出使用帮助,并默认启动测试目录:可以直接通过URL访问);
3、开启两个现代浏览器如chrome和safari,分别打开提示的两个URL。
111413_1344_breakpoint2.png

好了,简单三步就可以在浏览器里测试了。这个ui/index.html操作方法如下:

111413_1344_breakpoint3.png

111413_1344_breakpoint4.png


是不是很简单:),下面我们来给出实战例子;

【实战使用】

【参数说明】

Usage: breakpoint -d htdocsDir -r passbyRule

-d 指定本地静态目录,这里的HTML文件head里会被注入调试脚本。

-r 指定透传规则,通常用于将CGI请求透传给现网服务器;如果是需要透传给指定服务器,则需要在本地hosts文件中做一下指向;

-h 当存在多网卡的情况下,可以使用-h指定某一IP;

breakpoint执行后会在本地启用3个端口,80(用于提供访问服务)、8000(用于控制器)、8500(用于文件重写);

【实战举例】

假设我们域名是:abc.com;本地静态文件(HTML、CSS和JS等)目录是:e:\svn\trunk\htdocs\,那么可以通过”breakpoint -d e:\svn\trunk\htdocs”将所有的请求转发到本地目录,比如:http://abc.com/a.html会返回本地目录e:\svn\trunk\htdocs\a.html的内容。

111413_1344_breakpoint5.png

但是此时直接在浏览器中访问abc.com是不行的,需要先通过fiddler等工具将abc.com指向本地IP(参考Step 1的)。

111413_1344_breakpoint6.png

然后再访问 http://10.64.53.85:8000/ui/index.html 打开控制器;访问: http://abc.com/a.html 访问资源内容。

111413_1344_breakpoint7.png

不难发现,访问内容已经成功走了本地,且自动在头部加上了调试脚本,这就搞定了。

但是往往调试的时候,我们又希望某些文件访问现网资源或者其他服务器的资源,这个时候,可以通过-r参数来正则匹配放过对应的请求。比如:abc.com指向本地IP后,希望abc.com/cgi-bin/下的所有请求都发送到现网。 那么只需要执行”breakpoint -d e:\svn\trunk\htdocs\ -r cgi-bin”即可。

【原理分析】

如何通过JavaScript来实现断点调试?

断点调试的核心问题就是要让脚本在某行代码暂停执行,那么Aleksander Kmetec同学给出的解决方案是:通过在每行JavaScript前面加一个断点函数。而断点函数是 通过AJAX的同步属性来阻塞浏览器

那么JavaScript修改前后的情况如下:

 

修改前 修改后

var a = 1;

var b =2;

function test(){

var c = ‘init’;

c=’change’;

}

Break();var a = 1;

Break();var b =2;

Break(); function test(){

Break(); var c = ‘init’;

Break(); c=’change’;

}

这样通过break函数里发起同步AJAX请求即可确定断点位置和阻塞浏览器执行后面的脚本了,真是很聪明的做法。

【breakpoint结构图】

111413_1344_breakpoint8.png

1、通过浏览器发起网页请求;

2、请求通过fiddler等方式指向到我们的重写服务,重写服务根据请求链接来处理流程。如果是匹配了-r的正则规则,则直接转发到现网服务器,否则则请求本地-d目录下的内容。

3、透传的内容直接不处理,其他的内容会判断:1、HTML文件则会默认在head第一行加入调试脚本的script(该脚本包括调试所需要的方法,如break();) 2、JS文件则会在每一行脚本前增加break();函数的调用。

4、重写服务返回数据给浏览器

5、当浏览器执行JS的时候,会先遇到break();则发起同步的XHR请求,阻塞住浏览器的执行。

6、如果通过调试服务UI界面设置过断点,调试服务则会hold住在break()里的XHR请求,直到调试服务UI发出新的命令(比如跳过、下一行等)

OK,原理就讲到这里。有问题可以随时给我留言。


相关 [breakpoint 浏览器 控制台] 推荐:

【breakpoint】不依赖浏览器控制台的JavaScript断点调试方法

- - Ryan's Blog (郭亨的博客)
随着浏览器的逐渐强大,绝大多数情况下的代码调试都是可以通过浏览器自带的一些调试工具进行解决. 然而对于一些特殊情况仍然无法享受到浏览器的强大调试能力,比如QQ客户端内嵌web的调试(虽然说QQ目前已经可以编译开发者工具,但是仍需要安装指定文件包或工具)、非正常浏览器web、移动场景下的内嵌等场景. 基于这个场景我们团队已经在nohost下引入了weinre,并得到了广泛的使用.

Silk 浏览器:Google? No!

- 橙子 - 爱范儿 · Beats of Bits
前苹果员工, Blogger Chris Espinosa 指出, Amazon 的 Silk 浏览器技术,让 Amazon 不能把自己置于 Google 的控制之下. Silk 在云端为用户组织和优化网页,之后再下载到本地. 这样做的结果是, Amazon 能掌握用户在网络上的一举一动. 不仅仅包括在 Amazon.com 下的订单.

浏览器检测

- - JavaScript - Web前端 - ITeye博客
1.navigator 对象. 由于每个浏览器都具有自己独到的扩展, 所以在开发阶段来判断浏览器是一个非常重要的步骤. 虽然浏览器开发商在公共接口方面投入了很多精力, 努力的去支持最常用的公共功能;但在现实中,浏览器之间的差异,以及不同浏览器的“怪癖”却是非常多的,因此客户端检测除了是一种补救措施,更是一种行之有效的开发策略.

浏览器缓存机制

- Leo Pay - Learning Correcting Improving
Cache-Control 是最重要的规则. 这个字段用于指定所有缓存机制在整个请求/响应链中必须服从的指令. 这些指令指定用于阻止缓存对请求或响应造成不利干扰的行为. 缓存指令是单向的,即请求中存在一个指令并不意味着响应中将存在同一个指令. cache-control 定义是:Cache-Control = "Cache-Control" ":" cache-directive.

浏览器进化史

- Hao Zeng - 爱范儿 · Beats of Bits
这张图非常直观,纵轴是浏览器存在的时间线,横轴代表使用此浏览器的用户数量. 出现在图片中的浏览器包括:Netscape、Opera、IE、Firefox、Safari 和 Chrome. Netscape:1994 年诞生,1995 年用户基数达到最大(2.x 版本). 1998 年 Netscape 被创业杀手 AOL 收购,再加上微软的冲击,逐渐走向衰败,2008 年彻底终结.

百度浏览器评测

- 溪梦 - 月光博客
  百度今年在客户端方面的动作不断,目前已经推出了百度输入法、百度电脑管家、百度安全卫士、百度影音,百度压缩软件,而现在,百度客户端领域的重要产品百度浏览器已经进入了测试阶段,不久后将正式对外发布.   百度在其公关稿里称:“百度浏览器具备以下几点特性:第一,整合百度平台的热门应用,使用户一键触达;第二,采用沙箱安全技术将用户电脑与病毒木马隔离;第三,融合百度搜索技术的智能地址栏;第四,界面设计简洁易操作……百度希望通过浏览器的改进,推动互联网的良性发展,吸引更多的用户来使用互联网,增进使用的频度与时长,最终推动搜索这个媒体平台的发展和巩固.

最新浏览器评测

- John - Solidot
Tom's Hardware发布了最新的浏览器评测,在Windows 7 和Mac OS X Lion系统上分别对Chrome 13、Firefox 6、IE9、Opera 11.50和Safari 5.1执行了近40项测试. 测试结果是:Windows 7上的排名依次是Chrome 13、Firefox 6、IE9、Opera 11.50,Safari 5.1;Mac OS X上是Safari,Chrome,Opera,Firefox.

appcache的浏览器限制

- - 前端观察
appcache(之前的manifest)是html5的一个特性,用来实现浏览器端的资源缓存,是webapp的一个重要工具. 虽然大部分浏览器的最新版都它提供了支持,但是各浏览器的实现却有些差异,我们来看一下~~. 数据来源: browserscope. 可以看出,桌面端的浏览器除了IE10都没有限制,移动端的基本都有各种限制.

IE 浏览器的创新

- - 博客 - 伯乐在线
译者按:IE 曾是 web 创新的先驱,但最近几年因为对 web 标准的支持落后于其他 浏览器以及低版本 IE 的各种 bug 而被人诟病. Zakas 带我们回顾了 IE 在 web 发展过程中扮演的辉煌角色,让我们能以一个更客观的眼光来看待 IE. 看完这篇文章,也许大家都会对 IE 浏览器有一定的改观,这也是我翻译这篇文章的目的.

浏览器性能测试

- - Taobao QA Team
浏览器作为一个浏览网页的平台,自身的性能直接影响网页的解析速度、渲染,而浏览器的性能一般又是由浏览器的内核来决定. 虽然浏览器的评测方法有很多,但是权威的浏览器性能测试方法主要有以下几种:. Acid3测试是检测浏览器与Web标准兼容性的主要方法,也是目前行业中最权威的测试. Acid3是由网页标准计划小组(Web Standards Project, WaSP)设计,测试焦点集中在ECMAScript、DOM Level 3、Media Queries和data: URL,浏览器开启 http://acid3.acidtests.org/测试页面后,页面会不断加载功能、直接给予分数.