断点类型 | 使用场景 |
---|---|
debugger | 在js文件中,手动输入代码debugger; ,当js文件运行时,会在此处暂停 |
行断点 | 知道代码执行的区域,手动在某一行代码处设置断点 |
知足条件的行断点 | 知道代码执行的区域,手动在某一行代码处设置断点,可是只在知足某些条件下才会暂停 |
DOM断点 | 改变、删除一个DOM节点,或者删除这个DOM节点的子元素时设置断点 |
XHR断点 | 当XHR URL 包含某一字符串时设置断点 |
事件监听器断点 | 触发某些事件时设置断点 |
抛出异常断点 | 抛出异常时设置断点 |
开发环境下:在js源文件中,想在某个地方设置断点以查看后续代码的执行状况,手动在此处输入代码debugger;
,js文件运行的时候会在此处暂停。正则表达式
当开发者知道要在代码的哪一个地方打断点时,设置行断点调试。DevTools老是在这行代码执行以前暂停。
行断点设置的方法:express
切换到Sources面板闭包
打开想要调试的js文件app
找到代码所在的行框架
这行代码的左侧有一个数字,这个数字表明着这行代码在js文件中所在的行数。点击这个数字,会出现一个蓝色的图标,表示断点已经设置好。异步
和行断点同样,可是只有在某一条件为真时,DevTools才会在这行代码以前暂停。
设置方法:编辑器
切换到Sources面板函数
打开想要调试的js文件spa
找到代码所在的行debug
这行代码的左侧有一个数字,这个数字表明着这行代码在js文件中所在的行数,右击这个数字
选择 Add conditional breakpoint
,出现一个输入框
在输入框中输入条件表达式
按Enter
键激活此断点,当条件表达式为真时,DevTools会在这行代码执行以前暂停(条件性行断点的颜色为橙色)
设置的不少行断点能够在Breakpoints
小窗口作统一管理。
不勾选某一复选框,使对应断点处于“失效”状态,反之亦然
右键能够删除当前断点、删除全部断点、停用断点等,或者所有(不)勾选复选框使全部的断点(不)“生效”
停用断点(Deactivate breakpoints)的意思是:告知DevTools忽略全部的行断点,可是同时保持那些断点的状态,当激活断点(Activate breakpoints)时,这些断点能够继续起做用
当改变一个节点或者其子元素时,能够设置一个DOM断点:
点击Elements
面板
找到想要设置断点的元素
在此元素上右键
Break on
--> Subtree modifications
/ Attribute modifications
/ Node removal
Subtree modifications(子树修改):当前选中的元素,删除、增长其子代或者改变其子代的内容。修改子元素的属性或者当前选中元素有任何改变都不会触发此类型断点
Attributes modifications(属性修改):当前选中的元素,增长、删除其属性,或者修改某个属性值
Node Removal(节点移除):移除当前选中的元素
当XHR的请求URL包含某一特定的字符串时,能够暂停调试代码。DevTools会在XHR调用send()
那行代码的地方暂停。
点击Sources
面板
展开XHR Breakpoints
小窗口
点击“增长断点(Add breakpoint)”
输入一个字符串,只要在某个XHR的请求URL中包含此字符串, DevTools会暂停
按Enter
键确认
这个断点类型也算是比较经常使用的一个了,特别是当咱们调试别人的代码时,触发某个事件,想找到对应的代码。事件类型能够是很具体的,好比click
事件,也能够是某一类别的事件,好比“鼠标事件”。
点击Sources
面板
展开Event Listener Breakpoints
小窗口
勾选某一类别的事件或者是某一具体的事件
当代码抛出一个捕获的或者未捕获的异常时,能够设置此类型断点在代码抛出异常的地方暂停。
点击Sources
面板
点击Pause on exceptions
按钮,激活时按钮变成蓝色
(可选)勾选Pause On Caught Exceptions
表示只在捕获的异常处暂停,未捕获的异常不考虑
设置一个断点使代码在执行的过程当中暂停,以便进一步地调试代码。
当在某行代码暂停时,且此行代码包含某个函数,这个函数与咱们调试的bug又没有关系,此时能够点击Step over
图标直接进入下一行代码(函数正常执行,但DevTools不会进入到函数中去逐行调试代码)。
举例,假设正在调试如下代码:
function updateHeader() { var day = new Date().getDay(); var name = getName(); // A updateName(name); // D } function getName() { var name = app.first + ' ' + app.last; // B return name; // C }
当在A处暂停时,点击Step over
图标,DevTools会执行getName
函数里面的全部代码,即B和C(但不在B、C处暂停),而后会在下一行代码D处暂停。
当在某行代码暂停时,且此行代码包含某个函数,这个函数与咱们调试的bug又有关系,此时能够按Step into
图标进入到这个函数中作进一步的调试。
还如下面的代码举例:
function updateHeader() { var day = new Date().getDay(); var name = getName(); // A updateName(name); // D } function getName() { var name = app.first + ' ' + app.last; // B return name; // C }
当在A处暂停时,点击Step into
按钮,DevTools会执行这行代码,而后在B处暂停。
当在某个函数内部暂停时,若是确认函数剩余的代码与bug无关时,能够按Step out
图标让DevTools执行函数剩下的代码,而后跳出函数。
如下面的代码举例:
function updateHeader() { var day = new Date().getDay(); var name = getName(); updateName(name); // C } function getName() { var name = app.first + ' ' + app.last; // A return name; // B }
当在A处暂停时,点击Step out
图标,DevTools会执行函数getName()
剩余的代码即B,而后在C处暂停。
代码暂停以后,点击Resume Script Execution
图标可让代码继续执行。DevTools会继续执行代码直到碰到下一个断点处暂停,若是后面没有断点,脚本就一直执行到结束。
若是想忽略后面全部的断点,强制代码一直执行,能够点击Resume Script Execution
图标不松直到出现Force script execution
图标,而后把鼠标移动到这个图标上便可。
top
函数当在某行代码暂停时,在调用栈窗口(Call Stack
)的任意地方右键选择Restart Frame
,DevTools会在调用栈top
函数的第一行代码处暂停。top
函数就是指最后一个被调用的函数,在调用栈中位于最上面,因此叫top
函数。
如下面的代码举例:
function factorial(n) { var product = 0; // B for (var i = 1; i <= n; i++) { product += i; } return product; // A }
当在A处暂停时,点击Restart Frame
以后,代码会在B暂停,即便没有在B处设置断点。
值
当代码暂停时,能够在Scope
窗口查看、编辑某些属性值和变量值,这些属性和变量按照做用域又分属在不一样的地方,如局部做用域内、闭包内或者全局做用域内。双击值便可修改。
提示: 代码不在暂停状态时,Scope
窗口里面是空的
代码暂停时,能够在Call Stack
窗口查看当前的调用栈。若是有异步调用的代码,勾选上Async
复选框使异步调用函数也出如今调用栈中。
以上图为例: onClick
调用inputsAreEmpty
,inputsAreEmpty
调用getNumber1
,getNumber1
是top
函数。
DevTools当前高亮的代码属于蓝色箭头指向的inputsAreEmpty
函数,而高亮的这一行正是getNumber1
函数被调用的位置。
提示: 代码不在暂停状态时,Call Stack
窗口里面是空的
在调试的过程当中,常常会碰到第三方的库(如jQuery)或者框架,一般状况下,咱们的bug不是由这些库或者框架的代码引发的,可是调试的过程当中又不可避免地会进入到这些代码中,不胜其烦。这时,咱们可使用DevTools的黑盒功能,把这些三方脚本文件放到黑盒中,这样,调试的过程当中就不会进入到这些脚本中去了,Call Stack
窗口也不会显示和这些脚本相关的调用关系。
把一个js文件放入黑盒有三种方式:
打开对应的js文件
在编辑器窗口的任意地方右键
选择Blackbox script
在属于这个脚本的某个函数上右键
选择Blackbox script
打开设置
切换到Blackboxing
选项
点击Add pattern
输入脚本的文件名或者是文件名的正则表达式
点击Add
提示:也能够在这里统一管理黑盒中的全部脚本文件
Watch
窗口观察表达式值的变化
点击Add Expression
按钮添加一个新的表达式去观察
点击Refresh
按钮刷新当前全部表达式的值。调试的过程当中,这些表达式的值是自动变化的
把鼠标悬浮在一个表达式上面而后点击Delete watch expression
删除一个表达式
在Watch
窗口右键也能够进行添加、删除表达式操做
点击Format
修复bug的过程当中,咱们会常常改变某些代码而后查看效果。对于一些小的改动,不必去在源文件改而后从新加载页面查看效果,咱们能够直接在DevTools中修改。
在Sources
面板打开对应的文件
在编辑器窗口直接修改
按Command+S(Mac)
或者Ctrl+S
保存修改,DevTools会从新编译脚本。继续在页面上进行某些操做,好比点击事件,就能够看到修改代码的效果了。