《WebKit 技术内幕》学习之十四(2):调式机制

news2024/10/5 14:00:45

2 实践——基础和性能调试

        Chromium开发者工具基本上沿用了Web Inspector的功能,所以这一节主要以该开发者工具作为介绍的对象,一起了解开发者工具提供的功能和一些基本的用法,有些用法其实在之前已经介绍过,这里可能为了系统性考虑会再次提及一下,但是不做太多的重复性介绍。主要包括两个部分,基础功能部分的调试和性能部分的调试。

2.1 基础调试

        基础部分的调试大致可以分成DOM元素的修改等访问、CSS样式值修改、日志和控制台信息,以及JavaScript代码单步调试、断点设置等部分功能。

        开启或者关闭开发者工具的功能快捷键是F12或者在浏览器地址最右侧的按钮中调用开发者工具即可。还有一个直接的方法就是右键单击一个HTML元素,然后在右键菜单中能够找到“Inspect Element”选项,那就是审查该元素,这种方式也可以打开开发者工具,如图14-9是使用该选项打开开发者工具并显示“Inspect Element”选项所做的Chrome浏览器截图。

图14-9 “Inspect Element”选项和开发者工具

        当开发者工具被打开后,开发者就会发现在“Elements”标签之下显示的其实是被调试页面的源代码,同时,Chromium浏览器会高亮被审查元素的源代码,这一做法可以帮助开发者获悉当前的元素的源代码。右侧下方是当前元素的CSS属性值,包括经过WebKit计算之后应用在该元素上的属性值和支持获得这些属性值的规则等信息,这对开发者而言非常方便。如果读者认为只是显示源代码(DOM结构)和CSS属性值的话,那就大错特错了。开发者工具的方便之处就在于开发者可以任意修改源代码或者CSS属性值,而且这些修改都是即时显示在网页的渲染结果中的。如前面的一个例子就是取消一个CSS属性值,图14-3就是该例子背后发送的消息,前端的修改很快就会在后端显示的网页结果中起作用,例如,将字体颜色的红色值取消掉,那么它可能就会变成默认的颜色。

        另外一个例子就是在图14-9左边的源代码中(实际是DOM树的一种显示方式),开发者可以随时修改任何元素,包括它们的属性,这些修改立刻由后端处理触发重新绘制的操作。这一切对网页开发者来说是透明的。当然这些改动只是针对本地浏览器下载后的网页,并不会对服务器端的网页做任何修改,因为其本来目的也是帮助调试之用。

        当然,为了查看网页的DOM结构和网页中的各种对象,开发者工具提供了命令行式的控制台,开发者可以以此查看任何DOM中的节点(这个在第5章中也使用过控制台来理解DOM树结构)和各种对象(包括对象值和它包括的函数,笔者经常使用它来查看Chromium支持的一些JavaScript接口是什么样的,因为不同浏览器对于接口的支持也是不一样的),甚至可以执行JavaScript语句。图14-10是开发者工具控制台中的两个示例,第一个是查看“geolocation”对象相关的接口,可以看到这个对象包括三个接口。第二个是查看“window”对象下所有的其他对象,这对查看编程接口也有一定的帮助。

图14-10 开发者工具的控制台

        控制台的另外一个功能就是能够显示所有的JavaScript代码执行的日志信息和错误信息。调试JavaScript代码的一种方式是使用日志打印出一些值来帮助确定代码的正确性,常用的就是console.log函数,该函数的输出都可以在控制台中看到。

        代码的调试是每个调试器必须支持的功能,在网页中就是对JavaScript代码的调试功能,包括单步、设置或取消断点、调用栈、变量信息等,这些都在“Sources”标签中得到了支持。图14-11是开发者工具中的JavaScript代码调试器。

                        图14-11 开发者工具的JavaScript调试器

        左侧是当前网页的所有包含JavaScript代码的文件,中间是当前代码和调试的位置,开发者可以单击左侧的行数设置或者取消断点,网页就能够在执行到该行的时候停下来。右侧最上面是控制执行的各种按钮,包括继续执行、单步执行、进入内部、跳出等。下面则是各种信息,包括查看的变量值、调用栈、当前作用域中的变量值、断点信息等。所以,这个调试功能跟其他语言调试器比较类似。

                值得一提的是,其实这个网页的代码都是在一行的,所以看起来非常吃力和不方便,对此现象Chromium提供了一个很方便的功能,能够将这些代码从一行变成可读性非常强的代码,就是图14-11所示的结果(原来所有JavaScript代码都在一行,非常难懂),具体的做法是在开发者工具的最下面找到“{}”按钮,单击即可,非常实用。

