我有一个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)
}
答案 0 :(得分:0)
@Geo
在使用pprof配置眼镜蛇命令行应用程序时遇到相同的问题
您只需要将标志选择嵌入一个单独的main.go中,然后直接调用该包即可
就我而言,我设法通过
解决了这个问题您需要为每个要尝试的组合编辑主功能,但最终得到的二进制文件可以不带任何标志而pprof
https://github.com/mutl3y/PRTG_VMware/blob/dev1/cmd/summary.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)
}
}