登录
首页 >  Golang >  Go问答

没有堆栈跟踪的 Go 程序崩溃的含义是什么?

来源:stackoverflow

时间:2024-02-15 16:51:21 261浏览 收藏

本篇文章向大家介绍《没有堆栈跟踪的 Go 程序崩溃的含义是什么?》,主要包括,具有一定的参考价值,需要的朋友可以参考一下。

问题内容

我正在 kubernetes pod 中运行 go 程序,应用程序中有 cgo 用法。 pod 崩溃,有时有回溯,有时没有。

当有回溯时,它指向gc任务:

error: bad use of bucket.mp
error: non in-use span in unswept list
morestack on g0
error: non in-use span in unswept list
error: span set block with unpopped elements found in reset

设置 godebug=cgocheck=2 (对从 go->c 传递的指针进行缓慢、严格的有效性检查)不会导致捕获无效的指针传递。设置 godebug=invalidptr=0 以防止垃圾收集器因无效指针而发生恐慌,从而导致应用程序在没有堆栈跟踪的情况下完全崩溃。

看来我有两个问题——第一个是无效的指针(来自某处)最终出现在 go 的 gc 检查中。当使用 godebug=invalidptr=0 研究其他问题时,可以缓解这一问题。当 go 程序崩溃且没有堆栈跟踪时,这意味着什么? go 代码可能会导致此问题,或者这是否表明 c 代码中存在问题?

编辑(附加数据):

这些崩溃仅发生在临时 pod 中(使用 musl 编译器),并且在几分钟内发生。如果我使用默认 cc 编译二进制文件并在 pod 中的 debian 容器中运行,则程序能够运行而不会崩溃(已经持续了 3 个小时)。


正确答案


我加入了 gopher slack 并发布了这个堆栈溢出链接。有人指出 musl 作为 go 工具链中的 c 编译器并不是 100% 兼容。使用默认的 C 编译器构建静态链接的二进制文件解决了所有崩溃问题。

好了,本文到此结束,带大家了解了《没有堆栈跟踪的 Go 程序崩溃的含义是什么?》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>