debug思路备忘

文章目录
  1. 1. 神经网络模型的debug
  2. 2. 如何快速对接联调功能(最小可执行代码)
  3. 3. debug整体思路(如何升级)
  4. 4. 代码相同, 结果不同的可能性
    1. 4.1. 硬盘空间是否不足
    2. 4.2. 网络情况不同
    3. 4.3. 代码调用的网络接口不同
    4. 4.4. 调用数据库的数据不同
    5. 4.5. 读取文件不同
    6. 4.6. 环境变量不同
    7. 4.7. 电脑性能不同
    8. 4.8. 第三方库的版本不同
    9. 4.9. 语言版本不同
    10. 4.10. 操作系统不同
    11. 4.11. 前端: 浏览器不同
    12. 4.12. 前端: 浏览器安装的插件不同
  5. 5. Shell脚本
  6. 6. 网页可以浏览, 命令行不能联网
  7. 7. print无法输出内容(特别是docker容器里)
  8. 8. 参考资料

.

神经网络模型的debug

神经网络模型debug非常困难, 难点在于没有硬性的报错, 但是性能分数会非常低

debug思路:

  1. 看源代码, 肉眼debug
  2. 查看数据是否有错误
  3. 检查模型
    1. 定位模型的模块是否有错误
      1. 把复杂模块使用简单模块(例如全连接替代)
      2. 把某些模块的输出换成golden
      3. 单独测试某个模块能否过拟合

如何快速对接联调功能(最小可执行代码)

想要快速的对接联调某个功能, 可以先把该功能独立出来, 新建一个该功能的最小可执行代码, 给对接方, 双方先使最小可执行代码联调成功, 再对接真正的项目代码

debug整体思路(如何升级)

出现bug后, 一定要查询到bug原因

半懂不懂的解决bug是非常错误的行为.

即便误打误撞解决了bug, 下次这个bug大概率还会重现, 因为没有针对根本原因进行解决.

代码相同, 结果不同的可能性

硬盘空间是否不足

例如elastic search当硬盘空间占用大于95%时不能写入数据

网络情况不同

例如某些前端框架使用了某些网络资源, 当不联网时网页显示会出错

代码调用的网络接口不同

例如调用API的ip和uri等配置

调试方法: 实时查看被调用APi的日志, 手工触发调用, 查看调用过程的区别

调用数据库的数据不同

例如调用了不同的数据库, 或者相同数据库里的数据不一样

读取文件不同

例如配置文件, 数据文件, 字典等内容

环境变量不同

例如oracle需要读取一些环境变量才能成功启动

电脑性能不同

电脑运行速度导致一些依赖程序启动的慢, 或者文件复制没有结束, 都可能导致代码运行结果不一致

调试方法: 在一些差异点代码之前sleep几秒, 然后再执行

第三方库的版本不同

例如tornado, pytorch版本等

语言版本不同

例如Python, node版本等

操作系统不同

例如Windows和linux的多进程机制不同, linux种类不同, linux小版本不同

例如mac上npm install后的node_modules文件夹里包含软连接, 当把node_modules复制到windows上时软连接会失效, 导致前端网页无法找到模块

前端: 浏览器不同

例如浏览器不同, 浏览器版本不同

前端: 浏览器安装的插件不同

例如一个浏览器可以用,另一个浏览器报错对象缺少方法, 可能是需要浏览器安装插件才能支持

Shell脚本

命令不能加引号,如果是变量名表示执行命令则可以赋值时可以使用引号

网页可以浏览, 命令行不能联网

可能是环境变量里面的PROXY设置有问题

1
2
3
env |grpe PROXY     # 查看代理的环境变量
unset HTTP_PROXY # 删除对应的环境变量
unset HTTPS_PROXY

print无法输出内容(特别是docker容器里)

设置环境变量: PYTHONUNBUFFERED=1

参考资料