排查程序bug等问题的思路

排查程序bug等问题的思路

针对一个完全没有接触过的程序,特别是没有注释的情况下,会存在碰到很多问题,虽然在别人机器上已经跑通了,但是在copy到自己机器上也会跑不通,最主要的原因有几种情况.

  1. 系统环境不一致
  2. 程序本身有bug,或者存在

1. 系统环境不一致

系统环境不一致也分很多种

  1. 操作系统层级的不一致, Linux 系统 Windows系统, macos 系统,不同的环境经常会在以下情况下不一致.
 1.  文件路径访问的不一致 ,这种需要查看不同的操作系统下文件访问的区别.
 2. 需要修改的环境变量 配置文件不一致,window一般是在 我的电脑->高级系统设置->环境变量-> path ,而 macos 一般是 https://www.jianshu.com/p/463244ec27e3 
 说明一下:所谓的环境变量,就是你命令的快捷方式,比如在mac系统的终端,或者win系统的cmd下, 执行 python,需要告诉操作系统,这个命令的具体执行路径,只有配置了,系统才能知道这个命令是执行具体绝对路径下的可执行程序.
  1. python环境的不一致, 目前已知的python会在本机存在多套环境,且anaconda会自己管理安装python环境,所以可能存在 操作系统的python环境是好的,但是conda 环境没有好,反之也会存在
  2. 程序缺少必要的模块包(此处针对python) ,比如 运行本次图像识别,需要导入的包,这种比较简单,通过跑第一步的import就可以知道,如果少了包,系统会有报错提示.
  3. 引入的模块包版本不一致, 不同的模块包会存在不兼容的情况,此种很正常,因为前期设计架构的不合理,为了性能或者易用性,会存在后续版本不兼容前期版本的情况,又或者依赖的其他模块必须是指定的版本,因为不同的版本的API是不一样.

2. 程序本身有bug,或者存在

程序本身有bug,这种情况需要针对性的分析,可能的情况

  1. 本身程序的健壮性不行,没有考虑到可能的异常情况.
  2. 本身程序需要运行的环境苛刻,比如需要配置大内存,大磁盘,对机器性能有要求.
  3. 高并发多线程情况下的结果不符合预期(这种在python应该比较少见)
2.1 本身程序的健壮性不行

第一种情况比较常见因为程序的编写者水平的问题,或者时间问题,以及实现时需求方并没有要求适配那么多情况 .如果发生了程序运气不符合预期, 需要进行以下的排查思路

2.1.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\\'
  1. 逐行解读代码,了解代码具体执行的含义,如果不懂某行代码的含义,可以搜索引擎查询关键字,了解
  2. 检查代码符合预期但是执行结果不符合预期,那就增加日志打印,有debug条件的请debug调试,没有debug条件的请通过日志打印的方式,查看代码的执行情况.
  3. 逐行解决,直到符合预期
2.1.2无报错日志,或者说无明显的系统异常报错日志

此种情况,稍微有些棘手,一般我通过以下方式进行排查

  1. 检查程序是否存在把异常吃掉的情况,比如在常见的 文件读取,网络访问,数据格式转换等等,都会存在.此种情况,请把异常情况抛出来.
  2. 补充程序日志,这种情况需要补充部分关键点的日志打印,用来定位程序出错的行数.

3. 总结

针对程序跑出来不符合预期,或者完全无法执行这是一件很正常的事情,因为所有程序运行都需要前置运行条件,程序是人写的,那就有存在出错,或者设计不合理的地方,总体的思路就是,有报错日志根据报错日志排查,无报错日志则 补充日志定位具体的代码异常.
补充说明:

  1. 以上均只是针对单机程序的问题排查,针对分布式或者高并发多线程的情况,此种问题排查更加复杂,而且很多情况很难复现,这里不多说了,应该暂时用不到.
  2. 以上是在阅读或者学习其他人代码时,进行的一些经验总结.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
61、简述负载测试与压力测试的区别。 参考答案: 压力测试(Stress Testing) 压力测试的主要任务就是获取系统正确运行的极限,检查系统在瞬间峰值负荷下正确执行的 能力。例如,对服务器做压力测试时就可以增加并发操作的用户数量;或者不停地向服务器 发送请求;或一次性向服务器发送特别大的数据等。看看服务器保持正常运行所能达到的最 大状态。人们通常使用测试工具来完成压力测试,如模拟上万个用户从终端同时登录,这是 压力测试中常常使用的方法。 负载测试(Volume Testing) 用于检查系统在使用大量数据的时候正确工作的能力,即检验系统的能力最高能达到什么程 度。例如,对于信息检索系统,让它使用频率达到最大;对于多个终端的分时系统,让它所 有的终端都开动。在使整个系统的全部资源达到“满负荷”的情形下,测试系统的承受能力。 62、写出bug报告流转的步骤,每步的责任人及主要完成的工作。 参考答案:(要结合自己实际的工作经验进行回答,不同公司略有区别) 测试人员提交新的Bug入库,错误状态为New。 高级测试员/测试经理验证错误,如果确认是错误,分配给开发组。设置状态为 Open。如果 不是错误,则拒绝,设置为 Declined状态。 开发经理分配bug至对应的模块开发人员。 开发人员查询状态为 Open 的Bug,如果不是错误,则置状态为Declined;如果是Bug则 修复并置状态为Fixed。不能解决的Bug,要留下文说明及保持Bug 为 Open 状态。 对于不能解决和延期解决的 Bug,不能由开发人员自己决定,一般要通过某种会议(评审会) 通过才能认可。 测试人员查询状态为 Fixed 的Bug,然后验证Bug是否已解决,如解决,置Bug的状态为

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值