diff options
| author | vvvv <[email protected]> | 2024-11-01 15:41:40 +0300 |
|---|---|---|
| committer | vvvv <[email protected]> | 2024-11-01 15:55:52 +0300 |
| commit | 3325f745e67f7f442790822b5c9c5e9996708be7 (patch) | |
| tree | f7318d68bbe8990092715436444b05297ce35777 /yql/essentials/utils/backtrace/backtrace_linux.cpp | |
| parent | 6dce3f1c71786f2694b73b1a5155efc58f4557dd (diff) | |
Moved yql/utils YQL-19206
Также была выделена жирная зависимость из yql/utils в yql/utils/network, в результате library/cpp/getopt была добавлена явно в те проекты, которые ее ранее наследовали, а не указывали явно
commit_hash:36aa4c41f807b4cbbf70a3ed7ac0a1a5079bb75d
Diffstat (limited to 'yql/essentials/utils/backtrace/backtrace_linux.cpp')
| -rw-r--r-- | yql/essentials/utils/backtrace/backtrace_linux.cpp | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/yql/essentials/utils/backtrace/backtrace_linux.cpp b/yql/essentials/utils/backtrace/backtrace_linux.cpp new file mode 100644 index 00000000000..c9a1bd5a225 --- /dev/null +++ b/yql/essentials/utils/backtrace/backtrace_linux.cpp @@ -0,0 +1,62 @@ +#include "backtrace_lib.h" + +#include <libunwind.h> +#include <signal.h> + +#include <util/system/backtrace.h> + +namespace { + size_t BackTrace(void** p, size_t len, ucontext_t* con) { + unw_context_t context; + unw_cursor_t cursor; + if (unw_getcontext(&context)) { + return 0; + } + + if (unw_init_local(&cursor, &context)) { + return 0; + } + const sigcontext* signal_mcontext = (const sigcontext*)&(con->uc_mcontext); + unw_set_reg(&cursor, UNW_X86_64_RSI, signal_mcontext->rsi); + unw_set_reg(&cursor, UNW_X86_64_RDI, signal_mcontext->rdi); + unw_set_reg(&cursor, UNW_X86_64_RBP, signal_mcontext->rbp); + unw_set_reg(&cursor, UNW_X86_64_RAX, signal_mcontext->rax); + unw_set_reg(&cursor, UNW_X86_64_RBX, signal_mcontext->rbx); + unw_set_reg(&cursor, UNW_X86_64_RCX, signal_mcontext->rcx); + unw_set_reg(&cursor, UNW_X86_64_R8, signal_mcontext->r8); + unw_set_reg(&cursor, UNW_X86_64_R9, signal_mcontext->r9); + unw_set_reg(&cursor, UNW_X86_64_R10, signal_mcontext->r10); + unw_set_reg(&cursor, UNW_X86_64_R11, signal_mcontext->r11); + unw_set_reg(&cursor, UNW_X86_64_R12, signal_mcontext->r12); + unw_set_reg(&cursor, UNW_X86_64_R13, signal_mcontext->r13); + unw_set_reg(&cursor, UNW_X86_64_R14, signal_mcontext->r14); + unw_set_reg(&cursor, UNW_X86_64_R15, signal_mcontext->r15); + unw_set_reg(&cursor, UNW_X86_64_RSP, signal_mcontext->rsp); + + unw_set_reg(&cursor, UNW_REG_SP, signal_mcontext->rsp); + unw_set_reg(&cursor, UNW_REG_IP, signal_mcontext->rip); + + size_t pos = 0; + p[pos++] = (void*)signal_mcontext->rip; + while (pos < len && unw_step(&cursor) > 0) { + unw_word_t ip = 0; + unw_get_reg(&cursor, UNW_REG_IP, &ip); + if (unw_is_signal_frame(&cursor)) { + continue; + } + p[pos++] = (void*)ip; + } + return pos; + } +} + +namespace NYql { + namespace NBacktrace { + size_t CollectBacktrace(void** addresses, size_t limit, void* data) { + if (!data) { + return BackTrace(addresses, limit); + } + return BackTrace(addresses, limit, reinterpret_cast<ucontext_t*>(data)); + } + } +}
\ No newline at end of file |
