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:
parent
7a8316b52f
commit
01909d0f0b
@ -2234,37 +2234,59 @@ func printcontextThread(t *Term, th *api.Thread) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
printReturnValues(th)
|
printReturnValues(th)
|
||||||
|
printBreakpointInfo(th, false)
|
||||||
|
}
|
||||||
|
|
||||||
if th.BreakpointInfo != nil {
|
func printBreakpointInfo(th *api.Thread, tracepointOnNewline bool) {
|
||||||
bp := th.Breakpoint
|
if th.BreakpointInfo == nil {
|
||||||
bpi := th.BreakpointInfo
|
return
|
||||||
|
}
|
||||||
|
bp := th.Breakpoint
|
||||||
|
bpi := th.BreakpointInfo
|
||||||
|
|
||||||
if bpi.Goroutine != nil {
|
if bp.TraceReturn {
|
||||||
writeGoroutineLong(os.Stdout, bpi.Goroutine, "\t")
|
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"))
|
fmt.Printf("\t%s: %s\n", v.Name, v.MultilineString("\t"))
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for _, v := range bpi.Locals {
|
if bpi.Stacktrace != nil {
|
||||||
if *bp.LoadLocals == longLoadConfig {
|
tracepointnl()
|
||||||
fmt.Printf("\t%s: %s\n", v.Name, v.MultilineString("\t"))
|
fmt.Printf("\tStack:\n")
|
||||||
} else {
|
printStack(os.Stdout, bpi.Stacktrace, "\t\t", false)
|
||||||
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)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2274,6 +2296,7 @@ func printTracepoint(th *api.Thread, bpname string, fn *api.Function, args strin
|
|||||||
if !hasReturnValue {
|
if !hasReturnValue {
|
||||||
fmt.Println()
|
fmt.Println()
|
||||||
}
|
}
|
||||||
|
printBreakpointInfo(th, !hasReturnValue)
|
||||||
}
|
}
|
||||||
if th.Breakpoint.TraceReturn {
|
if th.Breakpoint.TraceReturn {
|
||||||
retVals := make([]string, 0, len(th.ReturnValues))
|
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)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user