2.2 性能调试

        除了修改网页的DOM结构和CSS样式,以及调试JavaScript代码之外,开发者工具还能够帮助网页开发者改善性能和内存等方面的问题。性能方面包括网络资源的加载性能、网页绘制的性能,甚至包括根据网页加载和渲染过程给出一些优化建议。内存方面主要是网页使用的总内存、JavaScript引擎堆栈内存使用情况等方面的信息。

        首先来看性能方面。关于网络资源加载的分析和网页绘制在第4章和第8章中做过一些介绍,其基本功能已经展示出来了。这些功能只是开发者可能需要解决的一部分问题,开发者工具还提供了一种能够收集整个网页工作过程中的一段时间内各个JavaScript代码消耗时间的分布情况。开发者先是选择“Profiles”标签,然后选择“Collect JavaScript CPU profile”按钮,此时开发者工具将收集被调试网页重新加载的整个过程中CPU消耗在各个JavaScript模块的时间分布,如图14-12所示。

                        图14-12 使用开发者工具收集的CPU时间分布图

        其中“(program)”是主网页的HTML文件所消耗的时间,因为HTML文件中内嵌了很多JavaScript代码,所以它占据了绝大部分时间,而其他一些JavaScript文件则只占用了很少的执行时间。

        还有一个非常有用的能力,就是使用开发者工具中的“Audits”功能,图14-13展示了“Audits”分析一个网页所生成的结果,它明确了4个关于网络方面和1个关于网页渲染性能方面的问题可以进行优化,这对改善网站性能来说是一个极大的福音。

图14-13 开发者工具的“Audits”功能

其次来看关于内存性能分析功能。如前所述,开发者工具不仅提供了网页整体使用内存的情况,也提供了分析JavaScript引擎内部堆上的内存使用情况。图14-14是笔者在单击“开始”按钮之后,重新加载网页所收集的内存使用情况,它是按照时间轴来显示的。

图14-14 开发者工具收集网页使用内存情况的示意图

        可以看出,在某个时间点之后内存的使用量突然增大,这是因为在前面一小段时间内,由于还没有开始重新加载网页,所以没有出现内存大幅增长的情况。在单击“开始”按钮和重新加载网页,WebKit在等待网络响应之后才会逐渐增加对内存的需求。当网络下载数据完成时,WebKit使用内存量也在增加。而WebKit完成渲染之后,解释过程中的某些结构不再需要,这些不需要的结构被销毁后内存就会降到一个稳定的过程,图中上半部分的曲线就是反映了这些情况。

        除此之外的JavaScript引擎内部的内存分析工具,也可以按照类似的情况来处理,这里不再做过多的介绍。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1412483.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Kettle-Docker部署+Sqlserver数据同步Mysql+Start定时任务

