aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ChangeLog7
-rw-r--r--vm_dump.c3
2 files changed, 10 insertions, 0 deletions
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 <naruse@ruby-lang.org>
+
+ * 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 <nobu@ruby-lang.org>
* 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;