告别懵逼——前端项目调试与问题排查方法小结

2024-09-04 18:20

本文主要是介绍告别懵逼——前端项目调试与问题排查方法小结,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在日常工作中,我们常常会遇到以下两类典型的挑战:

场景一: 接手无文档的老项目
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、通义千问等智能型工具

这篇关于告别懵逼——前端项目调试与问题排查方法小结的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1136682

相关文章

SpringBoot日志配置SLF4J和Logback的方法实现

《SpringBoot日志配置SLF4J和Logback的方法实现》日志记录是不可或缺的一部分,本文主要介绍了SpringBoot日志配置SLF4J和Logback的方法实现,文中通过示例代码介绍的非... 目录一、前言二、案例一:初识日志三、案例二:使用Lombok输出日志四、案例三:配置Logback一

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

一文教你如何将maven项目转成web项目

《一文教你如何将maven项目转成web项目》在软件开发过程中,有时我们需要将一个普通的Maven项目转换为Web项目,以便能够部署到Web容器中运行,本文将详细介绍如何通过简单的步骤完成这一转换过程... 目录准备工作步骤一:修改​​pom.XML​​1.1 添加​​packaging​​标签1.2 添加

Flutter打包APK的几种方式小结

《Flutter打包APK的几种方式小结》Flutter打包不同于RN,Flutter可以在AndroidStudio里编写Flutter代码并最终打包为APK,本篇主要阐述涉及到的几种打包方式,通... 目录前言1. android原生打包APK方式2. Flutter通过原生工程打包方式3. Futte

mysql出现ERROR 2003 (HY000): Can‘t connect to MySQL server on ‘localhost‘ (10061)的解决方法

《mysql出现ERROR2003(HY000):Can‘tconnecttoMySQLserveron‘localhost‘(10061)的解决方法》本文主要介绍了mysql出现... 目录前言:第一步:第二步:第三步:总结:前言:当你想通过命令窗口想打开mysql时候发现提http://www.cpp

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

tomcat多实例部署的项目实践

《tomcat多实例部署的项目实践》Tomcat多实例是指在一台设备上运行多个Tomcat服务,这些Tomcat相互独立,本文主要介绍了tomcat多实例部署的项目实践,具有一定的参考价值,感兴趣的可... 目录1.创建项目目录,测试文China编程件2js.创建实例的安装目录3.准备实例的配置文件4.编辑实例的

MySQL INSERT语句实现当记录不存在时插入的几种方法

《MySQLINSERT语句实现当记录不存在时插入的几种方法》MySQL的INSERT语句是用于向数据库表中插入新记录的关键命令,下面:本文主要介绍MySQLINSERT语句实现当记录不存在时... 目录使用 INSERT IGNORE使用 ON DUPLICATE KEY UPDATE使用 REPLACE

Docker镜像pull失败两种解决办法小结

《Docker镜像pull失败两种解决办法小结》有时候我们在拉取Docker镜像的过程中会遇到一些问题,:本文主要介绍Docker镜像pull失败两种解决办法的相关资料,文中通过代码介绍的非常详细... 目录docker 镜像 pull 失败解决办法1DrQwWCocker 镜像 pull 失败解决方法2总

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu