diff --git a/cmd/restic/global_debug.go b/cmd/restic/global_debug.go index cb7dac10a..bc6a51993 100644 --- a/cmd/restic/global_debug.go +++ b/cmd/restic/global_debug.go @@ -15,19 +15,21 @@ import ( ) var ( - listenMemoryProfile string - memProfilePath string - cpuProfilePath string - traceProfilePath string - insecure bool + listenProfile string + memProfilePath string + cpuProfilePath string + traceProfilePath string + blockProfilePath string + insecure bool ) func init() { f := cmdRoot.PersistentFlags() - f.StringVar(&listenMemoryProfile, "listen-profile", "", "listen on this `address:port` for memory profiling") + f.StringVar(&listenProfile, "listen-profile", "", "listen on this `address:port` for memory profiling") f.StringVar(&memProfilePath, "mem-profile", "", "write memory profile to `dir`") f.StringVar(&cpuProfilePath, "cpu-profile", "", "write cpu profile to `dir`") f.StringVar(&traceProfilePath, "trace-profile", "", "write trace to `dir`") + f.StringVar(&blockProfilePath, "block-profile", "", "write block profile to `dir`") f.BoolVar(&insecure, "insecure-kdf", false, "use insecure KDF settings") } @@ -38,12 +40,12 @@ func (fakeTestingTB) Logf(msg string, args ...interface{}) { } func runDebug() error { - if listenMemoryProfile != "" { - fmt.Fprintf(os.Stderr, "running memory profile HTTP server on %v\n", listenMemoryProfile) + if listenProfile != "" { + fmt.Fprintf(os.Stderr, "running profile HTTP server on %v\n", listenProfile) go func() { - err := http.ListenAndServe(listenMemoryProfile, nil) + err := http.ListenAndServe(listenProfile, nil) if err != nil { - fmt.Fprintf(os.Stderr, "memory profile listen failed: %v\n", err) + fmt.Fprintf(os.Stderr, "profile HTTP server listen failed: %v\n", err) } }() } @@ -58,9 +60,12 @@ func runDebug() error { if traceProfilePath != "" { profilesEnabled++ } + if blockProfilePath != "" { + profilesEnabled++ + } if profilesEnabled > 1 { - return errors.Fatal("only one profile (memory or CPU) may be activated at the same time") + return errors.Fatal("only one profile (memory, CPU, trace, or block) may be activated at the same time") } var prof interface { @@ -73,6 +78,8 @@ func runDebug() error { prof = profile.Start(profile.Quiet, profile.NoShutdownHook, profile.CPUProfile, profile.ProfilePath(cpuProfilePath)) } else if traceProfilePath != "" { prof = profile.Start(profile.Quiet, profile.NoShutdownHook, profile.TraceProfile, profile.ProfilePath(traceProfilePath)) + } else if blockProfilePath != "" { + prof = profile.Start(profile.Quiet, profile.NoShutdownHook, profile.BlockProfile, profile.ProfilePath(blockProfilePath)) } if prof != nil {