在 Go 中如何转储一个方法的 GOSSAFUNC 图
创始人
2024-03-02 05:11:51
0

Go 编译器的 SSA 后端包含一种工具,可以生成编译阶段的 HTML 调试输出。这篇文章介绍了如何为函数方法打印 SSA 输出。

让我们从一个包含函数、值方法和指针方法的示例程序开始:

package main

import (
    "fmt"
)

type Numbers struct {
    vals []int
}

func (n *Numbers) Add(v int) {
    n.vals = append(n.vals, v)
}

func (n Numbers) Average() float64 {
    sum := 0.0
    for _, num := range n.vals {
        sum += float64(num)
    }
    return sum / float64(len(n.vals))
}


func main() {
    var numbers Numbers
    numbers.Add(200)
    numbers.Add(43)
    numbers.Add(-6)
    fmt.Println(numbers.Average())
}

通过 GOSSAFUNC 环境变量控制 SSA 调试输出。此变量含有要转储的函数的名称。这不是函数的完全限定名。对于上面的 func main,函数名称为 main 而不是 main.main

% env GOSSAFUNC=main go build
runtime
dumped SSA to ../../go/src/runtime/ssa.html
t
dumped SSA to ./ssa.html

在这个例子中,GOSSAFUNC=main 同时匹配了 main.main 和一个名为 runtime.main 的函数。 [1] 这有点不走运,但是实际上可能没什么大不了的,因为如果你要对代码进行性能调整,它就不会出现在 func main 中的巨大的意大利面块中。

你的代码更有可能在方法中,你可能已经看到这篇文章,并寻找能够转储方法的 SSA 输出。

要为指针方法 func (n *Numbers) Add 打印 SSA 调试,等效函数名为 (*Numbers).Add: [2]

% env "GOSSAFUNC=(*Numbers).Add" go build
t
dumped SSA to ./ssa.html

要为值方法 func (n Numbers) Average 打印 SSA 调试,等效函数名为 (*Numbers).Average即使这是一个值方法

% env "GOSSAFUNC=(*Numbers).Average" go build
t
dumped SSA to ./ssa.html

  1. 如果你没有从源码构建 Go,那么 runtime 软件包的路径可能是只读的,并且可能会收到错误消息。请不要使用 sudo 来解决此问题。 ↩︎
  2. 请注意 shell 引用 ↩︎

via: https://dave.cheney.net/2020/06/19/how-to-dump-the-gossafunc-graph-for-a-method

作者:Dave Cheney 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Go

相关内容

从康波周期,看AI进入大规...
01 我在最近一个月研究中,越来越确定一件事。 AI,已经不是实验...
2026-01-21 06:17:51
优刻得开源外卖比价智能体O...
1月20日,优刻得发布并开源外卖比价智能体OrderWise Ag...
2026-01-20 16:18:17
Google正式发布AI代...
AIPress.com.cn报道 1月12日消息,Google宣布...
2026-01-12 10:17:08
突发!OpenAI收购AI...
AIPress.com.cn报道 1月9日消息,据TechCrun...
2026-01-09 10:18:22
Linux基金会推出自主式...
Linux基金会宣布成立自主式AI基金会(AAIF),旨在为智能体...
2025-12-31 20:16:57
AI眼中的中国|把2025...
Gogogo出发咯~2025年度回忆杀BGM已加载!这一年,哪个瞬...
2025-12-29 15:18:36

热门资讯

如何在 Github 上创建一... 学习如何复刻一个仓库,进行更改,并要求维护人员审查并合并它。你知道如何使用 git 了,你有一个 G...
《Apex 英雄》正式可在 S... 《Apex 英雄》现已通过 Steam Deck 验证,这使其成为支持 Linux 的顶级多人游戏之...
Helix:高级 Linux ... 说到 基于终端的文本编辑器,通常 Vim、Emacs 和 Nano 受到了关注。这并不意味着没有其他...
JStock:Linux 上不... 如果你在股票市场做投资,那么你可能非常清楚投资组合管理计划有多重要。管理投资组合的目标是依据你能承受...
Textual:为 Pytho... 快速入门使用 TextualPython 在 Linux 上有像 TkInter 这样的优秀 GUI...
硬核观察 #1245 Open... #1 OpenAI 悄然删除禁止将 ChatGPT 用于 “军事和战争” 的禁令在 1 月 10 日...
使用时间序列数据,用开源工具助... InfluxData 是一个开源的时间序列数据库平台。下面介绍了它是如何被用于边缘应用案例的。收集到...
使用 KRAWL 扫描 Kub... 用 KRAWL 脚本来识别 Kubernetes Pod 和容器中的错误。当你使用 Kubernet...
硬核观察 #1249 LG 洗... #1 LG 洗衣机每天上传近 4GB 的数据?一个名为 Johnie 的 LG 洗衣机用户发现,他的...
2024 年 Linux 和开... 让我们尝试预测未来吧!新的一年快乐,朋友们 ✨2024 年的钟声已经敲过,我们有必要去预见一下将塑造...