go 程序无故退出, panic 也捕获不到,求解决方案

2022-04-11 00:11:38 +08:00
 herozzm

程序里面用了若干 go 子线程(盲猜问题在子线程但是无法定位),有些错误会直接 os.exit ,每个函数方法都写了 panic 捕获写日志,程序退出时不会返回 panic 。

大神们有什么好的办法定位错误处吗?

生产环境问题出了几个月还是找不到问题,有时运行半天,有时运行几天,退出的时候 cpu 和内存都没有大量占用

3127 次点击
所在节点    Go 编程语言
31 条回复
nuk
2022-04-11 00:25:38 +08:00
b os.exit
ETiV
2022-04-11 00:40:38 +08:00
试试 sentry ?
foam
2022-04-11 00:41:15 +08:00
找找有没有不安全指针
kwanzaa
2022-04-11 00:44:20 +08:00
attach processes 或者直接远程上去 debug ?
txx
2022-04-11 01:13:05 +08:00
我最近也遇到了类似的 Bug ,服务器崩溃了,但是 Sentry 无法收集到崩溃,但是退出还是有日志的。

我遇到的情况是这样的:一个第三方库出了些问题,在 map 里面野指针了。而 Map 在 Go Runtime 里面的实现是 ASM 实现的,然后 Link 到 Runtime 里面。如果 ASM 内部发生了野指针相关的问题,直接会被系统走了 unix signal 退出,导致无法被 recover handle 。
CEBBCAT
2022-04-11 01:36:11 +08:00
我看日志说 os.Exit() 会把程序立即退出,这个真的是你需要的函数吗?
kinghui
2022-04-11 07:14:07 +08:00
设置环境变量 GOTRACEBACK=crash 运行 Go 程序,core dump 后用 GDB 查,参见: https://pkg.go.dev/runtime
herozzm
2022-04-11 07:26:08 +08:00
@CEBBCAT 不是自己主动写的 os.exit 而是一些莫名的错误导致的
herozzm
2022-04-11 07:27:16 +08:00
@foam 就是找起来很麻烦 代码行一多逻辑一复杂简直不可能
herozzm
2022-04-11 07:28:38 +08:00
@txx 你是如何找到错误地方的?
dbskcnc
2022-04-11 09:21:49 +08:00
1.lint 错误全部要修改过来
2.race 运行检测
3.付费请人
CEBBCAT
2022-04-11 09:25:32 +08:00
@herozzm 错误只会产生 err ,Exit 自己主动调用才会被执行
xmge
2022-04-11 10:00:23 +08:00
map 并发读写导致的程序崩溃。这种崩溃通过 panic 无法捕捉,检查下全局 map 是否有并发读写的情况吧。
luwill
2022-04-11 10:56:39 +08:00
看看日志库,有没有接管退出方法,导致退出前没有 flush 日志。

如果短时间可以浮现,服务器上 nohup strace 启动服务看退出前的行为。
joesonw
2022-04-11 11:09:55 +08:00
先跑一遍 golangci-lint 吧。
lasuar
2022-04-11 11:32:09 +08:00
@xmge 这个会有堆栈信息的
xsen
2022-04-11 12:39:50 +08:00
1. strace
可以有这个 api 的调用关系

2. gdb
有堆栈
txx
2022-04-11 15:09:26 +08:00
@herozzm log 文件呀,我 go 的 binary 的启动是套了一层 supervisor 的,在 supervisor 对应的 err 里面是有崩溃 stack trace 的
MeetTheFuture
2022-04-11 15:52:10 +08:00
在 Goroutines 里面写 defer func(){}
kirisamemarisas
2022-04-11 16:17:33 +08:00
像楼上说的,多打日志。我之前也是有这种类似的情况,多打日志就好了,极限一点每个模块都用不同的日志文件记录,方便定位

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/846162

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX