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错误是因为服务对于客户的请求没有得到及时的反 ...
随机推荐
- 阿里开源的32B大模型到底强在哪里?
阿里巴巴最近开源了一个320亿参数的大语言模型Qwen1.5-32B,网上都说很强很强,那么它到底强在哪里呢? 更高的性价比 Qwen1.5-32B中的B是billion的意思,也就是10亿,32B就 ...
- SpringBoot集成日志
1.日志工厂 如果一个数据库,出现了异常,我们需要排错,日志就是最好的助手! 曾经:sout.debug 现在:日志工厂 在Mybatis中具体使用那一个日志实现,在设置设定 STDOUT_LOGGI ...
- 4天带你上手HarmonyOS ArkUI开发——《HarmonyOS ArkUI入门训练营之健康生活实战》
<HarmonyOS ArkUI入门训练营之健康饮食应用>是面向入门开发者打造的实战课程系列.特邀华为终端BG高级开发工程师作为本次训练营讲师,以健康饮食为例,开展技术教学及实战案例分享 ...
- BI 和报表有什么区别
BI 从早期提出的概念上来划分可以分为数据仓库.ETL.olap 和报表这几部分可以看到报表只是 BI 中的一个组成部分,只不过数据在 web 端展示时通常是通过报表形式,所以经常会把报表当做是 BI ...
- 如何快速实现Prometheus监控Kubernetes集群
Prometheus K8S集群中常见的监控工具有哪些: Kubernetes Dashboard Kube-monkey K8s-testsuite Kubespray Minikube Prome ...
- 【Oracle】列拆行/对多行数据的单行数据进行分割并多行显示
[Oracle]列拆行/对多行数据的单行数据进行分割并多行显示 参考链接:Oracle 一行字符串拆分为多行_oracle一行拆分成多行-CSDN博客 背景:要对一个表的字段的内容进行分割,分隔符都是 ...
- Koordinator v0.7: 为任务调度领域注入新活力
简介: 在这个版本中着重建设了机器学习.大数据场景需要的任务调度能力,例如 Coscheduling.ElasticQuota 和精细化的 GPU 共享调度能力.并在调度问题诊断分析方面得到了增强,重 ...
- 重磅官宣:Nacos2.0发布,性能提升10倍
简介: Nacos2.0 作为一个跨代版本,彻底解决了 Nacos1.X 的性能问题,将性能提升了 10 倍. 作者:席翁 继 Nacos 1.0 发布以来,Nacos 迅速被成千上万家企业采用,并 ...
- [GPT] 对于一个复杂的html文档而言,如何用 js 批量替换页面上的某些文字从A替换为B,前提是不能去掉标签和已绑定的事件
原生:示例代码 function replaceTextInDocument(node) { if (node.nodeType === Node.TEXT_NODE) { node.textCo ...
- [FAQ] Laravel 验证未通过 Route [login] not defined 处理
一种方式是在路由中定义一个name为 login 的请求. Route::get('xxx', [XxxController::class, 'x'])->name('login'); 第二种方 ...