From: Ian Lance Taylor Date: Wed, 8 Jan 2014 20:36:31 +0000 (-0800) Subject: runtime: handle gdb breakpoint in x86 traceback X-Git-Tag: go1.3beta1~1031 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=89c5d178785bd7884dbb14d73f85f600196d6cb6;p=gostls13.git runtime: handle gdb breakpoint in x86 traceback This lets stack splits work correctly when running under gdb when gdb has inserted a breakpoint somewhere on the call stack. Fixes #6834. R=golang-codereviews, minux.ma CC=golang-codereviews https://golang.org/cl/48650043 --- diff --git a/src/pkg/runtime/sys_x86.c b/src/pkg/runtime/sys_x86.c index e68ff514a2..bddfb8a889 100644 --- a/src/pkg/runtime/sys_x86.c +++ b/src/pkg/runtime/sys_x86.c @@ -27,7 +27,8 @@ void runtime·rewindmorestack(Gobuf *gobuf) { byte *pc; - + Func *f; + pc = (byte*)gobuf->pc; if(pc[0] == 0xe9) { // jmp 4-byte offset gobuf->pc = gobuf->pc + 5 + *(int32*)(pc+1); @@ -37,6 +38,13 @@ runtime·rewindmorestack(Gobuf *gobuf) gobuf->pc = gobuf->pc + 2 + *(int8*)(pc+1); return; } + if(pc[0] == 0xcc) { // breakpoint inserted by gdb + f = runtime·findfunc(gobuf->pc); + if(f != nil) { + gobuf->pc = f->entry; + return; + } + } runtime·printf("runtime: pc=%p %x %x %x %x %x\n", pc, pc[0], pc[1], pc[2], pc[3], pc[4]); runtime·throw("runtime: misuse of rewindmorestack"); }