From c0c9035cc2f683c69791885a4343d30905e61c1d Mon Sep 17 00:00:00 2001 From: naruse Date: Mon, 29 Aug 2016 18:43:17 +0000 Subject: * vm_dump.c (backtrace): use rip in the saved context for the case the SIGSEGV is received when the process is in userland. Note that ip in the stack should be used if the signal is received when it is in kernel (when it is calling syscall) [Bug #12711] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@56030 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 7 +++++++ vm_dump.c | 3 +++ 2 files changed, 10 insertions(+) diff --git a/ChangeLog b/ChangeLog index ae75abdabf..fbaada6e4d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +Tue Aug 30 03:38:35 2016 NARUSE, Yui + + * vm_dump.c (backtrace): use rip in the saved context for the case + the SIGSEGV is received when the process is in userland. + Note that ip in the stack should be used if the signal is received + when it is in kernel (when it is calling syscall) [Bug #12711] + Sat Aug 27 10:26:14 2016 Nobuyoshi Nakada * array.c (rb_ary_concat_multi): take multiple arguments. based diff --git a/vm_dump.c b/vm_dump.c index c0f0685f0b..f8cde6d595 100644 --- a/vm_dump.c +++ b/vm_dump.c @@ -470,6 +470,9 @@ darwin_sigtramp: unw_set_reg(&cursor, UNW_X86_64_R14, uctx->uc_mcontext->__ss.__r14); unw_set_reg(&cursor, UNW_X86_64_R15, uctx->uc_mcontext->__ss.__r15); ip = *(unw_word_t*)uctx->uc_mcontext->__ss.__rsp; + if (!ip) { /* signal received in syscall */ + ip = uctx->uc_mcontext->__ss.__rip; + } unw_set_reg(&cursor, UNW_REG_IP, ip); trace[n++] = (void *)uctx->uc_mcontext->__ss.__rip; trace[n++] = (void *)ip; -- cgit v1.2.3