文章目录
排查程序bug等问题的思路
针对一个完全没有接触过的程序,特别是没有注释的情况下,会存在碰到很多问题,虽然在别人机器上已经跑通了,但是在copy到自己机器上也会跑不通,最主要的原因有几种情况.
- 系统环境不一致
- 程序本身有bug,或者存在
1. 系统环境不一致
系统环境不一致也分很多种
- 操作系统层级的不一致, Linux 系统 Windows系统, macos 系统,不同的环境经常会在以下情况下不一致.
1. 文件路径访问的不一致 ,这种需要查看不同的操作系统下文件访问的区别.
2. 需要修改的环境变量 配置文件不一致,window一般是在 我的电脑->高级系统设置->环境变量-> path ,而 macos 一般是 https://www.jianshu.com/p/463244ec27e3
说明一下:所谓的环境变量,就是你命令的快捷方式,比如在mac系统的终端,或者win系统的cmd下, 执行 python,需要告诉操作系统,这个命令的具体执行路径,只有配置了,系统才能知道这个命令是执行具体绝对路径下的可执行程序.
- python环境的不一致, 目前已知的python会在本机存在多套环境,且anaconda会自己管理安装python环境,所以可能存在 操作系统的python环境是好的,但是conda 环境没有好,反之也会存在
- 程序缺少必要的模块包(此处针对python) ,比如 运行本次图像识别,需要导入的包,这种比较简单,通过跑第一步的import就可以知道,如果少了包,系统会有报错提示.
- 引入的模块包版本不一致, 不同的模块包会存在不兼容的情况,此种很正常,因为前期设计架构的不合理,为了性能或者易用性,会存在后续版本不兼容前期版本的情况,又或者依赖的其他模块必须是指定的版本,因为不同的版本的API是不一样.
2. 程序本身有bug,或者存在
程序本身有bug,这种情况需要针对性的分析,可能的情况
- 本身程序的健壮性不行,没有考虑到可能的异常情况.
- 本身程序需要运行的环境苛刻,比如需要配置大内存,大磁盘,对机器性能有要求.
- 高并发多线程情况下的结果不符合预期(这种在python应该比较少见)
2.1 本身程序的健壮性不行
第一种情况比较常见因为程序的编写者水平的问题,或者时间问题,以及实现时需求方并没有要求适配那么多情况 .如果发生了程序运气不符合预期, 需要进行以下的排查思路
2.1.1 首先看报错日志的情况,没有报错日志这种单独另外再说
- 根据报错日志,查看具体的代码报错行号(现有的主流语言,python,java等 都会提示具体的代码报错行)
举例:
FileNotFoundError Traceback (most recent call last)
<ipython-input-2-7af0422b3658> in <module>
9 img_size=64
10
---> 11 train_labels = list(paths.os.listdir(traindata))
12 test_labels = list(paths.os.listdir(testdata))
13
FileNotFoundError: [WinError 3] 系统找不到指定的路径。: 'datatrain\\'
- 逐行解读代码,了解代码具体执行的含义,如果不懂某行代码的含义,可以搜索引擎查询关键字,了解
- 检查代码符合预期但是执行结果不符合预期,那就增加日志打印,有debug条件的请debug调试,没有debug条件的请通过日志打印的方式,查看代码的执行情况.
- 逐行解决,直到符合预期
2.1.2无报错日志,或者说无明显的系统异常报错日志
此种情况,稍微有些棘手,一般我通过以下方式进行排查
- 检查程序是否存在把异常吃掉的情况,比如在常见的 文件读取,网络访问,数据格式转换等等,都会存在.此种情况,请把异常情况抛出来.
- 补充程序日志,这种情况需要补充部分关键点的日志打印,用来定位程序出错的行数.
3. 总结
针对程序跑出来不符合预期,或者完全无法执行这是一件很正常的事情,因为所有程序运行都需要前置运行条件,程序是人写的,那就有存在出错,或者设计不合理的地方,总体的思路就是,有报错日志根据报错日志排查,无报错日志则 补充日志定位具体的代码异常.
补充说明:
- 以上均只是针对单机程序的问题排查,针对分布式或者高并发多线程的情况,此种问题排查更加复杂,而且很多情况很难复现,这里不多说了,应该暂时用不到.
- 以上是在阅读或者学习其他人代码时,进行的一些经验总结.