}
t.Parallel()
got := runTestProg(t, "testprogcgo", "TracebackSigpanic")
+ t.Log(got)
want := "runtime.sigpanic"
if !strings.Contains(got, want) {
- t.Fatalf("want failure containing %q. output:\n%s\n", want, got)
+ t.Errorf("did not see %q in output", want)
}
- nowant := "unexpected return pc"
+ // No runtime errors like "runtime: unexpected return pc".
+ nowant := "runtime: "
if strings.Contains(got, nowant) {
- t.Fatalf("failure incorrectly contains %q. output:\n%s\n", nowant, got)
+ t.Errorf("unexpectedly saw %q in output", want)
}
}
t.Parallel()
got := runTestProg(t, "testprogcgo", test)
t.Log(got)
- if !strings.Contains(got, "SIGSEGV") {
- t.Errorf("expected crash from signal")
+ want := "SIGSEGV"
+ if !strings.Contains(got, want) {
+ t.Errorf("did not see %q in output", want)
+ }
+ // No runtime errors like "runtime: unknown pc".
+ nowant := "runtime: "
+ if strings.Contains(got, nowant) {
+ t.Errorf("unexpectedly saw %q in output", want)
}
})
}
printCgoTraceback(&cgoCallers)
}
- var n int
if readgstatus(gp)&^_Gscan == _Gsyscall {
// Override registers if blocked in system call.
pc = gp.syscallpc
sp = gp.syscallsp
flags &^= _TraceTrap
}
+ if gp.m != nil && gp.m.vdsoSP != 0 {
+ // Override registers if running in VDSO. This comes after the
+ // _Gsyscall check to cover VDSO calls after entersyscall.
+ pc = gp.m.vdsoPC
+ sp = gp.m.vdsoSP
+ flags &^= _TraceTrap
+ }
+
// Print traceback. By default, omits runtime frames.
// If that means we print nothing at all, repeat forcing all frames printed.
- n = gentraceback(pc, sp, lr, gp, 0, nil, _TracebackMaxFrames, nil, nil, flags)
+ n := gentraceback(pc, sp, lr, gp, 0, nil, _TracebackMaxFrames, nil, nil, flags)
if n == 0 && (flags&_TraceRuntimeFrames) == 0 {
n = gentraceback(pc, sp, lr, gp, 0, nil, _TracebackMaxFrames, nil, nil, flags|_TraceRuntimeFrames)
}