summaryrefslogtreecommitdiff
path: root/vm_dump.c
diff options
context:
space:
mode:
authorusa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-09-30 15:58:12 +0000
committerusa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2016-09-30 15:58:12 +0000
commit768cdfb2a3d4406db53e950b13134d4b6d70ca80 (patch)
tree88b49eae2198c20a297ed77bb9dbec6e220e55c0 /vm_dump.c
parent16310405170cf26f2412622ee7978e8d5a05d61b (diff)
merge revision(s) 56030,56035: [Backport #12711]
* 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/branches/ruby_2_2@56308 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'vm_dump.c')
-rw-r--r--vm_dump.c10
1 files changed, 7 insertions, 3 deletions
diff --git a/vm_dump.c b/vm_dump.c
index b33936de96..155bb62d09 100644
--- a/vm_dump.c
+++ b/vm_dump.c
@@ -487,10 +487,14 @@ darwin_sigtramp:
unw_set_reg(&cursor, UNW_X86_64_R13, uctx->uc_mcontext->__ss.__r13);
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;
- unw_set_reg(&cursor, UNW_REG_IP, ip);
- trace[n++] = (void *)uctx->uc_mcontext->__ss.__rip;
+ ip = uctx->uc_mcontext->__ss.__rip;
+ if (((char*)ip)[-2] == 0x0f && ((char*)ip)[-1] == 5) {
+ /* signal received in syscall */
+ trace[n++] = (void *)ip;
+ ip = *(unw_word_t*)uctx->uc_mcontext->__ss.__rsp;
+ }
trace[n++] = (void *)ip;
+ unw_set_reg(&cursor, UNW_REG_IP, ip);
}
while (unw_step(&cursor) > 0) {
unw_get_reg(&cursor, UNW_REG_IP, &ip);