学会使用“条件断点“来解放你的鼠标

news2025/1/20 5:52:36

(PS:对调试较为熟悉却没有使用过条件断点的同学可以直接翻到文章底部看操作的GIF图~)

一、背景

 "Debug"想必大家在开发的过程中也是有经常使用的,这里简单的介绍一下浏览器"Debug"其中的两种方式。(VScode等Ide具有的Debug不展开介绍,不过断点的方式大同小异)

  1. 第一种方式是直接在代码中写上debugger关键字,当浏览器运行到该代码行时便会进入Debug状态,举个简单的例子:
function algorithm(...arguments) {
  // input key word: debugger enter to browser debug mode
  debugger;
  // something operation here
  // simple example:
  console.log("arguments", arguments);
}

algorithm(1, 2, 3, 4, 5);

 需要注意到的是:想进入浏览器的debug模式,需要提前打开控制台(右键检查或F12),再执行有关键字"debugger"关键字的函数。

  1. 第二种方式是在浏览器中打开控制台,冰打开Source(源代码)标签,在左侧的文件树中找到目标文件、并找到目标函数需要打断点的地方,在左侧的行数点击一下,当看到左侧行数变为蓝色方块即代表断点已经打上了,这时触发目标函数便可以进入断点模式,例子截图如下:

二、Debug界面介绍

 这里对Debug的界面做一个简单的介绍,正常的Debug页面将分为三个部分,左侧是文件的文件结构树,用于查找目标文件,不过在工程化开发中可能因为文件的压缩、合并等操作这个操作变得更加困难(一般推荐先使用debugger关键字找到目标文件,再使用浏览器断点的方式)。

 中间为代码部分,在这里我们可以看到文件对应的代码,同时我们也可以在此对代码打断点。右侧分为上下两个部分,上侧为Debug的操作按钮,下侧为数据相关的监控,我们可以在此看到当前函数的作用域以及其父级(闭包)作用域,同时我们可以在中间部分选中相关代码,右键添加选中项到观察区(add Selected text to watch)这样便可以在右侧观察到目标代码的值。

Debug操作按钮

 Debug有五个按钮,如上图所示,从左至右分别是:

  1. 继续执行:当点击该按钮后,代码将退出Debug模式向后执行,若遇到另一个断点则重新进入Debug模式,反之则完成函数的执行。
  2. 单步执行:点击单步执行按钮时,将完成当前行代码的执行,注意单步执行不会进入当前行的内部函数块,而是直接跳到下一行。
  3. 进入函数调用:点击进入函数调用后将进入当前行的内部函数,并从函数头开始调试。
  4. 跳出函数调用:点击跳出函数调用后将跳出当前内部函数的调试,进入到外部函数的下一行。
  5. 单步执行:这个按钮也是进行单步执行,不同的是它能够进入内部函数的执行,打个比方,在目标行使用了map函数,并传入了回调函数,使用当前的单步执行将进入到map的循环中,而使用第二个按钮则不会进入。具体的大家可以自己测试。

数据控制台

 在数据的查看上,有两种方式,第一种是如图左侧所示,将鼠标悬浮到想要查看的变量上,若是一个式子,你可以通过选中(鼠标按住选中为蓝色)的方式查看。当然这种方式的前提便是需要行数执行到目标行,若该行未执行得到不到结果是非常合理的哈。

 第二种便是通过右侧的Scope(函数作用域)查看,你也可以选中目标代码,右键将它添加到Watch中,或者在控制台(Console)中执行(Evaluate)。

