一叶障目:排查问题的思路

最近工作有点忙碌,遇到了两次莫名不知如何解决的错误,由此暴露的问题让人不禁反思:

好的分析排查习惯比问题本身更值得关注。

首先是前天晚上遇到的一个问题是这样的:

我需要定时去从redis的zset里面取得一些key,然后查询数据库,得到一些原始数据,再通过外部的一些webservice去发送微信消息,通知到相关用户。由于取出来的key可能是多个,所以在最外层我是包了一层for循环,整个代码都是promise化的异步(nodejs技术栈)

在发送微信消息之前的步骤里面我每个关键部分都有log输出,然而最后还是遇到了报错,运行到调用webservice发送请求之后,脚本无输出了很长一段时间,然后打印出了out of memory的js stack信息。我最开始的思路是去google查询相关错误信息的解决办法,然而这种堆栈报错更多是因为循环回调太深造成内存耗尽,一般出现在数据量较大的循环调用中,而我在测试的时候只有一条数据,应该不是这个表面造成的原因。

按照一般的思路,我开始增加更多的日志,一段一段去屏蔽代码,在最后一次输出正确之后的代码往往是问题所在。而那一段是使用superagent发送post请求的代码块,我单独屏蔽之后发生没有报错,于是我单独写了一个测试脚本來运行这段post请求,然而并没有报错。走到这里我开始感觉郁闷和无奈,到底错在哪里?

后面去请教后端老大,他首先格式化了一下我的代码,让代码更整洁(由于使用的是简单ide,写多了就会有些乱)。之后他提醒我在每一段promise段中增加catch代码,因为我嵌套了多个promise对象操作,而有一部分并没有最终return出来,所以有些error可能没有catch到。

在增加这些异常捕获之后还是没发现问题,之后关注重点就回到post请求,先修改了返回延迟,然后终于打印除了response,最终发现了问题所在是因为post的数据不符合对方接口要求,而因为请求容忍时间太长了,导致了内存异常不能暴露出真正问题。

其实我已经确认了问题所在,但没有继续深挖以及完善日志记录。而且在重现问题写单独脚本的时候,我并没有使用相同的数据作为测试,而是写死了一个测试数据,最终没能暴露出真相。

还原现场的前提是:

数据、条件、逻辑三者保持完全一致。

第二个遇到的问题是:

突然前端同学找到我,说某单独部署的项目出现了不能正常生成一些数据,每次都报:Not a string or buffer的错误。首先我拿到这个问题也是去理清逻辑和增加必要log,然而那段报错信息太少了,我最终也排查到了错误段,又一次遇到了和之前那个问他一样无法更进一步的窘境。

最终也是在老大的协助下,通过使用console.error(e|| e.stack) 打印出了堆栈错误信息,追踪定位到了出错的文件和文件行,发现是由于配置文件造成无法加密出salt,造成TypeError报错。

总结:调试的思路和方法需要多注意,catch中多使用console.error打印堆栈信息而不是简单的Log.感谢团队的同事以及老大耐心地帮助,我也会好好反思,提高自己。

时间: 2024-10-25 17:38:32

一叶障目:排查问题的思路的相关文章

服务器CPU使用率过高排查与解决思路

发现服务器的cpu使用率特别高 排查思路: -使用top或者mpstat查看cpu的使用情况# mpstat -P ALL 2 1Linux 2.6.32-358.el6.x86_64 (linux—host) 01/05/2016 _x86_64_ (24 CPU) 04:41:13 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle04:41:15 PM all 0.56 0.00 0.25 0.00 0.00 0.04

关于Exchange邮箱服务器角色故障排查及解决思路分享

在最近一次关于Exchange服务器故障中,出现了员工无法进入邮箱的问题,最直接方法来登录OWA页面,看看正常不正常,反映出来的报错信息如下: 当接到这个报障后,第一时间,当时有人问到是不是公司的CAS服务器挂了?当然还是如果对邮件服务器足够了解的话, 这个报错一定不是邮箱服务器CAS出现故障,因为如果CAS出现问题,您也到不了这个页面的,所以根据产品提供服务来判断,能打开OWA页面,说明CAS服务器是正常的,出现这个报错是在用户输入帐号和密码后出现的,那么其实不用去思考,故障点一定出现在邮箱服

Java应用线上问题排查的常用工具和方法

