From 89c5d178785bd7884dbb14d73f85f600196d6cb6 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Wed, 8 Jan 2014 12:36:31 -0800 Subject: [PATCH] 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 --- src/pkg/runtime/sys_x86.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) 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"); } -- 2.48.1