分析程序时索引超出范围错误

时间:2015-11-12 23:30:38

标签: go

This博客文章提供了有关如何使用runtime/pprof软件包分析golang程序的说明。

除了上面提到的包导入之外,还说(步骤1)将此代码添加到主函数

var cpuprofile = flag.String("cpuprofile", "", "write cpu profile to file")

func main() {
    flag.Parse()
    if *cpuprofile != "" {
        f, err := os.Create(*cpuprofile)
        if err != nil {
            log.Fatal(err)
        }
        pprof.StartCPUProfile(f)
        defer pprof.StopCPUProfile()
    }

然后(STEP2)运行二进制文件(在本例中名为./havlak1),将文件名(扩展名为.prof)传递给cpuprofile标志

 ./havlak1 -cpuprofile=havlak1.prof

然后,程序停止后,(步骤3)将二进制文件和.prof文件传递给go tool pprof程序

$ go tool pprof havlak1 havlak1.prof
Welcome to pprof!  For help, type 'help'.
(pprof)

此时,博客作者运行了 top10命令获取一些输出。

我已经使用我的程序完成了每个步骤(但使用了不同的二进制文件和.prof文件名)。但是,当我运行top10命令时,我的程序会因索引超出范围而发生混乱。如果我做

cat myfile.prof

检查.prof文件的内容,没有输出。

问题:博客帖子中是否缺少一个步骤,或者我可能做错了什么或不做.prof文件为空?

更新

只是为了澄清,在用这个

之类的cpu标志启动二进制文件之后

./ havlak1 -cpuprofile = havlak1.prof

我多次访问我的应用程序的路径,以便有机会收集数据。我停止程序后,我cat filename.prof并且它是空的

运行此命令后

go tool pprof havlak1 havlak1.prof

我显然不能再点击我的应用程序,因为二进制文件没有运行。 (我假设二进制文件传递给go tool pprof havlak1的原因是除了再次运行程序/保持运行之外的其他原因)

更新

我是否必须包含代码才能手动关闭它写入的文件?我可以使用包装器程序github.com/davecheney/profile来分析我的应用程序,该程序包含一个关闭已打开文件的行。

1 个答案:

答案 0 :(得分:1)

听起来好像文件没有被写入,看起来你正在使用延迟来暂停配置文件。如果应用程序在延迟之前退出,则无法写入配置文件。

您可以尝试在不使用延迟语句的情况下在结尾处停止分析。

您可以通过编写一个简单的测试并运行go test --cpuprofile=cpu.prof来确保问题是您的代码而不是您的机器(所有go测试都可以使用该标志自动进行分析),然后通过{{1}查看结果}