aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/trace/trace.go
diff options
context:
space:
mode:
authorHana Kim <hakim@google.com>2018-01-26 10:18:16 -0500
committerHyang-Ah Hana Kim <hyangah@gmail.com>2018-02-21 20:13:47 +0000
commitf42418b25da382382a35730eff68fd27d049c581 (patch)
tree6c1987c0390f1234d726dc84900ce0f019754908 /src/cmd/trace/trace.go
parentcacf8127e3ce1b0a69df66bec68dbd80126aac87 (diff)
downloadgo-f42418b25da382382a35730eff68fd27d049c581.tar.xz
cmd/trace: add user log event in the task-oriented trace view
Also append stack traces to task create/end slices. R=go1.11 Change-Id: I2adb342e92b36d30bee2860393618eb4064450cf Reviewed-on: https://go-review.googlesource.com/90220 Reviewed-by: Heschi Kreinick <heschi@google.com>
Diffstat (limited to 'src/cmd/trace/trace.go')
-rw-r--r--src/cmd/trace/trace.go40
1 files changed, 32 insertions, 8 deletions
diff --git a/src/cmd/trace/trace.go b/src/cmd/trace/trace.go
index bf5fde508c..2832b90b82 100644
--- a/src/cmd/trace/trace.go
+++ b/src/cmd/trace/trace.go
@@ -544,12 +544,12 @@ func generateTrace(params *traceParams) (ViewerData, error) {
if ctx.mode != defaultTraceview {
continue
}
- ctx.emitInstant(ev, "proc start")
+ ctx.emitInstant(ev, "proc start", "")
case trace.EvProcStop:
if ctx.mode != defaultTraceview {
continue
}
- ctx.emitInstant(ev, "proc stop")
+ ctx.emitInstant(ev, "proc stop", "")
case trace.EvGCStart:
ctx.emitSlice(ev, "GC")
case trace.EvGCDone:
@@ -605,9 +605,15 @@ func generateTrace(params *traceParams) (ViewerData, error) {
case trace.EvGoUnblock:
ctx.emitArrow(ev, "unblock")
case trace.EvGoSysCall:
- ctx.emitInstant(ev, "syscall")
+ ctx.emitInstant(ev, "syscall", "")
case trace.EvGoSysExit:
ctx.emitArrow(ev, "sysexit")
+ case trace.EvUserLog:
+ ctx.emitInstant(ev, formatUserLog(ev), "user event")
+ case trace.EvUserTaskCreate:
+ ctx.emitInstant(ev, "task start", "user event")
+ case trace.EvUserTaskEnd:
+ ctx.emitInstant(ev, "task end", "user event")
}
// Emit any counter updates.
ctx.emitThreadCounters(ev)
@@ -649,8 +655,18 @@ func generateTrace(params *traceParams) (ViewerData, error) {
taskName := fmt.Sprintf("Task %s(%d)", task.name, task.id)
ctx.emit(&ViewerEvent{Name: "thread_name", Phase: "M", Pid: 0, Tid: taskRow, Arg: &NameArg{"Tasks"}})
ctx.emit(&ViewerEvent{Name: "thread_sort_index", Phase: "M", Pid: 0, Tid: taskRow, Arg: &SortIndexArg{-3}})
- ctx.emit(&ViewerEvent{Category: "task", Name: taskName, Phase: "b", Time: float64(task.firstTimestamp()) / 1e3, Tid: taskRow, ID: task.id, Cname: "bad"})
- ctx.emit(&ViewerEvent{Category: "task", Name: taskName, Phase: "e", Time: float64(task.lastTimestamp()) / 1e3, Tid: taskRow, ID: task.id, Cname: "bad"})
+ tBegin := &ViewerEvent{Category: "task", Name: taskName, Phase: "b", Time: float64(task.firstTimestamp()) / 1e3, Tid: taskRow, ID: task.id, Cname: "bad"}
+ if task.create != nil {
+ tBegin.Stack = ctx.stack(task.create.Stk)
+ }
+ ctx.emit(tBegin)
+
+ tEnd := &ViewerEvent{Category: "task", Name: taskName, Phase: "e", Time: float64(task.lastTimestamp()) / 1e3, Tid: taskRow, ID: task.id, Cname: "bad"}
+ if task.end != nil {
+ tEnd.Stack = ctx.stack(task.end.Stk)
+ }
+ ctx.emit(tEnd)
+
// Spans
for _, s := range task.spans {
ctx.emitSpan(s)
@@ -818,7 +834,7 @@ func (ctx *traceContext) emitThreadCounters(ev *trace.Event) {
ctx.prevThreadStats = ctx.threadStats
}
-func (ctx *traceContext) emitInstant(ev *trace.Event, name string) {
+func (ctx *traceContext) emitInstant(ev *trace.Event, name, category string) {
var arg interface{}
if ev.Type == trace.EvProcStart {
type Arg struct {
@@ -826,7 +842,15 @@ func (ctx *traceContext) emitInstant(ev *trace.Event, name string) {
}
arg = &Arg{ev.Args[0]}
}
- ctx.emit(&ViewerEvent{Name: name, Phase: "I", Scope: "t", Time: ctx.time(ev), Tid: ctx.proc(ev), Stack: ctx.stack(ev.Stk), Arg: arg})
+ ctx.emit(&ViewerEvent{
+ Name: name,
+ Category: category,
+ Phase: "I",
+ Scope: "t",
+ Time: ctx.time(ev),
+ Tid: ctx.proc(ev),
+ Stack: ctx.stack(ev.Stk),
+ Arg: arg})
}
func (ctx *traceContext) emitArrow(ev *trace.Event, name string) {
@@ -842,7 +866,7 @@ func (ctx *traceContext) emitArrow(ev *trace.Event, name string) {
if ev.P == trace.NetpollP || ev.P == trace.TimerP || ev.P == trace.SyscallP {
// Trace-viewer discards arrows if they don't start/end inside of a slice or instant.
// So emit a fake instant at the start of the arrow.
- ctx.emitInstant(&trace.Event{P: ev.P, Ts: ev.Ts}, "unblock")
+ ctx.emitInstant(&trace.Event{P: ev.P, Ts: ev.Ts}, "unblock", "")
}
ctx.arrowSeq++