]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/go: add a debug-trace flag to generate traces
authorMichael Matloob <matloob@golang.org>
Tue, 14 Apr 2020 21:29:27 +0000 (17:29 -0400)
committerMichael Matloob <matloob@golang.org>
Wed, 12 Aug 2020 18:35:31 +0000 (18:35 +0000)
If cmd/go is provided with a -debug-trace=<file> option, cmd/go will write an
execution trace to that file.

Updates #38714

Change-Id: I3e6521343902c08266a0292f4280298a3bf8b725
Reviewed-on: https://go-review.googlesource.com/c/go/+/237683
Run-TryBot: Michael Matloob <matloob@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Jay Conrod <jayconrod@google.com>
Reviewed-by: Bryan C. Mills <bcmills@google.com>
src/cmd/go/internal/cfg/cfg.go
src/cmd/go/internal/work/build.go
src/cmd/go/main.go

index 7f8f8e92be31f12771e6b493da05aff60894fa50..f9bbcd9180a21946310c42ac5d075065b94d6f4a 100644 (file)
@@ -51,6 +51,7 @@ var (
        CmdName string // "build", "install", "list", "mod tidy", etc.
 
        DebugActiongraph string // -debug-actiongraph flag (undocumented, unstable)
+       DebugTrace       string // -debug-trace flag
 )
 
 func defaultContext() build.Context {
index 7146c9ce00e8e282f572c66196d8a3db25333003..fbd49b457b21d0f4ad9948cd0cce33a735fccf19 100644 (file)
@@ -270,6 +270,7 @@ func AddBuildFlags(cmd *base.Command, mask BuildFlagMask) {
 
        // Undocumented, unstable debugging flags.
        cmd.Flag.StringVar(&cfg.DebugActiongraph, "debug-actiongraph", "", "")
+       cmd.Flag.StringVar(&cfg.DebugTrace, "debug-trace", "", "")
 }
 
 // AddModCommonFlags adds the module-related flags common to build commands
index fdf49b7380e1076107ec91f7cea08e045e5238f5..3512866e4a0e567ed4fb5084e3508714dcfcaad0 100644 (file)
@@ -7,6 +7,7 @@
 package main
 
 import (
+       "context"
        "flag"
        "fmt"
        "log"
@@ -34,6 +35,7 @@ import (
        "cmd/go/internal/run"
        "cmd/go/internal/test"
        "cmd/go/internal/tool"
+       "cmd/go/internal/trace"
        "cmd/go/internal/version"
        "cmd/go/internal/vet"
        "cmd/go/internal/work"
@@ -187,7 +189,11 @@ BigCmdLoop:
                                cmd.Flag.Parse(args[1:])
                                args = cmd.Flag.Args()
                        }
+                       ctx := maybeStartTrace(context.Background())
+                       ctx, span := trace.StartSpan(ctx, fmt.Sprint("Running ", cmd.Name(), " command"))
+                       _ = ctx
                        cmd.Run(cmd, args)
+                       span.Done()
                        base.Exit()
                        return
                }
@@ -209,3 +215,21 @@ func mainUsage() {
        help.PrintUsage(os.Stderr, base.Go)
        os.Exit(2)
 }
+
+func maybeStartTrace(pctx context.Context) context.Context {
+       if cfg.DebugTrace == "" {
+               return pctx
+       }
+
+       ctx, close, err := trace.Start(pctx, cfg.DebugTrace)
+       if err != nil {
+               base.Fatalf("failed to start trace: %v", err)
+       }
+       base.AtExit(func() {
+               if err := close(); err != nil {
+                       base.Fatalf("failed to stop trace: %v", err)
+               }
+       })
+
+       return ctx
+}