告别懵逼——前端项目调试与问题排查方法小结
在日常工作中,我们常常会遇到以下两类典型的挑战:
场景一: 接手无文档的老项目
1、情景描述: 你接手了一个历史久远的项目,项目文档缺失,前任开发者已经离开,而你对当前的业务逻辑和代码结构都不熟悉。然而,线上系统出现了故障,需要紧急解决。
2、挑战:
- 缺乏文档资料,难以快速了解系统架构。
- 不熟悉业务流程,难以迅速定位问题。
- 代码结构混乱,增加了调试难度。
场景二: 项目中出现难以复现的幽灵Bug
1、情景描述: 项目中出现了难以捉摸的Bug,相关反馈人员(如测试工程师、实施人员等)无法准确描述或复现问题,这使得问题的定位变得异常困难。
2、挑战:
- 问题出现的概率较低,难以捕捉。
- 相关人员提供的信息不完整,缺乏具体细节。
- 缺乏一致的复现步骤,难以进行有效的调试。
不管是哪种场景,我们要解决问题,关键的一点就是必须找到引发问题的地方,以及真正引发问题的原因。
查找定位错误文件的方法
我们首先可用通过以下方法,来找到和定位引发问题的文件:
1、通过页面路由路径查找: 此方法得基于规范得页面结构,如果一个项目得项目文件引用像蜘蛛网一样错综复杂,此法行不通
2、通过css样式查找: 浏览器上鼠标选中对应的html,查看css,然后全局搜索
3、通过菜单查找: (页面菜单管理或者菜单数据,结合页面路由路径,找到对应的文件地址,比如component配置)。对于采用动态配置菜单得项目可用
4、全局关键字搜索: 通过页面特殊关键字全局搜索,查找文件。前提是该关键字在项目中出现次数比较少,最好5次以下。另外,全局搜索时,应将打包后的文件删除或者排除在外,避免干扰
5、从逻辑上顺藤摸瓜: 根据路由文件的逻辑,比如先找到路由文件,然后根据“查看”按钮,找到详情页文件
页面调试的一些思路整理:
1、遇到页面出不来,第一反是看浏览器控制台,观察是否报错,如果报错,根据报错指定的文件去查找错位问题,改正侯继续观察页面情况
2、控制台如果没用报错,查看netWork对应的接口请求,看是否有数据
3、如果有,检查代码逻辑,是否获取到数据(一定得检查并打印或者debug查看,而不是空想)
4、遇到棘手的,无法定位错误的问题,可以使用注释部分代码,观察页面变化的方式、找到错误文件后,根据文档等定位代码逻辑,根据代码逻辑打印调试数据,并分析数据是否正确
5、还原真实的操作逻辑和使用场景。能准确复现的问题相对很难复现的问题,会比较好解决。如果是其他人发现的问题,尽可能的摸清楚对方的操作逻辑,在相同账号、相同数据下来查找问题
6、涉及硬件、设备的,做好关键步骤和逻辑的数据打印,然后分析日志
以下案例均为笔者之前亲身经历。
案例一:某单位取款机项目,部分客户登录跳转首页,客户取钞过程中莫名跳转首页问题排查。
该问题在公司测试时并没有发现,出差到现场时,开始的第一天也未出现此问题
排查方法
-
首先分析日志,从日志打印的顺序和时间上分析,发现钞票冠字号打印的顺序和取款批次不完全一致,有延后的情况
-
问题复现方式:模拟现场用户取款实际步骤流程情况来测试后复现了问题
关键方法: 还原用户真实场景测试复现
案例二: vue-press打包报错error Error rendering /
该问题的难点在于,报错信息基本无用,从报错信息上几乎找不到报错的原因和引发位置
原因查找:
- 文档+已有知识:根据查阅官网示例文档,vue-press是服务端渲染。
- 本地搭建测试环境:结合项目本身需求和环境排查,采用本地建测试仓库,本地建测试组件库,本地建测试文档项目
- 统一测试流程:逐个移植原组件库的组件到测试组件库中(这里也可以采用二分法),发布到测试仓库后,更新测试文档,然后执行vue-press项目本地打包命令。
查找结果:
- 初步组件定位:最终找出影响打包的组件有弹窗、文件上传、文件预览、裁剪等组件。这些组件的共同点就是都直接或间接用到了document操作dom,或者使用了window对象调用api。
- 初步验证:锁定组件后,仅留下这些组件中的一个,然后去掉document相关调用,得到了正确的验证。
- 进一步验证:后又通过对其他组件使用注释/开启方式不断测试,确定了问题原因包括:在create生命周期中使用window、document或bom方法事件,import引入含有或间接调用含有window、document或bom方法事件的函数
关键方法: 逐渐注释和逐渐移植(或者二分法)
假设你是一个科学家——以科学探究的精神面对挑战
在面对复杂且难以一眼洞悉的问题时,你是否曾想过,或许可以借鉴科学研究的方法来寻找和解决问题?
1、提出猜想。当遇到一个未知的、暂时无法准确定位具体问题的bug时,可以先以自己当下知识,提出可能的假设原因
2、验证猜想。猜想必须要验证。这里要注意的是,提出的只是猜想,并非就一定是这个原因,所以要避免先入为主的观念,而是要用事实来证明猜想的正确性。
如何验证?
- 打印数据。打印数据时,注意浅拷贝问题。数组和对象的打印,建议使用JSON.parse(JSON.stringfy()),杜绝数据变化
- 注释特定地方代码
- 修改特定地方代码
3、问题未解决之前,不断提出猜想,反复验证
案例一: 某政府大屏项目——解决客户电脑(winserver2012政企版,蓝色chrome 83)浏览器布局出现混乱的问题。
- 出现场景:客户电脑和windowserve2012系统上,装客户的特供版chrome浏览器,会出现该问题。
- 原因推测:因开发电脑装了特供版chrome浏览器没复现,故只能推测原因。推测为界面使用flex布局,出现问题的时候,界面flex布局的row失效,混乱效果和直接使用block相同,可能是浏览器版本较低,加上该浏览器内核和通用chrome内核更新并不一致,最终对项目中的flex布局支持异常导致。
解决: 加上百分比宽度布局兼容,给模块容器加上宽度100%显示,模块加上比例宽度兼容,测试后解决。
案例二: 某项目需要从第三方平台跳转,在开发者模式下模拟可以正常跳转,而在打包到客户生产环境下无法正确跳转
问题描述: 本该跳转到登录页面的地址,变成了ajax网络请求,页面显示404数据信息。
- 猜想一:
原因推测: 前端路由地址和后端api地址冲突
验证: 前端修改路由路径信息验证,失败,排除了前后端路由和api冲突的可能 - 猜想二:
原因推测:nginx vue history模式必须的 try_files配置、即404重定向配置
验证:加上后try_files配置问题未解决 - 猜想三:
原因推测:nginx整体配置问题
验证:尝试将后端api配置注释,操作后项目可以成功的跳转到前端页面,确定了跳转失败的原因所在,后由后端伙伴提供新的配置后,问题解决
知识深度和广度的影响
知识深度和广度,可以在一定程度上快速帮你解决问题、查找原因
- 知识深度:比如,一个vue2页面,你发现数据更新了,但是页面没有更新。从知识深度来讲,如果熟悉vue的$Set和vue对象在初始创建时没有对应的键名的坑,那看一下代码,就很快能联想到在赋值的地方需要用this.$set;又比如熟悉js基本类型和引用类型在存储上的区别,在处理数据莫名其妙发生变化的情况时,很容易就能想到是下游数据改变,影响了上游数据的原因
- 知识广度:比如用Uniapp写一个app,发现网页端视频可以播放,app视频无法播放,对安卓熟悉的很容易就会联想到权限问题
工具的运用
百度搜索——适合英文不好的,但是专业网站上的iss等基本搜不出来
谷歌搜索——如果需要搜索国外的方案,最好有一点英文基础,能看个大概也行,可以搜索到github上的issue,还有,很多新新技术,国外的解决方案比国内多
AI工具——ChartGpt、通义千问等智能型工具
相关文章:
告别懵逼——前端项目调试与问题排查方法小结
在日常工作中,我们常常会遇到以下两类典型的挑战: 场景一: 接手无文档的老项目 1、情景描述: 你接手了一个历史久远的项目,项目文档缺失,前任开发者已经离开,而你对当前的业务逻辑和代码结构都…...

