Golang Go语言中求助:使用 Go 莫名 Panic 的问题

发布于 1周前 作者 caililin 来自 Go语言

Golang Go语言中求助:使用 Go 莫名 Panic 的问题
开发机上一直在写代码调试这样没有任何问题,直到昨天出现这样的 panic:
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0xb0 pc=0x458e1e6]
堆栈看了应该是没问题的

然后就一直这样,换台机器 clone 相同的代码没有问题。

环境: go version go1.13.4 darwin/amd64
使用 gin,gorm, docker mysql


更多关于Golang Go语言中求助:使用 Go 莫名 Panic 的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

24 回复

这样信息不够吧,这报错信息太大众脸了

更多关于Golang Go语言中求助:使用 Go 莫名 Panic 的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


没有更详细的信息吗,比如你的代码是在哪一行 panic 的



我确定不是代码问题,所以没贴
事实上注释掉那一段还是会 panic

这不是说的很清楚嘛?空指针 至于为啥空指针,根据上面的信息,你觉得能知道嘛?



我确定是环境问题,和系统内存不足现象差不多。
是分配不到足够内存所以空指针类似

但我的开发机内存应该是够的

感觉是代码有 bug,换台机器没有问题可能只是没有跑到使用这个 nil 变量的逻辑

盲猜是声明了某个 pointer 类型的变量但没有初始化

我只是想问下有没有碰到类似状况的老哥,如果代码问题我就不贴了

很多都是初始化问题。没注意或者没调用吧

这种情况多数是自身写的 BUG 所致,看看是否用到了 goroutine, 如果用到了,那么人肉编译,就不一定看得出来问题。如果是必然现象就断点,如果必然现象,就再好好理一理代码吧。特别是一些 初始化的问题。多看看

大概率代码问题,如果是机器问题会有其他报错

我查到了,是运行目录的问题,所以找不到配置目录初始化。
但为啥会出现运行目录不对的问题,我还得再查一下

多谢各位老哥

遇到过。就是代码有 bug 。

在错误之前把变量打印出来看看
如果不是代码问题记得到时 @我下

有没有把指针转为 uintptr,过一阵又转回去取内容的

感觉是 cast 了 nil 值变量导致的

已经解决问题,是代码问题,但不是代码直接导致的。

具体原因是这样,昨天我写了个读配置文件的函数,这个函数查找 conf 目录下所有子目录,然后再查找所有子目录下的所有配置文件。

代码因为用了回调,在没找到配置文件时提前返回了。


然后没问题是因为没提前返回,但昨天打开过这个目录,多了个.DS_Store,就出问题了
.DS_Store 又被 gitignore 了
另外一台电脑没有.DS_Store,所以没问题

结贴,谢谢大家












因为现在是独立开发,遇到问题容易陷死胡同,不过一般不太会有问题,真的很感谢大家。

debug.Stack() 可以加一下 有助于 debug

最烦这种自以为“确定不是代码问题”的

建议楼主看一下这篇文章的前半部分: http://accu.cc/content/gameboy/other/test/

是的,我也很确定一定是我的问题,只是一时没找到头绪,谢谢!

只是当时我确定不是堆栈那段代码的问题,所以没贴。
事后呢,我检讨自己之前下结论过于草率,以为只是环境的问题。
作为一个多年的老 RD,我明白这次问题在于太急于写业务,没有能够静下心来想一想。
甚至我忽略了一开始的直觉,没办法,除了开发还要操心一堆事情

所以是 mac 祸嗐了你?

在Go语言中遇到莫名的panic通常是由运行时错误引起的,这些错误可能是内存访问违规、数组越界、空指针引用等。为了定位和解决panic问题,你可以按照以下步骤进行排查:

  1. 查看panic信息

    • 当程序panic时,Go会打印出错误信息和堆栈跟踪。仔细阅读这些信息,通常可以初步判断panic的原因。
  2. 使用defer和recover

    • 在可能panic的代码块中使用deferrecover来捕获panic,并记录错误信息和堆栈,这样可以避免程序崩溃,并获取更详细的错误信息。
  3. 检查指针和接口

    • 确保你没有将nil值赋给非指针类型的变量,或者错误地将nil接口值当作具体类型使用。
  4. 数组和切片操作

    • 仔细检查所有数组和切片的索引操作,确保没有越界访问。
  5. 并发编程

    • 如果你在使用goroutines和channels进行并发编程,确保没有数据竞争和死锁问题。使用Go的race detector工具可以帮助检测这些问题。
  6. 单元测试

    • 编写单元测试来覆盖你的代码,特别是那些可能panic的代码路径。这有助于在开发阶段早期发现问题。
  7. 代码审查

    • 如果问题依然无法解决,可以邀请同事进行代码审查,有时候新鲜的视角能帮助发现问题所在。

按照这些步骤逐一排查,通常可以定位并解决Go程序中的panic问题。

回到顶部