您现在的位置: 首页 > 网站导航收录 > 百科知识百科知识
Java程序出错了,定位错误有哪些技巧?
错误,代码,日志Java程序出错了,定位错误有哪些技巧?
发布时间:2020-12-06加入收藏来源:互联网点击:
3.通过开发工具比如eclipse,在方法下面打一个断电,通过debug运行,来调试代码,此方法也是程序员经常使用的方法,可以清楚看到变量的传递,方法调用,包括阅读源码经常用到。此方法如果走的太快了,跳过去,可能要重新运行一遍debug。
回答于 2019-09-11 08:43:50
排错是衡量程序员水平的一个重要指标,其中最为重要的就是定位错误,不但要定位快速而且要定位准确。我来分享一下我在定位错误方面的一些经验,希望能够对题主有帮助,同时也希望各位大神能够补充~
一、错误的分类
程序运行出错指的是程序未按照程序预设的逻辑执行,从而造成非预期的结果,具体表现就是报错中断或数据错误。作为程序员,一定要分清哪口锅是自己的,对于设计中的预设错误一定要甩出去,例如:传入参数不合法、违反业务规则等等。本节,我们只考虑自己的锅。自己这口锅里能装的错误也很多,但是我们不考虑纯粹的认为因素造成的运行出错(例如版本遗漏、配置错误等等)。
1、有报错的错误
造成这一类错误的原因,主要有:
A. 开发过程不严谨,没有进行必要的判断或没有充分的考虑各种可能的分支(这就是为毛好些java规范里要求if和else要成对出现的原因),这类错误里最为常见的异常就是空指针、下标越界、除数为0等运行时异常了;
B. 内存泄露问题。java对指针进行的透明化处理,GC操作大多数时间也由JVM自主完成,但是毕竟内存中的数据是程序在运行过程中塞进去的,如果数据的生命周期设计存在问题的话,很容易会造成OOM错误。前段时间和一个朋友就聊到了这个问题,他所在公司的一个项目就是因为未及时释放有效数据导致jvm内存占用持续增高,即使JVM执行FullGC操作后,内存占用率依旧很高,从而导致OOM错误。
C. 捕获的范围小了,预期外的错误未捕获。在一个项目中就遇到过这种情况,程序只对Exception进行了捕获,未捕获Error,导致程序在抛出了一个Error(那次是一次人为的原因)而导致未回滚数据库事务,造成了锁表。
2、没报错的错误
造成这一类错误的原因,主要有:
A. 虽然抛出了错误,但是被吃掉了。就是在catch到Exception后没有进行任何处理,包括打印日志。这个的原因就不多说了...说多了都是泪。
B. 程序正常执行完成,但是结果不符合预期。这个原因很可能是程序未对并发安全进行设计。
C. 无限等待,超时时间设置不合理或者死锁。
二、错误的定位
定位错误是有一个大概的顺序的。
1、检查有没有报错信息
日志文件中登记的错误,这个算是最简单的,在定位错误时,也最希望问题在这一步得到确认。在打印异常时,通常会打印异常的调用栈信息,通过调用栈信息就可以很便捷的定位问题了。
2、检查标准输出文件和异常输出文件有没有报错信息
Error可能不会打印在日志文件中(如果关掉了标准输出就不会打印了),但是会打印在标准输出中,前提是没有把标准输出也吃掉。通常在出现错误时,单单通过检查日志来定位问题怕是不足以说明问题,通常还会配合dump文件进行分析,因此在程序启动时需要开启相应参数(-XX:+HeapDumpOnOutOfMemoryError),在JVM出现内存溢出异常时Dump出当前的内存堆转储快照以便后续进行分析。
3、结合系统资源使用情况
如果没有报错的信息,这时候可能需要结合当前的CPU使用率等情况进行分析了。找到最为消耗资源进行针对性的分析,常用的linux命令有:
top (-H -p pid):找到占用CPU最高的线程ID
jstack:打印进程堆栈信息,看看死锁,线程啥的
jstat:监视虚拟机gc之类的功能
jmap:java内存映像工具
kill -3:吓唬jvm用的,让他生成dump文件
netstat: 查看网络连接情况用的
4、看代码
前3步的作用都是为了这一步来服务的,当然代码也需要结合一些日志来分析(总不可能一行都没有吧~)。但是不一定任何时候都能通过前三步找到代码方面的蛛丝马迹的(例如,当没有日志且没有现场时)。咳咳~这时候就体现出代码评审的意义了,一些公司在开发过程中非常不注重代码的走查和评审工作,开发的时候能用就行,出现问题以后又到处甩锅,我只能说:可怜了,我的开发小哥!
绝大多数的问题都是因为开发原因导致的,虽然缺陷总是不可避免的,但是为了后期能够相对工作的轻松一点,希望每个开发小伙伴都能有一个良好的编码规范和日志规范,以便在出现问题的时候能够快速定位,避免被“祭天”。
以上就是我的一些观点和经验啦,欢迎大家进行补充~
回答于 2019-09-11 08:43:50
针对这个问题,大致的定位错误技巧有这么几种吧。
开发阶段:
1.控制台信息;
2.debug;
3.try...catch...
上线后:
1.日志文件;
2.大家elk日志系统等。
我从事互联网开发10年,主要的研究方向集中在Java web微服务架构领域,Android移动端研发,HTML5前端方向,我会陆续写一些关于互联网技术方面的文章,感兴趣的朋友可以关注我,相信你一定会有所收获。
如果有Java,Android,H5等开发方面的问题,或者是开发求职方面的问题,都可以在评论区留言,或者私信我!
回答于 2019-09-11 08:43:50
程序出错是很正常的事情,每天你都会遇到各种各样的异常,那么遇到问题应该怎么定位问题,首先要看控制台,报的异常是什么?如果是生产环节,那么可以看服务器日志,模拟出错,然后定位问题,当然还有一些问题可能是因为程序编写不规范该加的符号没有加, 更有甚者可能是因为开发工具或者缓存等因素造成错误发生,不过做程序只要时间久了,慢慢就有经验了,遇到错误就知道该怎么解决了,一点建议仅供参考,希望对你有所帮助!
下一篇:返回列表
相关链接 |
||
网友回复(共有 0 条回复) |