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

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

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

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

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

3165 次点击
所在节点    Go 编程语言
31 条回复
herozzm
2022-04-11 16:26:18 +08:00
@MeetTheFuture 我只是在每个子线程里面的 defer 捕获 panic ,但是出错的地方根本没有返回 panic ,感觉是直接 os
.exit 了

@kirisamemarisas 打了日志啊,根本没有信息
herozzm
2022-04-11 16:26:52 +08:00
@txx supervisor 是啥 属于 go 的范围吗?还是 linux 层面的?
herozzm
2022-04-11 16:27:17 +08:00
@joesonw 跑了没问题
herozzm
2022-04-11 16:28:15 +08:00
@xmge 貌似直接崩溃有好些可能性,比如指针错误,并发写入公共变量,还有第三方库可能是 os.exit
txx
2022-04-11 16:53:02 +08:00
@herozzm 本质上就是 stderr 啊...
CEBBCAT
2022-04-11 20:46:22 +08:00
什么神仙第三方库会 os.Exit() ?
tairan2006
2022-04-12 10:24:25 +08:00
提示一点……panic 日志是不会打在你指定的文件里的,总是输出到 stderr

所以如果你没对 stderr 进行重定向的话,应该是看不到日志的。
yeqown
2022-04-12 11:22:10 +08:00
目前看起来是猜测已经够多了只差验证了,我提供一个验证的思路:利用 BPF 技术追踪下 os.Exit 和 panic 调用,能够定位到底是因为哪一种方式导致程序退出的。
herozzm
2022-04-12 12:38:11 +08:00
@tairan2006 panic 可以捕获啊,捕获后想怎么样都可以
tairan2006
2022-04-12 13:16:46 +08:00
@herozzm 你调用第三方库,它自己开了个协程的话,你是没法捕获的…
smartshallot
2022-04-14 22:44:54 +08:00
@herozzm panic 在外面捕获不到的,一般都是在 go func 协程里崩的,得在协程里 recover 才行

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

https://tanronggui.xyz/t/846162

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

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

© 2021 V2EX