[数据集][目标检测]肺炎检测数据集VOC+YOLO格式4983张2类别
数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):4983 标注数量(xml文件个数):4983 标注数量(txt文件个数):4983 标注…...

顶层const和底层const
在C中,const修饰符用于声明常量,有两种常见的形式:顶层const和底层const,它们之间的区别在于它们修饰的对象及其在不同场景中的作用。 1. 顶层const (Top-level const) 顶层const用于修饰变量本身,使其成为常量。这意…...

嵌入式Openharmony系统构建与启动详解
大家好,今天主要给大家分享一下,如何构建Openharmony子系统以及系统的启动过程分解。 第一:OpenHarmony系统构建 首先熟悉一下,构建系统是一种自动化处理工具的集合,通过将源代码文件进行一系列处理,最终生成和用户可以使用的目标文件。这里的目标文件包括静态链接库文件…...

锡林郭勒奶酪品牌呼和浩特市大召店盛大开业
礼献中秋,香飘乳都。为进一步拓展锡林郭勒奶酪区域公用品牌产品销售渠道,9月8日,锡林郭勒奶酪区域公用品牌大召店在呼和浩特市大召广场月明楼隆重开业,现场为第三批新授权的39家奶酪生产经营主体代表授牌。至此,锡林郭…...

【Java算法】模拟
🔥个人主页: 中草药 🔥专栏:【算法工作坊】算法实战揭秘 🧣 一.模拟算法 模拟算法和传统的算法有一些不同之处,更多的是对题目要求的理解,通过代码的方式去模拟实现一道题目在现实中的实现方法…...

