panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x18 pc=0x9273ea] goroutine 106262 [running]:
github.com/antlinker/alog/store.(*FileStore).fileName.func1({0xc0093dd920, 0x23}, {0x0, 0x0}, {0xc000e7de70, 0x0})
/Users/liuyong/go/pkg/mod/github.com/antlinker/alog@v1.0.0/store/file.go:82 +0x4a
path/filepath.walk({0xc00440d308, 0x15}, {0x10b0bf0, 0xc00406dc70}, 0xc000e7de70)
/usr/local/go/src/path/filepath/path.go:438 +0x20d
path/filepath.walk({0xc000440530, 0x9}, {0x10b0bf0, 0xc00403ef70}, 0xc000e7de70)
/usr/local/go/src/path/filepath/path.go:442 +0x28f
path/filepath.Walk({0xc000440530, 0x9}, 0xc000e7de70)
/usr/local/go/src/path/filepath/path.go:505 +0x6c
github.com/antlinker/alog/store.(*FileStore).fileName(0xc0001a6160, 0x0)
/Users/liuyong/go/pkg/mod/github.com/antlinker/alog@v1.0.0/store/file.go:81 +0x1ef
github.com/antlinker/alog/store.(*FileStore).Store(0xc0001a6160, 0x0)
/Users/liuyong/go/pkg/mod/github.com/antlinker/alog@v1.0.0/store/file.go:129 +0x65
github.com/antlinker/alog/manage.(*_LogManage).writeStore(0xc0001161e0, 0x108ad10, {0xc0004404e0, 0xc0043f5278}, 0xc0000cee98)
/Users/liuyong/go/pkg/mod/github.com/antlinker/alog@v1.0.0/manage/manage.go:325 +0x93
created by github.com/antlinker/alog/manage.(*_LogManage).store
/Users/liuyong/go/pkg/mod/github.com/antlinker/alog@v1.0.0/manage/manage.go:268 +0xbf

初看panic很容易根据堆栈问题追踪到panic出错的代码是第三方的日志包引起的。追踪到源码很容易看到如下代码。

filepath.Walk(root, func(path string, info os.FileInfo, err error) error {
if info.IsDir() || !strings.HasPrefix(path, prefix) {
return nil
}
filterFile = append(filterFile, info)
return nil
})

初看起来好像是没有问题, 但是仔细一看这是调用go源码包的filepath.Walk方法。 第二个参数是闭包函数。

闭包调用时传递进来一个error此时很容易看到这个error是没有处理的。

这时我们来看看go源码里面的调用。

func Walk(root string, fn WalkFunc) error {
info, err := os.Lstat(root)
if err != nil {
err = fn(root, nil, err)
} else {
err = walk(root, info, fn)
}
if err == SkipDir {
return nil
}
return err
}

我们可以发现这一行代码

err = fn(root, nil, err)

出错的时候传递了一个nil进去。所以我们很容易知道第三方包的调用时 info os.FileInfo 这个参数传递进来会是个nil。

此时因为没有判断错误,直接就使用了这个nil接口类型调用方法,很明显是会报空指针异常的,进而导致了panic错误。

从这个例子中也很明显的警告我们如果使用第三方包的话最好使用一些稳定的,得到大多数人认可的。当然如果是团队规模

很大的话,应该是会对任何第三包引用的代码都需要review的。

其实最最主要的是通过这个例子告诉我们,任何时候都不应该随便的忽略错误进行处理,尤其是当你使用应用方法返回或传递进来的除了error以外的参数。

