如何使用Delve检查核心转储的内存区域?

4
给定Go服务的核心转储,是否有Delve的命令可以检查内存区域?我们试图找出占用堆的内容。

为什么不进行内存分析?Go语言中已经内置了该功能。 - Pizza lord
1
很遗憾,我们在生产环境中没有暴露pprof端点,因此我们只能依赖核心转储进行事后分析。 - Dian Bakti
1个回答

1

上次我遇到类似的问题时,我发现了这个小包https://github.com/golang/debug。它允许获得堆的直方图并检查在崩溃之前有多少特定类型的对象。

不幸的是,它不能直接使用,您需要应用几个修复程序,可以在Pull Requests页面中找到。


非常酷的工具!但是你知道为什么在运行“直方图”时会得到一堆“unk”对象吗?例如:“unk1152”,“unk704”,“unk288”等。请告知是否有某种方法来解释这些对象。更新:似乎这些是指“未知”,想知道是否有任何方法可以增加这些对象的“可读性”。 - Dian Bakti
是的,“unk1152”表示未知类型,而1152表示实例的大小。不幸的是,我不知道如何在这种特殊情况下改进“类型检测”。 - Aleksandr Karasev
1
我想出了一些解决方法,我使用objects命令列出所有活动对象,获取一个“unk”类型的地址,然后执行reachable <address>。它能够打印出一些文件位置。可能需要在不同的地址上运行几次以确认发现,这很耗时,但它有效。 - Dian Bakti
很好,下次会记住的。谢谢分享! - Aleksandr Karasev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接