案例一:

由于成员变量的初始化写在了构造方法里,以致于原本每次模型计算都要初始化一次,变成了创建一次对象才初始化一次,一批量的计算才初始化一次。

现象:在WINDOWS的本地测试类上单次计算调试结果正确,而相同的代码放到LINUX上批量计算结果错误。

刚开始发现Linux上批量计算出来的结果非常离谱,我们首先想到的就是包打错了。我们的代码分为两块,一块是JAVA从数据库取模型的输入参数,然后JAVA调用C++进行模型计算,计算结果返回JAVA再入数据库。我们检查Linux打的包大小和测试环境上的包大小是否一样,结果发现是一样的。接着我们推测是不是只修改了程序的部分内容导致包大小没有明显变化。我们重新打了C++和JAVA的包,发现现象还是一样。本地上单步调试就是和Linux上跑出来的结果不一样。当时我们的测试类只支持单次模型计算而不支持批量计算。我们压根就没有想到是代码的问题,而想的是环境问题和配置问题。因为经过代码比对,我的本地上的代码和打包的代码是完全一致的,我本地上单次计算模型结果都正确,就认为代码是正确的。Linux上不能像本地一样设断点单步调,只好不断的加日志,查日志。然而多进程同时批量计算写的却是同一个日志文件,导致日志是混起来的。那就关掉多余进程只留一个进程,这样日志就不会混了。但是计算量贼大,进程关了只剩1个,每一次全流程计算都耗了大量时间,但是结果就是和本地的不一样,绝不绝望?日志文件很大,且没有把输入参数的主键ID传到C++里,导致我本地上测的模型参数在日志文件里很难定位出来。我坚信我的代码没问题,要不然我在本地上跑出来的结果就不会正确了。查这问题重上午到第二天凌晨,人都傻了,细想每一步有没有可能出错,不断的试验,啥办法都试过了。最后陪加班的组长建议,把本地上的测试类改成和Linux上的流程一致,改成支持批量计算。我依旧认为是环境问题,而不是代码问题,改测试类是浪费时间,时间又很晚了,改代码的欲望十分低落,但还花了点时间把代码改了,不抱希望的地丢了几笔参数跑跑看。他娘的,居然错误复现了。不花两分钟的时间就定位出了问题把它改了。

代码原因,每个计算任务都是跑一批模型输入参数的,但每个任务只创建一次同种类型的模型输入参数对象。我把输入参数的默认值初始化写在了构造方法里,每次计算都要求初始化才行。在构造方法里初始化模型参数的结果就是一批模型参数只被初始化一次,所以跑单笔模型参数是复现不出问题的。

案例二:

模型参数的组合主键新增了一个"场景"字段,而代码中用HashMap进行缓存的key没改,导致不同"场景"下的模型输入参数不同,但是不同"场景"的计算结果却完全一样。

现象:导致不同"场景"下的模型输入参数不同,但是不同"场景"的计算结果却完全一样。

立马决定要复现问题,単测了一笔模型输入,发现和Linux上跑的结果不一样。首先把测试类改成支持多"场景"。接着在本地准备和Linux上测试条件,这是一个繁琐的过程...最后由于测试条件不是完全一致,计算结果本地和Linux上跑的结果不一样,但这并不是问题,因为Bug现象被成功复现了,所有不同“场景”下取的参数不同,结果却全部一样。

最后发现是缓存中的Key值没有加上"场景"字段,Key依旧是原来的id主键,导致取的关联参数都是第一个相同id模型参数的关联参数。所以计算的结果都是第一个同id的模型参数的结果。