一. 背景介绍 1. ETL是什么 ETL(Extract-Transform-Load),即数据抽取、转换、装载的过程。它是一种思想,主要是说,从不同的数据源获取数据,并通过对数据进行处理(格式,协议等转换&a…

网安培训第一期——sql注入+文件

文章目录 sql inject报错注入time盲注联合查询万能密码拦截和过滤ascii注入流程base64查询的列名为mysql保留关键字key 文件上传ffuf脚本要做的三件事网络端口进程用户权限文件文件包含文件下载XSS跨站请求攻击csrf跨站请求伪造 sql inject 判断输入字段是字符串还是数字 方法…

ShardingSphere之ShardingJDBC客户端分库分表上

目录 什么是ShardingSphere? 客户端分库分表与服务端分库分表 ShardingJDBC客户端分库分表 ShardingProxy服务端分库分表 ShardingSphere实现分库分表的核心概念 ShardingJDBC实战 什么是ShardingSphere? ShardingSphere是一款起源于当当网内部的应…

拼图小游戏的界面和菜单的搭建

package Puzzlegame.com.wxj.ui;import javax.swing.*;public class GameJframe extends JFrame { //游戏主界面 public GameJframe(){//初始化界面initJFrame();//初始化菜单initJmenuBar();//让界面显示出来this.setVisible(true); }private void initJmenuBar() {//创建整个…

强化学习基础(一)

1 初始强化学习 强化学习是机器通过与环境交互来实现目标的一种计算方法。 机器和环境的一轮交互是指,机器在环境的一个状态下做一个动作决策,把这个动作作用到环境当中,这个环境发生相应的改变并且将相应的奖励反馈和下一轮状态传回机器 …

二叉树的构建,遍历等

1.叉树链式结构的实现 1.1前置说明 在学习二叉树的基本操作前,需先要创建一棵二叉树,然后才能学习其相关的基本操作。 为了方便调试,我直接在主函数中来建立二叉树了,下面是一个简单的二叉树 二叉树节点结构体的定义&#xff…

NC65中间件能启动,前端客户端启动失败,加载异常,卡住(org.owasp.esapi)

控制台输出错误 ESAPI.properties could not be loaded by any means. Fail.SecurityConfiguration class(org.owasp.esapi.reference.DefaultSecurityConfiguration) CTOR threw exception.效果图: 解决方案 添加如下参数: -Dorg.owasp.esapi.resou…

阿里云服务器ESC部署前后端分离项目完整流程

阿里云服务器ESC部署服务完整流程 准备安装软件1.安装jdk2.安装tomcat3.安装mysql 后端应用功能编写及部署编写一个简单的用户增删改查功能发布流程 前端功能应用及部署搭建前端框架准备:已安装npm 页面user.vueuserForm.vue 跨域问题安装nginx配置nginx 源码 准备 …

Maya的ai功能有哪些?Maya Assist是什么?

Autodesk Maya是一款流行的 3D 建模软件,艺术家和设计师使用它来创建现实的世界和表面。该软件以其与各种工具开发人员的合作而闻名,它允许多个工具的无缝集成以改进功能。Autodesk 的 Maya 刚刚发布了 Maya Assist,在 3D 建模和动画领域树立…

架构篇12:架构设计流程-评估和选择备选方案

文章目录 架构设计第 3 步:评估和选择备选方案评估和选择备选方案实战小结上一篇我们聊了设计备选方案,在完成备选方案设计后,如何挑选出最终的方案也是一个很大的挑战,主要原因有: 每个方案都是可行的,如果方案不可行就根本不应该作为备选方案。没有哪个方案是完美的。例…

MES系统计划排产功能,助你提升生产效率

MES系统的排产功能是基于企业的生产需求与资源情况进行制定的。首先,需要明确生产计划的目标和要求,包括计划产量、交货期限、生产能力等。然后,根据企业的生产资源情况,包括人员、设备、原材料等,制定生成计划。在MES…

Java链表(1)

🐵本篇文章将对单链表进行讲解,模拟实现单链表中常见的方法 一、什么是链表 链表是一种逻辑结构上连续而物理结构上不一定连续的线性表,链表由一个一个节点组成: 每一个节点中都由数据域(val)和指针域&…

食品加工厂可视化视频AI智能监管方案,助力工厂数字化运营

一、背景与需求分析 随着科技的不断进步和人们对食品安全和质量的日益关注,食品智慧工厂的建设成为了食品行业的一个重要趋势。智能化的食品工厂可以利用先进的技术和自动化系统,提高生产效率、降低监管成本,并确保产品的质量和安全。 行业…

使用GtkSharp下载zip包过慢问题解决方案

背景 安装GtkSharp这个包准备使用C#进行跨平台窗体应用程序开发,运行时发现其需要从github上下载【https://github.com/GtkSharp/Dependencies/raw/master/gtk-3.24.24.zip】这个依赖包,不知道是被墙了还是咋的,下载超时导致运行失败。 解决…

泛型..

1.泛型 所谓泛型 在类定义处是一种类型参数(我们平常所见到的参数指的就是方法中的参数 他接收有外界传递来的值 然后在方法中进行使用) 在类内部的话 则充当一种占位符 并且还提高了代码的复用率 何以见得提高了代码的复用率 其实就是通过对比使用了泛型技术和没有使用泛型技…

VS2019下各种报错合集(持续更新)

VS2019下的各种报错处理(长期更新),欢迎大家在评论区补充错误代码/描述 解决方案!!! 1、printf 代码运行到printf函数打印不出来内容,打断点之后,f10走过去,程序直接运行起来了,而…

Linux下串口編程遇到的接收数据错误及原因(

近日在调试串口的时候发现,另一设备向我ARM板的串口发送0x0d,我接收之后变成了0x0a,这是问题一;另外当对方向我发送一串数据,如果其中有0x11,那么我总是漏收此数,这是问题二。 由于问题莫名其妙…

深度视觉目标跟踪进展综述-论文笔记

中科大学报上的一篇综述,总结得很详细,整理了相关笔记。 1 引言 目标跟踪旨在基于初始帧中指定的感兴趣目标( 一般用矩形框表示) ,在后续帧中对该目标进行持续的定位。 基于深度学习的跟踪算法,采用的框架包括相关滤波器、分类…

【SVA断言_2023.01.24】

在RTL设计中,仿真时查看异常情况,异常出现时,断言会报警,断言占整个设计的比例应不少于30% assertion作用: 检查特定条件或事件序列的出现情况提供功能覆盖 断言失败的严重程度:$fatal(中止仿…

Oracle RAC 集群的安装(保姆级教程)

文章目录 一、安装前的规划1、系统规划2、网络规划3、存储规划 二、主机配置1、Linux主机安装(rac01&rac02)2、配置yum源并安装依赖包(rac01&rac02)3、网络配置(rac01&rac02)4、存储配置&#…