20220314线上panic总结的更多相关文章

  1. 线上centos6出现软死锁 kernel:BUG: soft lockup

    线上centos6出现软死锁 kernel:BUG: soft lockup 今天线上一台centos6机器用xshell一直连接不上,然后在xshell上显示 Message from syslog ...

  2. 01 . Go之Gin+Vue开发一个线上外卖应用

    项目介绍 我们将开始使用Gin框架开发一个api项目,我们起名为:云餐厅.如同饿了么,美团外卖等生活服务类应用一样,云餐厅是一个线上的外卖应用,应用的用户可以在线浏览商家,商品并下单. 该项目分为客户 ...

  3. 关于解决python线上问题的几种有效技术

    工作后好久没上博客园了,虽然不是很忙,但也没学生时代闲了.今天上博客园,发现好多的文章都是年终总结,想想是不是自己也应该总结下,不过现在还没想好,等想好了再写吧.今天写写自己在工作后用到的技术干货,争 ...

  4. 分布式存储 FastDFS-5.0.5线上搭建

    前言:       由于公司项目需要,最近开始学习一下分布式存储相关知识,确定使用FastDFS这个开源工具.学习之初,自己利用VMware虚拟机搭建了一个5台机器的集群,摸清了安装过程中可能出现的问 ...

  5. 线上bug的解决方案--带来的全新架构设计

    缘由 本人从事游戏开发很多年一直都是游戏服务器端开发. 因为个人原因吧,一直在小型公司,或者叫创业型团队工作吧.这样的环境下不得不逼迫我需要什么都会,什么做. 但是自我感觉好像什么都不精通..... ...

  6. 线上应用bug跟踪查找-友盟统计

    线上的应用只要用心点点都能发现些bug,连微信,QQ也不列外.但是bug中最严重的算是闪退了,这导致了用户直接不能使用我们的app. 我们公司是特别注重用户反馈和体验的,我们会定期打电话咨询用户的使用 ...

  7. 【原】fiddler修改线上的内容

    摘要:当我们线上的代码出bug了,咋办呢?有时候本地的代码跟线上的代码还是运行环境还是有区别的.比如有些封装的方法需要运动到手机上可以调试,而浏览器是无法调试的.如果不想每次修改完再放上到测试环境看效 ...

  8. 【重装系统】线上Linux服务器(2TB)分区参考方案

    如果是线上服务器,假设它是 2TB 的 SATA 硬盘.8GB 内存,建议按如下方式进行分区: / 20480M(20G)(主分区) /boot 128M swap 10240M /data 2016 ...

  9. 软件工程线上课程(C语言实践篇)学习心得总结

    林牧 + 原创作品转载请注明出处 + <软件工程(C编码实践篇)>MOOC课程http://mooc.study.163.com/course/USTC-1000002006 软件工程的理 ...

  10. 一次线上http接口调用不通相关的解决过程

    2016-05-25 08:58:34 昨天线上小白系统因为调用外部http接口,超时不释放,导致页面反应很慢,时间一长,报502错误. 上网查了下,502错误是因为服务对于客户的请求没有得到及时的反 ...

随机推荐

  1. Unity 音乐或者视频播放完毕之后执行方法

    视频播放完毕后,执行某个方法 方法1 官方给的解释 private VideoPlayer video2; private void Awake() { video2.loopPointReached ...

  2. wandb一个简单demo

    wandb绘制曲线:sin函数,cos函数,log函数. wandb绘制本地图片 wandb绘制matplotlib图片 wandb绘制numpy图片 import math import wandb ...

  3. szfpga Lattice高速下载器HW-USBN-2B 常见问题解答

    .产品特点 1). 支持windows7,Windows10 操作系统,两个操作系统非常稳定不断线. 2). 支持JTAG 模式,速度快,最高30Mb/s,调试serdes core,不会像hw-us ...

  4. 纯CSS实现带小三角提示框

    要实现在页面上点击指定元素时,弹出一个信息提示框.在前面的文章中,我们已经简单介绍了如何使用纯 CSS 创建一个三角形.本文在此基础上,记录如何使用 CSS 创建带三角形的提示框. 实现的原理是创建一 ...

  5. nuxt按需引入组件库(却加载所有图标问题),nuxt性能优化。

    做一个官网,nuxt按需引入了antd_vue组件库,但是项目打包时,图标却又500K+,经过排查,发现icon和其他组件环环相扣的.如下:(我引入了这个翻页的组件,里面包含了两个翻页的图标) 但是它 ...

  6. 【笔记】Java相关大杂烩②

    [笔记]Java相关大杂烩② if单分支情况下,如果没有加 {},那么默认只包含第一条语句. if 和 else 分支后面如果包含多条语句,那么需要使用 {} 括起来. 不能随意地使用数学上的表达方式 ...

  7. 力扣50(java)-Pow(x,n)(中等)

    题目: 实现 pow(x, n) ,即计算 x 的整数 n 次幂函数(即xn ). 示例 1: 输入:x = 2.00000, n = 10输出:1024.00000示例 2: 输入:x = 2.10 ...

  8. 加入自定义块对fashion_mnist数据集进行softmax分类

    在之前,我们实现了使用torch自带的层对fashion_mnist数据集进行分类.这次,我们加入一个自己实现的block,实现一个四层的多层感知机进行softmax分类,作为对"自定义块& ...

  9. Docker 安装,常用命令

    安装Docker 官方所有操作系统安装教程:Install Docker Engine on CentOS | Docker Documentation,其中CentOS安装docker引擎的代码: ...

  10. 阿里云 EMAS Serverless 重磅发布

    简介: EMAS Serverless 是阿里云提供的基于Serverless技术的一站式后端开发平台,为开发者提供高可用.弹性伸缩的云开发服务,包含云函数.云数据库.云存储.静态网站托管等功能,可用 ...