2023年6月29日发(作者:)
爬⾍必备-如何使⽤ChromeDevTools花式打断点原⽂:Pause Your Code With Breakpoints作者:Kayce Basques Chrome DevTools & Lighthouse技术作家参考这份指南,结合⾃⼰⼿上的vue项⽬进⾏实践,可以说对原指南进⾏了plus,因为实践过程中会有很多指南之外的新发现。主要内容包括如下:代码⾥的某⼀⾏上打断点有条件的⾏级断点管理⾏级断点⼏种不同的DOM级断点确保⽬标函数在作⽤域中预览⼏种不同的breakpoint类型代码⾏级(Line-of-code)断点DOM变化级断点XHR/Fetch断点事件Listener断点Exception 断点Function 断点Feedback使⽤breakpoints去为我们的JavaScript代码打断点。这个指南涉及了在DevTools上适⽤的每⼀种breakpoint类型,并且会讲解如何使⽤并设置每种类型的断点。如果是想学习如何在Chrome DevTools上调试代码,可以看Get Started with Debugging JavaScript inChrome DevTools预览⼏种不同的breakpoint类型众⼈皆知的breakpoint类型是line-of-code。但是line-of-code型breakpoint有的时候没法设置(其实就是没法在代码左边点出⼀个绿点来),或者如果你正在使⽤⼀个⼤型的代码库。通过学习如何和何时使⽤这些不同类型的breakpoint debug,会⼤⼤节约你的时间。断点类型Line-of-codeConditional line-of-codeDOMXHREvent ListenerExceptionFunction当你想Pause的时候使⽤代码具体某⼀⾏(其实就是没法在代码左边点出⼀个绿点来)代码具体某⼀⾏,但是只有在⼀些条件为true时在改变或者移除⼀个DOM节点或者它的DOM⼦节点时当⼀个XHR URL包含⼀个string pattern在运⾏了某个特定事件后的代码上,例如click事件触发在抛出了⼀个caught或者uncaught的exception时当⼀个函数被调⽤时Line-of-code breakpoints如果你知道⾃⼰想在哪⼀具体的代码⾏检查代码,会⽤到line-of-code breakpoint。DevTools会在这⾏代码执⾏前暂停住。为了在DevTools某⼀⾏设置断点:1.点击Scources tab2.打开包含你想打断点的⽂件3.跳到那⼀⾏4.点击那⼀⾏的左边,⼀个蓝⾊或者绿⾊的图标图1: 在某⼀⾏设置⼀个断点下⾯的图是我本地调试的图,只有部分有定义,解构,回调,return等有需要process的地⽅,才可以打断点。代码⾥⽣成⼀个Line-of-code断点调⽤debugger在那⼀⾏暂停。debugger等价于⼀个line-of-code断点,这可以让端点直接出现在代码中,⽽不是在DevTools UI中,可以在任何机器上进⾏debug。('a');('b');debugger;('c');有条件的⾏级断点在我们知道⾃⼰需要检查的⼀个特定代码⾏时,使⽤有条件的⾏级断点,但是只有在⼀些其他满⾜时才可以暂停。如何设置⼀个有条件的⾏级断点:1.点击Sources tab2.打开代码⽂件3.跳到那⼀⾏4.在那⼀⾏Right-click,⿏标右键(此处有surprise!)5.选择Add conditional breakpoint。⼀个对话框会出现在那⼀⾏代码的下⾯。6.在对话框中键⼊条件7.按下enter去激活breakpoint。⼀个橘⾊icon会出现在左边。图2:在某⼀⾏设置条件⾏级断点Add breakPoint是普通的⾏级断点,Add conditional breakPoint是有条件的⾏级断点。Never Pause Here会让这⾥永远不进断点。Blackbox Script可以让当前打开的⽂件⿊盒化,⽤不进⼊断点。点击Add conditional breakPoint后,会出现dialog:点击Blackbox Script后,⽂件头部会出现The script is blackboxed in debugger:在我的代码中,添加了mediaType==='text'的条件,⽽mediaType还会有'img','mini'等类型,但是通过添加conditional breakpoint,我可以只在类型是text的时候pause,亲测有效。管理line-of-code断点图3:Breakpoints⾯板展⽰了的2个断点图4:使⽤Breakpoints⾯板去禁⽤或者移除line-of-code断点。可以对单个断点启⽤,禁⽤,移除;对所有断点启⽤,禁⽤,移除;对除当前断点外的断点启⽤,禁⽤,移除。选中checkbox禁⽤断点右键移除断点Deactivate断点,会保留他们激活时的状态,这样⽅便再次激活,右上⾓的label为蓝⾊激活状态时,Breakpoints全部为Deactive状态,⽩⾊带阻塞斜杠时,为断点激活状态。 DOM变化级断点Subtree modifications。当当前选中的节点的child被移除或新增时触发,或者是child的内容发⽣改变时。在child的节点属性发⽣变化时不会触发,或者当前节点改变时不会触发。(亲测当⾃⼰被移除时都不会触发)Attributes modifications。当当前选中的节点新增属性,移除属性,或者属性值发⽣变化时触发。Node Removal。当当前选中的节点被移除时触发。在改变或者移除⼀个DOM节点或者它的DOM⼦节点时会⽤到DOM change breakpoint。图5:创建⼀个DOM change breakpoint的上下⽂菜单设置DOM级断点的步骤如下:1.单击Elements tab2.选中我们想为其设置breakpoint的元素3.右键元素4.悬浮在Break on上,选择Subtree modifications,Attribute modifications或者Node removal。我会在这样⼀段代码上测试Subtree modifications,Attribute modifications或者Node removal⼏个DOM型断点。
。变蓝了就表⽰开启了,此时默认有未捕获的异常时进⼊断点。3.选中Pause On Caught Exceptions,可以使得捕获的异常也进⼊断点。图7:在⼀个未捕获的异常处暂停捕获到⼀个CORS异常:通过异常捕获断点,我们可以进⼊到axios,以及⼆次封装的httpclient中,去看Exception是如何被处理的,出现问题时,可以精确定位。有些时候可能不是我们业务代码的bug,是第三⽅库的bug,通过这样的断点,我们可以在业务代码没有问题的情况下,深⼊到第三⽅库找问题(虽然⼀般都是⾃⼰业务代码的问题)。什么是caught和uncaught的exception?通过throw,catch对exception做处理的,属于caught exception没有对异常做捕获的exception,可能导致程序崩溃的exception,就属于uncaught exception亲测:默认捕获的异常时uncaught类型,开启Pause on caught exceptions,会让uncaught和caught类型的均进⼊断点。Function Breakpoints假设我们想对某⼀个函数做debug的话,例如调⽤debug(functionNmae),functionName是我们想debug的函数。你可以在你的代码中像插⼊()⼀样,插⼊debug(),或这在控制台⾥直接输⼊debug()。debug()相当于在某个函数的第⼀⾏设置了⼀个line-of-codebreakpoint。function sum(a, b) { let result = a + b; // DevTools pauses on this line. return result;}debug(sum); // Pass the function object, not a ();
可以⽤来确保⽬标函数位于scope中如果我们想要debug的函数不在当前作⽤域中,DevTools会抛出⼀个ReferenceError。(function () { function hey() { ('hey'); } function yo() { ('yo'); } debug(yo); // This works. yo();})();debug(hey); // This doesn't work. hey() is out of scope.如果从DevTools控制台调⽤debug(),确保⽬标函数在范围内可能会很棘⼿,有⼀个办法:1.函数作⽤域某⼀⾏设置⼀个line-of-code breakpoint。2.触发断点3.在断点出暂停时调⽤debug()嗯,上⾯这个⽅法很鸡肋,亲测。实验:function foo(){ function bar() { ('bar'); } debug(bar); bar();}foo(); // 进⼊断点debug(bar); // 抛出Uncaught ReferenceError: bar is not defined
关于断点调试的问题也就是这么多了,掌握这些技巧在后⾯爬⾍做js逆向的时候会经常⽤到,希望⼤家能做个基本了解。
发布者:admin,转转请注明出处:http://www.yc00.com/web/1687985695a63936.html
评论列表(0条)