3

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

 2 years ago
source link: https://www.v2ex.com/t/846162
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

V2EX  ›  Go 编程语言

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

  herozzm · 12 小时 30 分钟前 via Android · 1027 次点击

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

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

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

17 条回复    2022-04-11 12:39:50 +08:00

nuk

nuk      12 小时 16 分钟前

b os.exit

ETiV

ETiV      12 小时 1 分钟前 via iPhone

试试 sentry ?

foam

foam      12 小时 0 分钟前 via Android

找找有没有不安全指针

kwanzaa

kwanzaa      11 小时 57 分钟前

attach processes 或者直接远程上去 debug ?

txx

txx      11 小时 28 分钟前   ❤️ 2

我最近也遇到了类似的 Bug ,服务器崩溃了,但是 Sentry 无法收集到崩溃,但是退出还是有日志的。

我遇到的情况是这样的:一个第三方库出了些问题,在 map 里面野指针了。而 Map 在 Go Runtime 里面的实现是 ASM 实现的,然后 Link 到 Runtime 里面。如果 ASM 内部发生了野指针相关的问题,直接会被系统走了 unix signal 退出,导致无法被 recover handle 。

CEBBCAT

CEBBCAT      11 小时 5 分钟前

我看日志说 os.Exit() 会把程序立即退出,这个真的是你需要的函数吗?

kinghui

kinghui      5 小时 27 分钟前

设置环境变量 GOTRACEBACK=crash 运行 Go 程序,core dump 后用 GDB 查,参见: https://pkg.go.dev/runtime

herozzm

herozzm      5 小时 15 分钟前 via Android

@CEBBCAT 不是自己主动写的 os.exit 而是一些莫名的错误导致的

herozzm

herozzm      5 小时 14 分钟前 via Android

@foam 就是找起来很麻烦 代码行一多逻辑一复杂简直不可能

herozzm

herozzm      5 小时 13 分钟前 via Android

@txx 你是如何找到错误地方的?

dbskcnc

dbskcnc      3 小时 20 分钟前

1.lint 错误全部要修改过来
2.race 运行检测
3.付费请人

CEBBCAT

CEBBCAT      3 小时 16 分钟前 via iPhone

@herozzm 错误只会产生 err ,Exit 自己主动调用才会被执行

xmge

xmge      2 小时 41 分钟前

map 并发读写导致的程序崩溃。这种崩溃通过 panic 无法捕捉,检查下全局 map 是否有并发读写的情况吧。

luwill

luwill      1 小时 45 分钟前

看看日志库,有没有接管退出方法,导致退出前没有 flush 日志。

如果短时间可以浮现,服务器上 nohup strace 启动服务看退出前的行为。

joesonw

joesonw      1 小时 31 分钟前 via iPhone

先跑一遍 golangci-lint 吧。

lasuar

lasuar      1 小时 9 分钟前

@xmge 这个会有堆栈信息的

xsen

xsen      2 分钟前

1. strace
可以有这个 api 的调用关系

2. gdb
有堆栈

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK