3

我有一个 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)
}
4

1 回答 1

0

@Geo

使用 pprof 分析 cobra 命令行应用程序时遇到同样的问题

您只需将您的标志选项嵌入到单独的 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)

    }

}
于 2019-12-04T19:59:39.250 回答