20220314线上panic总结
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总结的更多相关文章
- 线上centos6出现软死锁 kernel:BUG: soft lockup
线上centos6出现软死锁 kernel:BUG: soft lockup 今天线上一台centos6机器用xshell一直连接不上,然后在xshell上显示 Message from syslog ...
- 01 . Go之Gin+Vue开发一个线上外卖应用
项目介绍 我们将开始使用Gin框架开发一个api项目,我们起名为:云餐厅.如同饿了么,美团外卖等生活服务类应用一样,云餐厅是一个线上的外卖应用,应用的用户可以在线浏览商家,商品并下单. 该项目分为客户 ...
- 关于解决python线上问题的几种有效技术
工作后好久没上博客园了,虽然不是很忙,但也没学生时代闲了.今天上博客园,发现好多的文章都是年终总结,想想是不是自己也应该总结下,不过现在还没想好,等想好了再写吧.今天写写自己在工作后用到的技术干货,争 ...
- 分布式存储 FastDFS-5.0.5线上搭建
前言: 由于公司项目需要,最近开始学习一下分布式存储相关知识,确定使用FastDFS这个开源工具.学习之初,自己利用VMware虚拟机搭建了一个5台机器的集群,摸清了安装过程中可能出现的问 ...
- 线上bug的解决方案--带来的全新架构设计
缘由 本人从事游戏开发很多年一直都是游戏服务器端开发. 因为个人原因吧,一直在小型公司,或者叫创业型团队工作吧.这样的环境下不得不逼迫我需要什么都会,什么做. 但是自我感觉好像什么都不精通..... ...
- 线上应用bug跟踪查找-友盟统计
线上的应用只要用心点点都能发现些bug,连微信,QQ也不列外.但是bug中最严重的算是闪退了,这导致了用户直接不能使用我们的app. 我们公司是特别注重用户反馈和体验的,我们会定期打电话咨询用户的使用 ...
- 【原】fiddler修改线上的内容
摘要:当我们线上的代码出bug了,咋办呢?有时候本地的代码跟线上的代码还是运行环境还是有区别的.比如有些封装的方法需要运动到手机上可以调试,而浏览器是无法调试的.如果不想每次修改完再放上到测试环境看效 ...
- 【重装系统】线上Linux服务器(2TB)分区参考方案
如果是线上服务器,假设它是 2TB 的 SATA 硬盘.8GB 内存,建议按如下方式进行分区: / 20480M(20G)(主分区) /boot 128M swap 10240M /data 2016 ...
- 软件工程线上课程(C语言实践篇)学习心得总结
林牧 + 原创作品转载请注明出处 + <软件工程(C编码实践篇)>MOOC课程http://mooc.study.163.com/course/USTC-1000002006 软件工程的理 ...
- 一次线上http接口调用不通相关的解决过程
2016-05-25 08:58:34 昨天线上小白系统因为调用外部http接口,超时不释放,导致页面反应很慢,时间一长,报502错误. 上网查了下,502错误是因为服务对于客户的请求没有得到及时的反 ...
随机推荐
- go切片和指针切片
转载请注明出处: 在Go语言中,切片(Slice)和指针的切片(即切片中每个元素都是指向某种数据类型的指针)是两个不同的概念,它们各自具有特定的用途和优势. 切片(Slice) 切片是对数组的一个连续 ...
- 重学c#系列——什么是性能[外篇性能篇一]
前言 简单写一下性能的简介. 正文 什么是性能,很多时候有一个问题,那就很多人喜欢说.这个服务有很多访问,我们需要这样设计. 这是一个无法验证的指标,访问次数是多少? 响应时间是多少. 我把这归纳为自 ...
- 利用PyTorch训练模型识别数字+英文图片验证码
利用PyTorch训练模型识别数字+英文图片验证码 摘要:使用深度学习框架PyTorch来训练模型去识别4-6位数字+字母混合图片验证码(我们可以使用第三方库captcha生成这种图片验证码或者自己收 ...
- 力扣28(java)-实现 strStr()(简单)
题目: 实现 strStr() 函数. 给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串出现的第一个位置(下标从 0 开始).如果不存 ...
- 开源小白到核心开发——我与 sealer 的成长故事
简介: 下面将以作者本人与 sealer 的一段成长故事来带领大家体验从小白到核心功能开发者的开源之旅,同时本文也作为一篇引领开源小白入门的文章供大家参考. 作者:周欣元 个人简介 大家好,我是周 ...
- 【USENIX ATC】支持异构GPU集群的超大规模模型的高效的分布式训练框架Whale
简介: 高效大模型训练框架Whale(EPL)入选USENIX ATC 作者:张杰.贾贤艳 近日,阿里云机器学习PAI关于深度学习模型高效的分布式训练框架的论文< Whale: Efficien ...
- 喜马拉雅 Apache RocketMQ 消息治理实践
简介:本文通过喜马拉雅的RocketMQ治理实践分享,让大家了解使用消息中间件过程中可能遇到的问题,避免实战中踩坑. 作者:曹融,来自喜马拉雅,从事微服务和消息相关中间件开发. 本文通过喜马拉雅 ...
- iLogtail 与Filebeat 性能对比
简介:前段时间, iLogtail 阿里千万实例可观测采集器开源,其中介绍了iLogtail采集性能可以达到单核100MB/s,相比开源采集Agent有5-10倍性能优势.很多小伙伴好奇iLogta ...
- Flink 和 Pulsar 的批流融合
简介: 如何通过 Apache Pulsar 原生的存储计算分离的架构提供批流融合的基础,以及 Apache Pulsar 如何与 Flink 结合,实现批流一体的计算. 简介:StreamNativ ...
- [FAQ] 没有docker用户组,怎么让普通用户有权限操作docker
如果没有docker用户组,可以通过以下步骤让普通用户有权限操作docker: 创建一个名为docker的用户组: sudo groupadd docker 将当前用户添加到docker用户组中: ...