我可以在pprof下运行某些东西并将其传递给命令行参数吗?

时间:2018-09-12 20:07:55

标签: go pprof

我有一个go二进制文件,它将cobra用于子命令。每个子命令都有自己的标志。我希望能够为带有特定参数集的命令创建CPU配置文件,例如:

myBinary dryRun -c configs/config.json

但是,如果我尝试运行它,就像这样:

go tool pprof -pdf myBinary -- dryRun -c configs/config.json

我收到以下错误:

-: open --: no such file or directory
dryRun: open dryRun: no such file or directory
-c: open -c: no such file or directory
configs/config.json: parsing profile: unrecognized profile format

如果我尝试引用整个命令,那么它也无法正常工作。有没有办法让go tool pprof传递其他命令行参数?

编辑:这就是我要分析的方式:

func main() {
    defer profile.Start().Stop()

    fmt.Println("running version", version, "built on", date)
    fmt.Println()
    cmd.Execute()

    time.Sleep(2 * time.Second)
}

1 个答案:

答案 0 :(得分:0)

@Geo

在使用pprof配置眼镜蛇命令行应用程序时遇到相同的问题

您只需要将标志选择嵌入一个单独的main.go中,然后直接调用该包即可

就我而言,我设法通过

解决了这个问题
  • 在顶层创建另一个文件夹,我将其添加到.gitignore
  • 使用func main()创建包main

您需要为每个要尝试的组合编辑主功能,但最终得到的二进制文件可以不带任何标志而pprof

我正在配置的眼镜蛇命令

https://github.com/mutl3y/PRTG_VMware/blob/dev1/cmd/summary.go

我的分析示例

/profiling/main.go

package main

import (
    "github.com/mutl3y/PRTG_VMware/VMware"
    "github.com/pkg/profile"
    "log"
    "net/url"
    "time"
)

func main() {
    defer profile.Start().Stop()
    u, err := url.Parse("https://192.168.59.4/sdk")
    if err != nil {
        log.Fatalf("failed to parse url")
    }
    c, err := VMware.NewClient(u, "prtg@heynes.local", ".l3tm31n", 2*time.Second)
    if err != nil {
        log.Fatalf("failed %v", err)
    }

    err = c.VmSummary("", "vm-13", &VMware.LimitsStruct{}, time.Second, true,[]string{})
    if err != nil {
        log.Fatalf("vmSummaryfailed %v", err)

    }

}