标准库标头 <filesystem> (C++17)学习之文件类型
本篇介绍filesystem文件库的文件类型API。 文件类型 is_block_file (C17) 检查给定的路径是否表示块设备 (函数) is_character_file (C17) 检查给定的路径是否表示字符设备 (函数) is_directory (C17) 检查给定的路径是否表示一个目录 (函数) is_empty (C17) 检查给定的路径是…...

基于51单片机的自动转向修复系统的设计与实现
文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设…...

mysql笔记4(数据类型)
数据库的数据类型应该是数据库架构师(DBA)和产品经理沟通后依据公司的项目、业务而定的,而且会不停地变化。数据类型的选择方面没有一个统一的标准,但是应该符合业务、项目的逻辑标准。 菜鸟教程 Mysql 数据类型 文章目录 1. int类型2. 浮点数3. 定点数4…...

电脑开机出现no operation system found错误原因分析及解决方法
最近有网友问我电脑一启动提示:no operation system found,这个提示意思是未找到操作系统。并且出现bios能认别硬盘,快捷启动时找不到硬盘,出现该提示的原因有很多,下面我们来详细分析一下开机出现no operation system…...

数学建模笔记—— 主成分分析(PCA)
数学建模笔记—— 主成分分析 主成分分析1. 基本原理1.1 主成分分析方法1.2 数据降维1.3 主成分分析原理1.4 主成分分析思想 2. PCA的计算步骤3. 典型例题4. 主成分分析说明5. python代码实现 主成分分析 1. 基本原理 在实际问题研究中,多变量问题是经常会遇到的。变量太多,无…...

@vueup/vue-quill使用quill-better-table报moduleClass is not a constructor
quill官方中文文档:https://www.kancloud.cn/liuwave/quill/1434144 扩展表格的使用 注意:想要使用表格 quill的版本要是2.0以后 升级到这个版本后 其他一些插件就注册不了了。 安装: npm install quilllatest 版本需要大于2.0版本 npm…...