三、条件断点

 上述简单的介绍了调试的使用,这里讲讲本章的中心内容"条件断点"。笔者也是在近期更频繁的使用debug时偶然发现的一个调试方式,大部分的时间可能大家与我一样更习惯使用console.log进行调试。当然,大部分的场景下使用日志打印的效率不会低于Debug调试。我使用调试的情况是需要与另一个语言的代码进行逐步比对以确保"算法语言移植"的正确性,此时使用日志打印显然是一个巨大的工程。

 那么既然是算法,就经常会遇上递归、多层的循环,那么这个比对过程中发现错误,打个比方错误在循环系数i=10、j=5的时候出现误差,我们总不能通过单步执行10*n+5次来找到对应的执行查看结果吧?毕竟我们还需要对错误结果进行调整。

 此时,笔者在浏览器断点右键菜单中找到了条件断点(Edit BreakPoint/Conditional BreakPoint),打开了新世界的大门。条件断点中与我们写if语句的语法是一致的,若只有一个条件时如i===100,若有多个条件时使用&&进行条件连接。

 下面举一个双层循环的例子,假设我在i=30、j=20时代码与Matlab中的算法结果不一致,我希望直接进入该次结果进行查看,我们就可以设置条件为i===30&&j===20,这里我们使用Gif进行演示:

四、总结

 在一些可能需要多步调试或者说在特定的条件下才能进入的断点,我们可以直接通过条件断点的方式来更快的进入到目标阶段,减少了多次的"单步执行"操作,解放双手!同时我们也可以利用条件断点的方式来直接跳到第n次循环,减少多次无用的调试。

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

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

相关文章

使用idea创建java web项目

