summaryrefslogtreecommitdiffhomepage
path: root/pkg/sentry/control/pprof.go
diff options
context:
space:
mode:
authorAdin Scannell <ascannell@google.com>2019-12-06 16:58:28 -0800
committergVisor bot <gvisor-bot@google.com>2019-12-06 17:00:07 -0800
commit371e210b83c244d8828ad2fa1b3d7cef15fbf463 (patch)
tree6617af43e8182a9784ac5525ac3e9fe5d8543aa0 /pkg/sentry/control/pprof.go
parent3e84777d2e2a2b56c00487cd77aa8d2fc25bbb16 (diff)
Add runtime tracing.
This adds meaningful annotations to the trace generated by the runtime/trace package. PiperOrigin-RevId: 284290115
Diffstat (limited to 'pkg/sentry/control/pprof.go')
-rw-r--r--pkg/sentry/control/pprof.go15
1 files changed, 14 insertions, 1 deletions
diff --git a/pkg/sentry/control/pprof.go b/pkg/sentry/control/pprof.go
index 1f78d54a2..e1f2fea60 100644
--- a/pkg/sentry/control/pprof.go
+++ b/pkg/sentry/control/pprof.go
@@ -22,6 +22,7 @@ import (
"sync"
"gvisor.dev/gvisor/pkg/fd"
+ "gvisor.dev/gvisor/pkg/sentry/kernel"
"gvisor.dev/gvisor/pkg/urpc"
)
@@ -56,6 +57,9 @@ type Profile struct {
// traceFile is the current execution trace output file.
traceFile *fd.FD
+
+ // Kernel is the kernel under profile.
+ Kernel *kernel.Kernel
}
// StartCPUProfile is an RPC stub which starts recording the CPU profile in a
@@ -147,6 +151,9 @@ func (p *Profile) StartTrace(o *ProfileOpts, _ *struct{}) error {
return err
}
+ // Ensure all trace contexts are registered.
+ p.Kernel.RebuildTraceContexts()
+
p.traceFile = output
return nil
}
@@ -158,9 +165,15 @@ func (p *Profile) StopTrace(_, _ *struct{}) error {
defer p.mu.Unlock()
if p.traceFile == nil {
- return errors.New("Execution tracing not start")
+ return errors.New("Execution tracing not started")
}
+ // Similarly to the case above, if tasks have not ended traces, we will
+ // lose information. Thus we need to rebuild the tasks in order to have
+ // complete information. This will not lose information if multiple
+ // traces are overlapping.
+ p.Kernel.RebuildTraceContexts()
+
trace.Stop()
p.traceFile.Close()
p.traceFile = nil