gpp.bat,g++编译C++源文件的批处理
今天编写一个gpp.bat文件,是专门编译C源文件的批处理,内容如下: g %1.cpp -o %1.exegpp.bat的文件路径:D:\YcjWork\CppTour\gpp.bat 使用方法,在CMD下运行(//两个斜杠后面的内容是注释): //运行gpp.bat&…...

JDBC:连接数据库
文章目录 报错 报错 Exception in thread “main” java.sql.SQLException: Can not issue SELECT via executeUpdate(). 最后这里输出的还是地址,就是要重写toString()方法,但是我现在还不知道怎么写 修改完的代码,但是数据库显示&#…...

【赵渝强老师】大数据主从架构的单点故障
大数据体系架构中的核心组件都是主从架构,即:存在一个主节点和多个从节点,从而组成一个分布式环境。下图为展示了大数据体系中主从架构的相关组件。 视频讲解如下: 大数据主从架构的单点故障 【赵渝强老师】大数据主从架构的…...

【AutoX.js】选择器 UiSelector
文章目录 原文:https://blog.c12th.cn/archives/37.html选择器 UiSelector笔记直接分析层次分析代码分析 最后 原文:https://blog.c12th.cn/archives/37.html 选择器 UiSelector 笔记 AutoX.js UiSelector 直接分析 用于简单、最直接的查找控件 开启悬…...

Elasticsearch数据写入过程
1. 写入请求 当一个写入请求(如 Index、Update 或 Delete 请求)通过REST API发送到Elasticsearch时,通常包含一个文档的内容,以及该文档的索引和ID。 2. 请求路由 协调节点:首先,请求会到达一个协调节点…...

FreeRTOS-基本介绍和移植STM32
FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操…...
在C++中,如何避免出现Bug?
C中的主要问题之一是存在大量行为未定义或对程序员来说意外的构造。我们在使用静态分析器检查各种项目时经常会遇到这些问题。但正如我们所知,最佳做法是在编译阶段尽早检测错误。让我们来看看现代C中的一些技术,这些技术不仅帮助编写简单明了的代码&…...

Linux 操作系统 进程(1)
什么是进程 想要了解什么是进程,或者说,为什么会有进程这个概念,我们就需要去了解现代计算机的设计框架(冯诺依曼体系): 计算机从设计之初就以执行程序为核心任务,也就是运算器从内存中读取,也只从内存中…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

如何在看板中有效管理突发紧急任务
在看板中有效管理突发紧急任务需要:设立专门的紧急任务通道、重新调整任务优先级、保持适度的WIP(Work-in-Progress)弹性、优化任务处理流程、提高团队应对突发情况的敏捷性。其中,设立专门的紧急任务通道尤为重要,这能…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...

排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
DAY 26 函数专题1
函数定义与参数知识点回顾:1. 函数的定义2. 变量作用域:局部变量和全局变量3. 函数的参数类型:位置参数、默认参数、不定参数4. 传递参数的手段:关键词参数5 题目1:计算圆的面积 任务: 编写一…...
土建施工员考试:建筑施工技术重点知识有哪些?
《管理实务》是土建施工员考试中侧重实操应用与管理能力的科目,核心考查施工组织、质量安全、进度成本等现场管理要点。以下是结合考试大纲与高频考点整理的重点内容,附学习方向和应试技巧: 一、施工组织与进度管理 核心目标: 规…...

WebRTC调研
WebRTC是什么,为什么,如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…...

Redis上篇--知识点总结
Redis上篇–解析 本文大部分知识整理自网上,在正文结束后都会附上参考地址。如果想要深入或者详细学习可以通过文末链接跳转学习。 1. 基本介绍 Redis 是一个开源的、高性能的 内存键值数据库,Redis 的键值对中的 key 就是字符串对象,而 val…...