创建web项目有很多方法,就说一个最简单的方法吧。 创建一个java项目,点击创建右击项目选择添加框架支持。勾选上web应用程序,点击确定。 再点击当前文件,编辑配置 点击加号,选择Tomcat服务器(本地&#xf…

【连续介质力学】变形梯度

变形梯度 简介 本节讨论两个不同质点P和Q的之间的相对运动变化 拉伸比和相对伸长 d X ⃗ d\vec X dX : 在参考构形连接质点P和Q的向量,线单元 M ^ \hat M M^: d X ⃗ d\vec X dX 方向的单位向量 d x ⃗ d\vec x dx : 在当前构形连接质点P’和Q‘的向量&#xff…

对象存储分布式代理-go初学者的开源练手项目

最近写了一个go语言练手项目osproxy和osproxy-grpc,代码已完全开源到github。 相信不少接触go语言的读者,都是被它"极简协程",“高并发”,"高性能"的特性所吸引,我也不例外,想着学完之…

基于MATLAB涡度通量数据处理技术应用

点击查看原文 本文基于MATLAB语言、以实践案例为主,提供代码、原理与操作结合 1、以涡度通量塔的高频观测数据为例:基于MATLAB开展上机操作 2、涡度通量观测基本概况:观测技术方法、数据获取与预处理等 3、涡度通量数据质量控制&#xff1…

第3章 需求分析(上)

第3章 需求分析(上) 3.1 需求分析任务 3.1.1 确定对系统的综合要求 1. 功能需求 通过需求分析应该划分出必须完成的所有功能。 2. 性能需求 性能需求指定系统必须满足的定时约束或容量约束 3. 可靠性和可用性需求 可靠性需求定量地指定系统的可靠…

二叉树的最近公共祖先LCA

一、什么是最近公共祖先 LCA为最近公共祖先(Lowest Common Ancestor)的缩写。 对于一棵有根树T的两个节点u,v,最近公共祖先LCA(T,u,v)代表一个节点x。 LCA(5,6) 2 LCA(7,12) 3 LCA(2,1)1 二、公共祖先的朴素解法 两个节点先调整到相同的深度每一次…

Qt6使用cmake创建项目

目录 创建普通项目 创建qt项目 创建具有资源文件的qt项目 在QT6中,官方推荐在新的项目中使用CMake。 在Qt Creator中使用CMake构建系统时,与往常的qmake有一些不一样,因此写一篇文章来记录一下。 创建普通项目 我们先写一个最简单的项目…

chatgpt赋能python:Python的Unicode编码介绍

Python的Unicode编码介绍 什么是Unicode Unicode是一个字符集,它定义了世界上几乎所有的字符,包括字母、数字、符号和标点。Unicode使用唯一的数字编码来表示每个字符,这使得在不同的操作系统和编程语言中展示和处理字符非常方便。在Python…

chatgpt赋能python:Python怎样完成更新?

Python怎样完成更新? Python是一种非常流行的编程语言,由于它的简单易学和广泛的应用领域,许多程序员选择使用Python编写程序。但是,随着时间的推移和技术的不停发展,Python需要不断更新以保持全球开发者的使用体验。…

ES 如何重建索引

场景: ES索引中,为了效率和存储空间,有些字段可以设定为不被索引,然后某一天又需要改成能索引,此时就需要对ES进行重建索引,操作如下 1、修改 ES 索引模板文件 cd /data/elk/logstash/es-template/ vim e…

JavaSE笔记(七)

Java反射和注解 **注意:**本章节涉及到JVM相关底层原理,难度会有一些大。 反射就是把Java类中的各个成分映射成一个个的Java对象。即在运行状态中,对于任意一个类,都能够知道这个类所有的属性和方法,对于任意一个对象…

几十款游戏的简单分析

文章目录 一、 介绍二、 影响游戏体验的因素三、 游戏能爆火的因素1.影响游戏爆火因素的排名2.玩游戏的两种经典心理3.经典案例分析Qq农场植物大战僵尸水果忍者召唤神龙羊了个羊 4.游戏公司可借鉴的经验5.未来游戏面对的诸多挑战 四、 几十款游戏的多方面分析FC红白游戏机十二人…

chatgpt赋能python:Python中的import使用详解

Python中的import使用详解 介绍 在Python中,import是将一个模块引入到当前脚本中使用的关键字。Python中的模块是指一个包含所有定义、函数和变量等的Python文件,也可以包含其他模块,从而构成一个Python程序。在Python中,有很多…

spark相关理论

系列文章目录 ubuntu虚拟机下搭建zookeeper集群,安装jdk压缩包,搭建Hadoop集群与spark集群的搭建【上篇】_ubuntu搭建zookeeper集群 ubuntu虚拟机下搭建zookeeper集群,安装jdk压缩包,搭建Hadoop集群与spark集群的搭建【下篇】 …

Redux基本使用和实践

Redux的核心是store,store作为应用状态的容器,保存着这个页面的状态数据树。 store 但是store本质上是一个JavaScript对象,这个对象含有了dispatch以及获取页面状态数据的方法等等。 如上图所示,store提供几个方法给开发者调用&…

[论文阅读笔记75]P-Tuning v2

1. 基本信息 题目论文作者与单位来源年份P-Tuning v2: Prompt Tuning Can Be Comparable to Fine-tuning Universally Across Scales and TasksXiao Liu等Tsinghua University清华大学2021 Citations, References 论文链接:https://arxiv.org/pdf/2110.07602.pdf…

chatgpt赋能python:Python的IDLE是什么?——初探IDLE的用途和功能

Python的IDLE是什么?——初探IDLE的用途和功能 Python的IDLE是一个Python集成开发环境(IDE),可以简单地将其视为为开发者提供编写、调试和执行代码的工具。IDLE包括一个交互式解释器,使开发更加快速和简便。它还提供了代码编辑器、调试器和其…

chatgpt赋能python:Python技巧:一行代码实现所有数据的输出

Python技巧:一行代码实现所有数据的输出 Python是一种高级动态语言,因其简单易学和灵活性而广受欢迎。Python的语法简单明了,适合初学者学习、理解和实践,同时也是专业程序员的首选开发语言之一。 在实际的编程中,有…

k8s简单部署示例

1 部署yaml文件 1.1 Deployment部署 apiVersion: apps/v1 kind: Deployment metadata:name: zscorenamespace: wangzy-plabels:app: zscore-dep spec:replicas: 1selector:matchLabels:app: zscoretemplate:metadata:labels:app: zscoreannotations:sidecar.istio.io/inject:…

[工业互联-9]:EtherCAT(以太网控制自动化技术)+TwinCAT 在生产自动化控制中的应用 、

前言 EtherCAT(以太网控制自动化技术)是一个开放架构,以以太网为基础的现场总线系统,其名称的CAT为控制自动化技术(Control Automation Technology)字首的缩写。EtherCAT是确定性的工业以太网,…