terminal: print breakpoint info for tracepoints (#2121)

Print breakpoint info (requested print variables, stacktrace) when a
tracepoint is hit.

Fixes #2116
This commit is contained in:
Alessandro Arzilli 2020-08-05 18:38:53 +02:00 committed by GitHub
parent 7a8316b52f
commit 01909d0f0b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 58 additions and 24 deletions

@ -2234,37 +2234,59 @@ func printcontextThread(t *Term, th *api.Thread) {
}
printReturnValues(th)
printBreakpointInfo(th, false)
}
if th.BreakpointInfo != nil {
bp := th.Breakpoint
bpi := th.BreakpointInfo
func printBreakpointInfo(th *api.Thread, tracepointOnNewline bool) {
if th.BreakpointInfo == nil {
return
}
bp := th.Breakpoint
bpi := th.BreakpointInfo
if bpi.Goroutine != nil {
writeGoroutineLong(os.Stdout, bpi.Goroutine, "\t")
if bp.TraceReturn {
return
}
didprintnl := tracepointOnNewline
tracepointnl := func() {
if !bp.Tracepoint || didprintnl {
return
}
didprintnl = true
fmt.Println()
}
for _, v := range bpi.Variables {
if bpi.Goroutine != nil {
tracepointnl()
writeGoroutineLong(os.Stdout, bpi.Goroutine, "\t")
}
for _, v := range bpi.Variables {
tracepointnl()
fmt.Printf("\t%s: %s\n", v.Name, v.MultilineString("\t"))
}
for _, v := range bpi.Locals {
tracepointnl()
if *bp.LoadLocals == longLoadConfig {
fmt.Printf("\t%s: %s\n", v.Name, v.MultilineString("\t"))
} else {
fmt.Printf("\t%s: %s\n", v.Name, v.SinglelineString())
}
}
if bp.LoadArgs != nil && *bp.LoadArgs == longLoadConfig {
for _, v := range bpi.Arguments {
tracepointnl()
fmt.Printf("\t%s: %s\n", v.Name, v.MultilineString("\t"))
}
}
for _, v := range bpi.Locals {
if *bp.LoadLocals == longLoadConfig {
fmt.Printf("\t%s: %s\n", v.Name, v.MultilineString("\t"))
} else {
fmt.Printf("\t%s: %s\n", v.Name, v.SinglelineString())
}
}
if bp.LoadArgs != nil && *bp.LoadArgs == longLoadConfig {
for _, v := range bpi.Arguments {
fmt.Printf("\t%s: %s\n", v.Name, v.MultilineString("\t"))
}
}
if bpi.Stacktrace != nil {
fmt.Printf("\tStack:\n")
printStack(os.Stdout, bpi.Stacktrace, "\t\t", false)
}
if bpi.Stacktrace != nil {
tracepointnl()
fmt.Printf("\tStack:\n")
printStack(os.Stdout, bpi.Stacktrace, "\t\t", false)
}
}
@ -2274,6 +2296,7 @@ func printTracepoint(th *api.Thread, bpname string, fn *api.Function, args strin
if !hasReturnValue {
fmt.Println()
}
printBreakpointInfo(th, !hasReturnValue)
}
if th.Breakpoint.TraceReturn {
retVals := make([]string, 0, len(th.ReturnValues))

@ -1075,3 +1075,14 @@ func TestExamineMemoryCmd(t *testing.T) {
}
})
}
func TestPrintOnTracepoint(t *testing.T) {
withTestTerminal("increment", t, func(term *FakeTerminal) {
term.MustExec("trace main.Increment")
term.MustExec("on 1 print y+1")
out, _ := term.Exec("continue")
if !strings.Contains(out, "y+1: 4") || !strings.Contains(out, "y+1: 2") || !strings.Contains(out, "y+1: 1") {
t.Errorf("output did not contain breakpoint information: %q", out)
}
})
}