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. HarmonyOS线性容器特性及使用场景

      线性容器实现能按顺序访问的数据结构,其底层主要通过数组实现,包括ArrayList.Vector.List.LinkedList.Deque.Queue.Stack七种. 线性容器,充分考虑了数据 ...

  2. 【直播回顾】Hello HarmonyOS进阶课程第五课——原子化服务

    由HDE李洋老师主讲的Hello HarmonyOS进阶系列应用篇第五课<原子化服务>, 已于6月1日晚上 19 点在HarmonyOS社群内成功举行.本节课李洋老师带领大家了解Harmo ...

  3. Android 开发入门(1)

    0x01 准备 (1)概述 安卓(Android)基于 Linux 内核开发的操作系统,由 Google 等领导开发. (2)版本 Android 版本号 API 发布时间 Android 14 - ...

  4. sql 语句系列(月份的第一个星期的星期一和最后一个星期的星期一)[八百章之第二十一章]

    mysql select y.first_monday,CASE MONTH(ADDDATE(y.first_monday,28)) when mth then ADDDATE(y.first_mon ...

  5. 重新点亮linux 命令树————grub配置文件[二十]

    前言 简单介绍一下grub 配置文件. 正文 grub 是什么呢? 引导配置. grub 配置文件: /etc/default/grub 默认grub配置文件 /etc/grub.d/ /boot/g ...

  6. 不常用的技能-【手动编译java类】

    jdk版本:1.7 冒号分割jar包,1.8 分号分割jar包 javac -classpath fastjson-1.2.24.jar:jedis-2.9.0.jar Test.javajava - ...

  7. EPLAN电气绘图笔记

    EPLAN的背景由来发展意义 使用软件的一些思维上规则的东西. 引入一些新的概念性名词术语及区分介绍. 如何完成项目式交付初级标准电气图纸. 如何高效简化. eplan安装后数据库问题. 6.安装后无 ...

  8. 力扣511(MySQL)-游戏玩法分析Ⅰ(简单)

    题目: 活动表 Activity: 写一条 SQL 查询语句获取每位玩家 第一次登陆平台的日期. 查询结果的格式如下所示:  解题思路: 方法一:使用dense_rank() over(partiti ...

  9. 力扣8(java)-字符串转整数(atoi)(中等)

    题目: 请你来实现一个 myAtoi(string s) 函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C++ 中的 atoi 函数). 函数 myAtoi(string s) 的算法 ...

  10. Dubbo-Admin 正式支持 3.0 服务治理

    ​简介:Dubbo 相信大家并不陌生,是一款微服务开发框架,它提供了 RPC 通信与微服务治理两大关键能力.大家在日常开发中更多使用的是 Dubbo 提供的 RPC 通信这一部分能力,而对其提供的服务 ...