void runtime·traceback(uintptr pc, uintptr sp, uintptr lr, G *gp) { USED(lr); if(gp->status == Gsyscall) { // Override signal registers if blocked in system call. pc = gp->syscallpc; sp = gp->syscallsp; } // Print traceback. By default, omits runtime frames. // If that means we print nothing at all, repeat forcing all frames printed. if(runtime·gentraceback(pc, sp, 0, gp, 0, nil, 100, nil, nil, false) == 0) runtime·gentraceback(pc, sp, 0, gp, 0, nil, 100, nil, nil, true); runtime·printcreatedby(gp); }
void runtime·traceback(uintptr pc, uintptr sp, uintptr lr, G *gp) { int32 n; if(gp->status == Gsyscall) { // Override signal registers if blocked in system call. pc = gp->syscallpc; sp = gp->syscallsp; lr = 0; } // Print traceback. By default, omits runtime frames. // If that means we print nothing at all, repeat forcing all frames printed. n = runtime·gentraceback(pc, sp, lr, gp, 0, nil, TracebackMaxFrames, nil, nil, false); if(n == 0) runtime·gentraceback(pc, sp, lr, gp, 0, nil, TracebackMaxFrames, nil, nil, true); if(n == TracebackMaxFrames) runtime·printf("...additional frames elided...\n"); runtime·printcreatedby(gp); }