JS调试之Chrome Sources面板

提到JS的调试,写过JS的同志都知道:简单,console.log解决一切问题。其实JS调试还有很多好用的工具可供选择,使用起来会比直接log更为高效,但是我在工作中很少见到有同事会使用这些工具,老菠的这个系列就是向大家介绍如何使用这些工具的

认识Chrome JS 调试工具

首先,让我们单击键盘上的F12,选中“Sources”一栏,你应该会看到下面的这个界面:


图0.1 Chrome 调试工具 Sources 栏

我们可以把它分成三个部分:文件区域,代码展示/编辑区域,调试功能区域(我自己起的名)。

  • 文件区域用来展示文件,你可以在文件区域通过单击选择文件。

  • 被选中的文件会展示在代码展示/编辑区,在这里可以对选中的文件进行编辑,保存,添加断点等操作。

  • 在调试功能区,我们可以对代码进行调试,查看程序运行的情况。

下面让我们分别详述这几个区域。

1. 文件区域

这是一个文件选择面板,就跟vscode左边的文件栏一样,它又分为几个子栏目:

1.1 Page栏

这一栏想必大家都见过,展示当前网页上的所有文档,基本上就是页面所使用的JS,HTML,CSS,图片这些文件(如下图)


图1.1 文件区域-Page栏

1.2 Filesystem栏

这一栏允许我们选择本地文件:

图1.2 加载本地文件

这个功能使得chrome可以作为一个IDE使用(可能没人会这么用哈),你可以加载本地项目,在编辑区修改,保存

1.3 Overrides栏

这一栏的作用是,可以用本地文件覆盖Page里面的文件。它的用法是,在本地创建一个和Page栏结构完全相同的目录结构,例如,打开百度首页,来到Page一栏,可以看到一个形如top -> www.baidu.com -> index的目录结构

图1.3 百度首页Page

然后我在本地也创建一个同样结构的目录,index.html里的内容是一行文本“hello world”:
图1.4 本地Override目录

然后回到百度,进入Overrides一栏,选择刚才创建好的目录,然后刷新页面,发现页面已经被替换成我的index.html,当然JS文件也可以如此操作。被覆盖的文件上可以看到一个紫色小圆点,说明该文件被本地文件替换
图1.5 载入Overrides

1.4 Content scripts栏

插件的content scripts

1.5 Snippets栏

这个是一个非常实用的功能,允许我们创建代码片段,直接在chrome里运行。
如果你是个web开发者,大概有过这样的经历:想运行一段js代码做实验,怎么办呢?随便找个网页,F12,到console里敲入代码,直接运行。因为浏览器是我们最容易获取的JS运行环境,所以这么做可以让我们快速完成JS小实验。但在console窗口写代码不是很舒服,换行、缩进都很麻烦,调试起来也很烦。这时候可以用Snippets,在这里你可以很舒适地编辑代码,并运行


图1.6 创建代码片段

后面我将借助一段snippet来介绍调试工具的使用

2. 代码展示/编辑区域

这个区域允许我们

  • 查看、编辑代码,或浏览其他资源文件
  • 在调试过程中添加断点,查看变量的值等

3. 调试功能区域

上文提到,在“代码展示/编辑区域”可以设置断点,当程序运行至断点处,就会暂停运行,这是断点调试的基础逻辑。

我们用下面这段代码为例

function getSum(a, b){
     const op1 = Number(a);
     const op2 = Number(b);
     const sum = op1 + op2; 
     if(isNaN(sum)){
         throw new Error("One of the operation number can't be converted to a number");
     }
     return sum;
}

 function printSum(a, b){
     console.log(getSum(a, b));
 }

 printSum(6, 6);

如果我在第5行打上断点,然后运行程序,那么当程序运行到这一行的时候就会停止:


图3.1 添加断点

如上图所示,当程序在断点处停止时,调试工具允许我们做很多事:

  • 我们可以在“代码展示/编辑区域”查看所有变量的值
  • 在Watch里也可以访问所有处于该scope的变量,也可以在这里对任意表达式求值
  • 查看程序中的线程(Threads),以及线程所处的状态
  • 查看程序运行的调用栈(Call Stack),可以选择转移至调用栈的任意一层
  • 查看当前所处的作用域(Scope)

我们也可以选择让程序继续运行来进行调试,Chrome提供了多种方法:

3.1 断点调试工具栏

这里以下面这段代码为例,来解释断点调试工具是如何使用的

function getSum(a, b){
     const op1 = Number(a);
     const op2 = Number(b);
     const sum = op1 + op2;  // 断点B
     if(isNaN(sum)){
         throw new Error("One of the operation number can't be converted to a number");
     }
     return sum;
}

 function printSum(a, b){
     const sum = getSum(a, b)  // 断点A
     console.log(sum);
 }

 printSum(6, 6);
  • 继续(Resume)按钮,让程序继续运行,直到遇到下一个断点。


    图3.2 继续按钮

    当程序停在断点A时,点击继续,程序会运行到断点B,然后停住。再次点击继续,程序会运行至结束。

  • 跨过(step over next function call)按钮:让程序前进一行。


    图3.3 跨过按钮

它的作用是运行下一行代码,然后停住,如果下一行代码里有函数调用,Chrome是不会进入该函数的,而是直接将该函数跑完。当程序停在断点A时,点击跨过,程序会进入函数getSum,停在函数getSum的第一行。了解“调用过程”的同志可以这么理解,这个操作前后,调用栈的内容是不变的。

  • 跨入(step into next function call)按钮:它的作用同样是运行下一行代码,然后停住。
    图3.4 跨入按钮

    不同点在于,如果下一行代码里有函数调用,Chrome会进入该函数。调用栈里会增加一个函数。

  • 跨出(step out of current function call)按钮:它的作用是运行当前函数其余的代码,并从函数中出来,然后停住。
    图3.5 跨出按钮

    当程序通过了断点A,停在断点B时,点击跨出,函数getSum的余下代码会运行完,最后停在函数printSum的第二行

  • 下一步(step)按钮:执行下一条指令?
    图3.6 下一步按钮

    说实话,老菠没发现这个按钮跟“跨入”按钮功能上有什么区别,有知道的老铁还请不吝赐教。

  • 断点开关(Deactivate/Activate breakpoints)按钮:它可以使所有断点失效或生效。
    图3.7 断点开关按钮

    当处于失效档位时,调试器中的所有断点都不会起作用,程序不会再断点处中断

  • 异常中断开关(Pause on exceptions):处于激活状态时,一旦发生异常,程序就会在异常发生处中断


    图3.8 异常中断开关

    图3.9 开启异常中断开关后,程序会在异常处中断

小结

这一篇,老菠介绍了chrome的sources面板,和断点调试的一些基础概念。希望对你有所帮助

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,468评论 5 473
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,620评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,427评论 0 334
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,160评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,197评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,334评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,775评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,444评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,628评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,459评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,508评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,210评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,767评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,850评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,076评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,627评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,196评论 2 341