Chrome 中的 JavaScript 断点设置和调试技巧

来源:互联网 发布:mfc socket编程实例 编辑:程序博客网 时间:2024/06/04 19:16

部分内容摘抄自:http://han.guokai.blog.163.com/blog/static/136718271201321402514114/


1.条件断点:在断点位置的右键菜单中选择“Edit Breakpoint...”可以设置触发断点的条件,就是写一个表达式,表达式为 true 时才触发断点。

2.调用栈(Call Stack)在断点停下来时,右侧调试区的 Call Stack 会显示当前断点所处的方法调用栈,比如有一个函数 g() 其中又调用了函数 f() ,而我在 f() 中设置了一个断点,那么我在 console 中执行函数 g() 的时候会触发断点,其调用栈显示如下:

Chrome 断点设置 - hanguokai - 韩国恺的博客
最上面是 f(),然后是 g()。调用栈中的每一层叫做一个 frame,点击每个 frame 可以跳到该 frame 的调用点上。
Chrome 断点设置 - hanguokai - 韩国恺的博客
此外,还可以在 frame 上用右键菜单重新开始执行当前 frame,也就是从该 frame 的开始处执行。比如在函数 f() 的 frame 上 Restart Frame, 断点就会跳到 f() 的开头重新执行,context 中的变量值也会还原。这样结合变量修改和编辑代码等功能,就可以在当前 frame 中反复进行调试,而不用刷新页面重新触发断点了。

3.异常时断点
在界面下方能看到Chrome 断点设置 - hanguokai - 韩国恺的博客按钮,它是设置程序运行时遇到异常时是否中断的开关。点击该按钮会在3种状态间切换:
  1. Chrome 断点设置 - hanguokai - 韩国恺的博客默认遇到异常不中断
  2. Chrome 断点设置 - hanguokai - 韩国恺的博客遇到所有异常都会中断,包括已捕获的情况 
  3. Chrome 断点设置 - hanguokai - 韩国恺的博客仅在出现未捕获的异常时才中断
主要解释一下状态2和状态3的区别

try{ throw 'a exception';}catch(e){ console.log(e);}

上面 try 里面的代码会遇到异常,但是后面的 catch 代码能够捕获该异常。如果是所有异常都中断,那么代码执行到会产生异常的 throw 语句时就会自动中断;而如果是仅遇到未捕获异常才中断,那么这里就不会中断。一般我们会更关心遇到未捕获异常的情况。
4.//@ sourceURL 给 eval 出来的代码命名
有时候一些非常动态的代码是以字符串的形式通过 eval() 函数在当前 Javascript context 中创建出来,而不是作为一个独立的 js 文件加载的。这样你在左边的内容区就找不到这个文件,因此很难调试。其实我们只要在 eval 创建的代码末尾添加一行 “//@ sourceURL=name“ 就可以给这段代码命名(浏览器会特殊对待这种特殊形式的注释),这样它就会出现在左侧的内容区了,就好像你加载了一个指定名字的 js 文件一样,可以设置断点和调试了。下图中,我们通过 eval 执行了一段代码,并利用 sourceURL 将它命名为 dynamicScript.js ,执行后左侧内容区就出现了这个“文件”,而它的内容就是 eval 的中的内容。

Chrome 断点设置 - hanguokai - 韩国恺的博客

还可以看看这个给动态编译出来的 CoffeeScript 代码命名的示例

var coffee = CoffeeScript.compile(code.value)+ "//@ sourceURL=" + (evalName.value || "Coffeeeeeeee!");eval(coffee);

实际上,//@ sourceURL 不仅仅可以用在 eval 的代码中,任何 js 文件、甚至是 Javascript Console 输入的代码都可以用,效果一样!

阅读全文
0 0
原创粉丝点击