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

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

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

我需要定时去从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的数据不符合superagent内部解析方式,而因为请求容忍时间太长了,导致了内存异常不能暴露出真正问题。

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

还原现场的前提是:

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

第二个遇到的问题是:

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

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

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

转载于:https://www.cnblogs.com/freephp/p/7220688.html

一叶障目:排查问题的思路相关推荐

  1. PLC故障排查步骤的思路和方法

    PLC故障排查步骤的思路和方法 PLC硬件损坏或软件运行出错的概率极低,检查故障时,重点应放在PLC的外围电气元件,PLC的故障大多数是外围接口信号故障,维修时,只要PLC有部分控制的动作正常,就不用 ...

  2. 【博客630】MTU网络问题排查及解决思路

    MTU网络问题排查及解决思路 前奏:什么是MTU ? 网络层发送数据包是有最大长度的,网络层从传输层接收到要发送的数据包时,它要判断向本地哪个接口发送数据,并查询该接口获得其最大传输单元MTU(Max ...

  3. 关于MySQL内存泄露如何排查的一些思路

    点击上方"蓝字" 关注我们,享更多干货! MySQL使用内存上升90%!在运维过程中50%的几率,会碰到这样的问题.算是比较普遍的现象. MySQL内存使用率过高,有诸多原因.普遍 ...

  4. linux服务器 cpu使用率过高,服务器CPU使用率过高排查与解决思路

    发现服务器的cpu使用率特别高 排查思路: -使用top或者mpstat查看cpu的使用情况 mpstat -P ALL 2 1 Linux 2.6.32-358.el6.x86_64 (linux- ...

  5. linux 磁盘满了 预警,Linux磁盘空间满了的排查与解决思路

    block正常满 (磁盘实际不足) inode 满 大量的小文件 block 满 文件没有被彻底删除(硬链接数0 进程调用数不为0) 解放方法: 1 查看df -h 磁盘使用量根据占用量大小逐步逐步排 ...

  6. window服务器cpu过高的排查_服务器CPU使用率过高排查与解决思路

    发现服务器的cpu使用率特别高 排查思路: -使用top或者mpstat查看cpu的使用情况 mpstat -P ALL 2 1 Linux 2.6.32-358.el6.x86_64 (linux- ...

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

    在最近一次关于Exchange服务器故障中,出现了员工无法进入邮箱的问题,最直接方法来登录OWA页面,看看正常不正常,反映出来的报错信息如下: 当接到这个报障后,第一时间,当时有人问到是不是公司的CA ...

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

    日常工作中有时候会遇到Linux服务器上出现CPU负载过高的情况,影响程序的运行,一般的排除思路如下: 方法一: 使用top命令 然后按shift+p按照CPU排序,找到占用CPU过高的进程的pid ...

  9. SpringCloud大项目最快速的排查问题的思路

    尝试重现问题. 查看Log.服务器监控等信息. 梳理最近的修改项.

最新文章

  1. 如果地府需要一个后台管理系统,你会如何设计?
  2. 事件分发机制并不是洪水猛兽
  3. python爬虫解决网页重定向问题
  4. 注解RequestMapping中的URI路径最前面到底需不需要加斜线?
  5. fancybox去除不受待见的水平滚动条
  6. UINavigationController
  7. netflix数据处理2(转)
  8. oracle 指定格式化,Oracle中的格式化函数
  9. 【CodeForces - 260A】Adding Digits (思维构造)
  10. pythonrgb高精度浮点运算类型_python实现RGB字符串,按24位对齐后输出对应Integer行数字...
  11. 怎么在Java里辨别小数_求教java中如何判断一个数是不是小数,求详细代码及解释...
  12. IoT物联网天线有哪些?
  13. WinHttp用法(WinHttp.WinHttpRequest.5.1方法,属性)
  14. 学生用计算机指数函数,指数函数计算器
  15. 计算机的平方根的符号是哪个,平方根
  16. C++ class 和 struct 构造函数
  17. linux:硬链接和软链接
  18. webServer_国内手机号码归属地查询
  19. openwrt on MT7688 wifi启动方法
  20. 10 Java基础笔记-封装

热门文章

  1. STM32H743+CubeMX-ADC(16bit分辨率)+DMA采样三路模拟量(并行),没过采样。
  2. 水文特点是什么意思_水文监测仪器设备简介
  3. Qt文档阅读笔记-Qt跨平台库(Qt基本库)
  4. Qt文档阅读笔记-官方2D Painting Example实例解析
  5. MySQL入门之PHP的MySQL数据库编程
  6. c语言缓冲池管理算法,操作系统复习资料
  7. 计算机进位法,计算机基础知识--进位计数制.docx
  8. php mysql.so 下载_Linux安装php-mysql提示需要:libmysqlclient.so.18()(64bit)的解决办法-Go语言中文社区...
  9. 鸿蒙系统被泼冷水,给鸿蒙泼冷水:见不得同行的好,是人间最可恶的蠢和恶
  10. wxpython显示图片_wxpython下图片局部显示的方法