一个毕生难忘的BUG
记得以前接手过一个Java项目,服务器程序,直接让Jar在linux上跑的那种,
这个项目由两个web服务组成,也就是两条Java进程,主进程 xxx.jar,辅助进程 xxx_helper.jar。主进程程序中某些功能依赖于辅助进程提供的服务。
困扰我们的BUG是在生产环境中辅助进程xxx_helpler.jar不定时无故崩溃,且无jvm错误日志产生,也无被系统本身因为资源损耗严重问题而杀死的记录。 百思不得其解之下我们只能把问题归因于是程序存在性能问题而被杀死,至于为什么没有杀死记录没人知道。 当时团队中没有linux玩的很溜的人,也不会查记录,通过我们那点粗浅的经验,我们想当然的以为程序崩溃就是因为消耗内存过多被系统杀死的,因为当时跑这个程序的机器内存异常紧张,所有人的思路都往这个方向被带了过去。
我开始优化xxx_helper.jar程序的性能,什么缓存、多线程、jvm启动参数调优、降低代码算法事件复杂的,反正各种折腾,几乎把代码全部重写一遍, 可程序无辜崩溃问题依旧存在 。
为了这个问题我连着好多天吃不好睡不香,做梦都在想办法解决这个问题。 写代码多年,这个问题让我体验到前所未有的无力感。 然而,正当我无计可施之际, 转机来了。 我无意间打开了重启主进程xxx.jar的脚本,发现里面有这么一段
ps aux | grep xxx | awk '{print $2}' | xargs kill -9
这段脚本的作用是,提取进程名称中有xxx关键字的进程ID, 然后kill之。因为整个脚本的逻辑是先关闭存在的进程,然后再启动。
而我的项目主进程xxx.jar和辅助进程xxx_helper.jar名称中都存在xxx关键字, 也就是说之前xxx_helper.jar这个进程无辜崩溃并不是因为程序本身的原因,而是因为主进程启动脚本在杀死主进程xxx.jar时一道把xxx_helper.jar也给杀了。
看到这段脚本我整个人呆了,就因为一时疏忽,却浪费了好几天的时间, 这跟花了几千块钱买到价值几块钱的东西是一样的感受,而且我这还是自己坑自己,这种滋味别提有多难受了。 我当时就用38码的手狠狠的抽打自己40码的脸,以发泄内心悔恨自责的情绪。
后来,等冷静下来以后,我只能安慰自己花了这么多功夫也不是一无所获,至少程序的性能是被我实实在在优化了。 虽然, 这种优化对于这个项目是毫无意义的。
通过这个事故我领悟到,对于某些顽固的程序BUG,当我们根据自己想当然的经验难以找到形成原因时, 就应该跳出问题的本身或者自己寻找BUG的思维框架来思考, 因为造成BUG的原因往往和之前寻找BUG的路径八竿子打不着。
一个毕生难忘的BUG的更多相关文章
- 一个比较难忘的BUG
本学期开设了软件测试课程,在课上有讨论到bug,想到bug,真是很令人头疼的东西,相信每个程序都多多少少会有几个头疼的bug. 初学java时写过一个字符串判断的循环,之前学的C++字符类型用“==” ...
- 最难忘的Bug调试经历
摘要:目前,著名的社区问答网站Quora上出现一个很火的讨论:你调试过最难的Bug是什么?大家纷纷留言,把自己最痛苦的一次调试经验写下来. 相信每位程序员都有过一段不堪回首地Bug调试经历,程序员一听 ...
- ASP.NET MVC的Ajax.ActionLink 的HttpMethod="Get" 一个重复请求的BUG
这段时间使用BootStrap+Asp.net Mvc5开发项目,Ajax.ActionLink遇到一个重复提交的BUG,代码如下: @model IList<WFModel.WF_Temp&g ...
- 最近提交一个mysql5.7的bug,提醒自己以后注意写SQL要规范
最近帮朋友提交一个mysql5.7的bug , oracle mysql 的大神还回复我 , 以后注意书写sql规范 , 潜台词是不是不要给他们增加工作量 https://bugs.mysql.com ...
- 移动端一个奇怪的触摸bug
这两天遇到一个很奇怪的bug,在移动端,一个页面里所有的input框都不能点击,我查了一下,里面的没有设置readonly属性,只要页面滚动一下就可以用了,而且,只要我在真机测试的时候,f12开发者模 ...
- STL 库中的陷阱----一个难以察觉的 bug
请找出下面程序的 bug? int maxProfit2(vector<int> &prices) { int local[3] = {0}; int global[3] = {0 ...
- 一个因为粗心的Bug
/** * 数据绑定,分页显示 */ private void updataMenu(final EditText search) { if(listwz==null) { return; } pag ...
- 表与表的关系把RD搞乱了,记一个Procedure中的bug
就是6张表的关联查询,写了一个存储过程,使用4层for来处理 bug:最后一个for中,两张表的关联条件少了一个,结果数据多查了. 排查办法:使用dbms_output.printline('');每 ...
- 记一个CRenderTarget中的BUG及解决办法
转载请注明出处:http://www.cnblogs.com/Ray1024 一.问题描述 在MFC中使用Direct2D有现成的方法,在Visual Studio 2010 SP1及以上环境中MFC ...
随机推荐
- 洛谷P4180 [Beijing2010组队]次小生成树Tree(最小生成树,LCT,主席树,倍增LCA,倍增,树链剖分)
洛谷题目传送门 %%%TPLY巨佬和ysner巨佬%%% 他们的题解 思路分析 具体思路都在各位巨佬的题解中.这题做法挺多的,我就不对每个都详细讲了,泛泛而谈吧. 大多数算法都要用kruskal把最小 ...
- SA 后缀数组
SA 后缀数组 首先一定要确定\(SA\)是个什么东西 \(SA[i]\)表示的是排名为\(i\)的后缀是哪一个 至于后缀\(i\)的排名是多少,那个是\(rank[i]\) 当然啦 最最最难懂的就是 ...
- [BZOJ1051] [HAOI2006] 受欢迎的牛 (强联通分量)
Description 每一头牛的愿望就是变成一头最受欢迎的牛.现在有N头牛,给你M对整数(A,B),表示牛A认为牛B受欢迎. 这 种关系是具有传递性的,如果A认为B受欢迎,B认为C受欢迎,那么牛A也 ...
- 关于 CI框架访问数据库类提示Call to undefined function mysqli_init() 问题解决
我上次实践发现,安装在Win10 WampServer3.0.4集成环境,不仅打不开phpmyadmin会报错就算了,而且报错后又没提示那么解决,同时你打开php扩展配置发现,WampServer系统 ...
- 使用 vscode将本地项目上传到github以及删除github上的某个文件夹
安装Git后,可以看到windows环境下有两个命令输入窗口Git CMD 和Git Bash Git GUI是可视化图形界面 Git中的Bash是基于CMD的,在CMD的基础上增添一些新的命令与功能 ...
- Spring Boot Actutaur + Telegraf + InFluxDB + Grafana 构建监控平台之应用数据分析
本节将引入完美的granafa仪表板,在上节的基础上,并提出自己的一些监控数据的总结和看法 你可以有一个类似于这个的Dashboard,会引入监控Zimbra协作 本节环境采用的是centos7系统, ...
- ASP.NET Core Web API下事件驱动型架构的实现(四):CQRS架构中聚合与聚合根的实现
在前面两篇文章中,我详细介绍了基本事件系统的实现,包括事件派发和订阅.通过事件处理器执行上下文来解决对象生命周期问题,以及一个基于RabbitMQ的事件总线的实现.接下来对于事件驱动型架构的讨论,就需 ...
- Beagle X15 版本制作和烧录
作为一大硬件开源组织中的一员,Beagle X15以他的强悍的性能在工业界有着广泛的应用,最近在做一个项目中 要用到它,就做了一些这方便的研究,发现里面还有不少坑要踩的,梳理一下踩到的坑,为后续做个积 ...
- 案例:中科院光机所应用大数据可视化工具-LightningChart | 见证高性能图表
中国科学院上海光学精密机械研究所 中国现代光学和激光科学领域领先研究所 中国科学院上海光学精密机械研究所(简称中科院上海光机所)是我国建立最早.规模最大的激光专业研究所,成立于1964年,现已发展成为 ...
- python 重要的日志模块logging
一,logging模块简介 logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级.日志保存路径.日志文件回滚等:相比print,具备如下优点: 可以通过设置不同 ...