在长期排查线上问题的过程中,总结了一些工具的用法和排查问题的思路,这里跟大家分享一下,在遇到类似的问题时,希望能给予一些帮助. 首先讲讲工具, jvm 自带的一些工具是必须熟练掌握的,例如jstack, jmap, jstat等,它们可以帮我们去深入了解JVM正在做的事情,主要的适用领域有这些: 1.jstack jstack可以告诉你当前所有JVM线程正在做什么,包括用户线程和虚拟机线程,你可以用它来查看线程栈,并且结合Lock信息来检测是否发生了死锁和死锁的线程. 没事儿jstack一下,知

隐藏错误排查

做了一个Excel文件导入功能,本地调试没有问题. 部署到测试环境后,点击上传什么反应都没有.查看错误日志也没有什么错误信息. 然后没有了排查错误的思路.只好寻求同事帮助,同事建议我在代码中,多个可能出错的步骤加上消息提示.WebForm的后台消息弹窗. 但是还是找不到错误消息,很郁闷.其实是我加的弹窗不够多,还没有加到出错的位置. 自己排查了一会,后来我耐下性子,发现代码最外层有一个异常捕获,但是捕获后没有做任何处理.什么提示消息也不返回,这导致了我看不到任何异常信息. 然后我就在这个地方加代

spring问题排查-调低日志等级

问题描述 1. 页面经过一次修改后,提交后页面出现400错误,但是后台并没有输出任何错误信息. 2. debug监听应页面相应的提交链接也没有任何反应(没有进入后台的controller方法中). 3. 在浏览器刷新提交链接可进入后台方法(Debug可以监听到) 解决方法: 1. 通过问题中的第3条可以看出肯定是页面中的内容,应该是参数的问题导致无法提交的. 2. 但是通过页面进行排查的难度也非常大,看了20分钟也看不出有什么异常. 3. 看了一些文章收到启发,想试一下通过降低log的等级,查看

记一次JVM Metaspace溢出排查

多图预警! 环境:系统测试(Windows Server/JRE8/tomcat7) 现象:应用运行几天后,出现访问超时,服务器cpu利用率居高不下 问题日志:OutOfMemoryError:MetaSpace 问题分析: 原因分析:MetaSpace是jvm存放类信息的内存空间,发生溢出的可能原因: metaSpace设置过小,不足应用所需 应用metaSpace持续增长,超过metaSpace限制 定位:问题最先从DeviceStatusMonitorTask中报出,而这个定时任务新版本修

95%的技术面试必考的JVM知识点都在这,另附加分思路!

概述:知识点汇总 jvm的知识点汇总共6个大方向:内存模型.类加载机制.GC垃圾回收是比较重点的内容.性能调优部分偏重实际应用,重点突出实践能力.编译器优化和执行模式部分偏重理论基础,主要掌握知识点. 各个部分的内容如下: 1>内存模型部分:程序计数器.方法区.堆.栈.本地方法栈的作用,保存哪些数据: 2>类加载部分:双亲委派的加载机制以及常用类加载器分别加载哪种类型的类: 3>GC部分:分代回收的思想和依据,以及不同垃圾回收算法实现的思路.适合的场景: 4>性能调优部分:常用的j

99% 的人都不知道的 Kubernetes 网络疑难杂症排查方法

原文链接:Kubernetes 网络疑难杂症排查分享 大家好,我是 roc,来自腾讯云容器服务 (TKE) 团队,经常帮助用户解决各种 K8S 的疑难杂症,积累了比较丰富的经验,本文分享几个比较复杂的网络方面的问题排查和解决思路,深入分析并展开相关知识,信息量巨大,相关经验不足的同学可能需要细细品味才能消化,我建议收藏本文反复研读,当完全看懂后我相信你的功底会更加扎实,解决问题的能力会大大提升. 本文发现的问题是在使用 TKE 时遇到的,不同厂商的网络环境可能不一样,文中会对不同的问题的网络环境

【运维者说】程序员玩跨界,错在运维人员

在很多交流场合,我们或多或少能听到有小伙伴抱怨运维岗位工作没有得到老板或者公司同事的认可,这怪谁呢?私以为只能怪运维岗位的各位同行,为什么这么讲呢?我这个攒了很久的大招,今天终于可以释放出来了. 恰逢看到田逸老师写的博客<程序员,请不要抢系统管理员的饭碗>以及文章下面各位同仁的评论内容,很多小伙伴基本上是从一个系统管理员的角度出发说出了安全问题的原因是程序员不应该这么做而这么做了,那程序员应该怎么做,他们知道吗?从这篇博客中描述的安全问题出发,田逸老师作为系统管理人员排查问题的思路非常清晰,对