|
1 | | -#include <contrib/libs/libunwind/include/libunwind.h> |
| 1 | +#include <libunwind.h> |
2 | 2 | #include <signal.h> |
| 3 | +#include <util/system/compiler.h> |
3 | 4 |
|
4 | | -size_t BackTrace(void** p, size_t len, ucontext_t* signal_ucontext) { |
5 | | - unw_context_t unw_context = {}; |
6 | | - unw_getcontext(&unw_context); |
7 | | - unw_cursor_t unw_cursor = {}; |
8 | | - unw_init_local(&unw_cursor, &unw_context); |
9 | | - const sigcontext* signal_mcontext = (const sigcontext*)&(signal_ucontext->uc_mcontext); |
10 | | - |
11 | | - unw_set_reg(&unw_cursor, UNW_X86_64_RSI, signal_mcontext->rsi); |
12 | | - unw_set_reg(&unw_cursor, UNW_X86_64_RDI, signal_mcontext->rdi); |
13 | | - unw_set_reg(&unw_cursor, UNW_X86_64_RBP, signal_mcontext->rbp); |
14 | | - unw_set_reg(&unw_cursor, UNW_X86_64_RAX, signal_mcontext->rax); |
15 | | - unw_set_reg(&unw_cursor, UNW_X86_64_RBX, signal_mcontext->rbx); |
16 | | - unw_set_reg(&unw_cursor, UNW_X86_64_RCX, signal_mcontext->rcx); |
17 | | - unw_set_reg(&unw_cursor, UNW_X86_64_R8, signal_mcontext->r8); |
18 | | - unw_set_reg(&unw_cursor, UNW_X86_64_R9, signal_mcontext->r9); |
19 | | - unw_set_reg(&unw_cursor, UNW_X86_64_R10, signal_mcontext->r10); |
20 | | - unw_set_reg(&unw_cursor, UNW_X86_64_R11, signal_mcontext->r11); |
21 | | - unw_set_reg(&unw_cursor, UNW_X86_64_R12, signal_mcontext->r12); |
22 | | - unw_set_reg(&unw_cursor, UNW_X86_64_R13, signal_mcontext->r13); |
23 | | - unw_set_reg(&unw_cursor, UNW_X86_64_R14, signal_mcontext->r14); |
24 | | - unw_set_reg(&unw_cursor, UNW_X86_64_R15, signal_mcontext->r15); |
| 5 | +size_t BackTrace(void** p, size_t len, ucontext_t* con) { |
| 6 | + Y_UNUSED(con); |
| 7 | + unw_context_t context; |
| 8 | + unw_cursor_t cursor; |
| 9 | + if (unw_getcontext(&context)) { |
| 10 | + return 0; |
| 11 | + } |
| 12 | + |
| 13 | + if (unw_init_local(&cursor, &context)) { |
| 14 | + return 0; |
| 15 | + } |
| 16 | + const sigcontext* signal_mcontext = (const sigcontext*)&(con->uc_mcontext); |
| 17 | + unw_set_reg(&cursor, UNW_X86_64_RSI, signal_mcontext->rsi); |
| 18 | + unw_set_reg(&cursor, UNW_X86_64_RDI, signal_mcontext->rdi); |
| 19 | + unw_set_reg(&cursor, UNW_X86_64_RBP, signal_mcontext->rbp); |
| 20 | + unw_set_reg(&cursor, UNW_X86_64_RAX, signal_mcontext->rax); |
| 21 | + unw_set_reg(&cursor, UNW_X86_64_RBX, signal_mcontext->rbx); |
| 22 | + unw_set_reg(&cursor, UNW_X86_64_RCX, signal_mcontext->rcx); |
| 23 | + unw_set_reg(&cursor, UNW_X86_64_R8, signal_mcontext->r8); |
| 24 | + unw_set_reg(&cursor, UNW_X86_64_R9, signal_mcontext->r9); |
| 25 | + unw_set_reg(&cursor, UNW_X86_64_R10, signal_mcontext->r10); |
| 26 | + unw_set_reg(&cursor, UNW_X86_64_R11, signal_mcontext->r11); |
| 27 | + unw_set_reg(&cursor, UNW_X86_64_R12, signal_mcontext->r12); |
| 28 | + unw_set_reg(&cursor, UNW_X86_64_R13, signal_mcontext->r13); |
| 29 | + unw_set_reg(&cursor, UNW_X86_64_R14, signal_mcontext->r14); |
| 30 | + unw_set_reg(&cursor, UNW_X86_64_R15, signal_mcontext->r15); |
| 31 | + unw_set_reg(&cursor, UNW_X86_64_RSP, signal_mcontext->rsp); |
25 | 32 |
|
26 | | - unw_set_reg(&unw_cursor, UNW_REG_SP, 8 + signal_mcontext->rsp); |
27 | | - unw_set_reg(&unw_cursor, UNW_REG_IP, *(size_t*)signal_mcontext->rsp); |
| 33 | + unw_set_reg(&cursor, UNW_REG_SP, signal_mcontext->rsp); |
| 34 | + unw_set_reg(&cursor, UNW_REG_IP, signal_mcontext->rip); |
28 | 35 |
|
29 | 36 | size_t pos = 0; |
30 | | - p[pos++] = (void*)signal_mcontext->rip; |
31 | | - p[pos++] = (void*)(*(size_t*)signal_mcontext->rsp); |
32 | | - while (pos < len && unw_step(&unw_cursor) > 0) { |
| 37 | + while (pos < len && unw_step(&cursor) > 0) { |
33 | 38 | unw_word_t ip = 0; |
34 | | - unw_get_reg(&unw_cursor, UNW_REG_IP, &ip); |
| 39 | + unw_get_reg(&cursor, UNW_REG_IP, &ip); |
| 40 | + if (unw_is_signal_frame(&cursor)) { |
| 41 | + continue; |
| 42 | + } |
35 | 43 | p[pos++] = (void*)ip; |
36 | 44 | } |
37 | 45 | return pos; |
|
0 commit comments