DEBUG日记:同样的代码在不同的环境却得出不同的结果。相关推荐

  1. 如何debug函数_如何使用 pdb 来性感 debug 你的 Python 代码?

    当你的代码写得多了,你总会出现这样或者那样的错误,有时候代码突然可以用,有时候代码又突然傻逼,有时候你只是离开一会,它就自动好了-就像女生的心思,总是让人捉摸不透,总是那么的魔幻. 今天,小帅b来跟你 ...

  2. debug assertion failed是什么意思?_如何使用 pdb 来性感 debug 你的 Python 代码?

    当你的代码写得多了,你总会出现这样或者那样的错误,有时候代码突然可以用,有时候代码又突然傻逼,有时候你只是离开一会,它就自动好了-就像女生的心思,总是让人捉摸不透,总是那么的魔幻. 今天,小帅b来跟你 ...

  3. 微信云托管如何实现一套代码对应多个环境

    微信云托管 是由微信团队联合腾讯云推出的一站式后端云服务.对于应用开发采用前后端分离架构的场景,云托管可做到免运维免域名.免服务器管理.防 DDoS 攻击和境外加速等,从代码管理到 CI/CD 流水线 ...

  4. 代码人入门——生产环境篇

    代码人入门--生产环境篇 本系列博文由泰勒展开氏整理编辑,转载须注明出处. 代码人入门系列 状态 生产环境篇 施工中 生产工具篇 即将出炉 学习方法与资料篇 即将出炉 其他系列 状态 捂脸网人入门系列 ...

  5. android debug bridge tools_如何优雅的管理多环境下的Android代码

    秦子帅明确目标,每天进步一点点..... 作者 |  小码哥哥地址 | juejin.im/post/5e1ef261f265da3e0535f10a 介绍日常开发过程中除了主工程代码,肯定也少不了调 ...

  6. 辉仔日记之学代码第十五期——IO流图书管理系统

    嚯嚯嚯!今天也是写日记的一天啦! 温故而知新,完成了一个项目,及时总结才能继续成长!在写图书管理系统想过放弃,因为太多要注意的点,各种各样的问题.重打了很多的代码,几乎是推到重来!功夫不负有心人,果然 ...

  7. Eclipse Tomcat在debug状态下修改代码就导致项目重启解决方案

    最近在项目中遇到的一个问题就是不管修改什么,Eclipse都会让Tomcat重启,这就导致了开发效率严重降低,毕竟一次重启就得几十秒,网上查询了一番终于找到了解决方案. Eclipse JavaWeb ...

  8. 辉仔日记之学代码第三期——家庭收支小程序

    目录 标题1:操作主流程 标题2:主菜单 标题3:选项1 标题4:选项2 标题5:选项3 标题6:回到选项1 标题7:选项4 标题8:总结 前言::时隔一天我又回来啦,今天的任务只是编写一个超难超难的 ...

  9. 如何去除My97 DatePicker控件上右键弹出官网的链接 - 如何debug混淆过的代码

    概述 http://my97.net/是一个web浏览器的日期选择控件,非常好用,做得非常棒,各种API等事件等都很方便,但是使用了4.8beta3之后,在控件上面右击会出现官网链接 ,这个是PM以及 ...

最新文章

  1. ubuntu下面的SecureCRT破解失败问题+本地ubuntu系统远程连接RHEL服务器的免密码登录问题(自己归纳总结)
  2. 主线程中有多个handler的情况
  3. python画相关性可视化图_Python 可视化 | 关联图 - 散点图1
  4. 在Linux中清空某个路径下的特定命名格式的文件夹
  5. 聊聊hikari与tomcat jdbc pool的fail fast
  6. 五个部署Hyper-v的常见错误.
  7. Qt总结之三:磁盘文件操作、遍历文件夹和文件目录,并过滤和获取文件信息、后缀名、前缀名(三)
  8. 禅道下载与安装教程(完整版)
  9. 华为A1路由器虚拟服务器,华为a1路由器怎么设置
  10. 人生感悟-人生需学会放下
  11. 评:10月PMI指数新高, 带动大盘逆转, 跨年度业绩行情展开
  12. linux怎么生成arm文件,AMR 文件扩展名: 它是什么以及如何打开它?
  13. Roshan.exe 运行直接崩溃
  14. pdf在线翻译_推荐可以pdf等格式直接在线翻译的免费工具
  15. navicat for mysql 12 破解工具 亲测可用
  16. ffmpeg php 抠像_FFMPEG批量绿幕抠像BAT脚本实现
  17. fc安卓模拟器_Win10可以原生使用安卓APP了,模拟器的地位没了!
  18. 欧姆龙NJ/NX基于BaseNetwork Configuratore的 EIP通讯 方式
  19. Unity shader build 打包android和PC机显示效果不一样
  20. 电大计算机阅读英语作文,电大 英语网考翻译题库(绝对有命中题)

热门文章

  1. Oracle数据文件的备份与恢复
  2. 使用resNet网络 进行图像分类(jupyter notebook)
  3. 软件系统设计 表驱动法
  4. 完整版使用Shell脚本在多个服务器同时实现Mysql建表语句和删除表
  5. linux sed命令:查看gitlab配置文件删除注释行并过滤空行后的内容
  6. Fedora换源:换成aliyun镜像源
  7. Python Django后台管理模板美化:使用django-simpleui模块
  8. HBASE 2.2.6 永久REGION IN TRANSITION 异常解决
  9. Django 3.2.5博客开发教程:一些常用的模板使用方法
  10. 【收藏】Vue+elementUI的this.$refs.对象名.方法名的理解