diff --git a/ydb/library/yql/utils/backtrace/backtrace_in_context.cpp b/ydb/library/yql/utils/backtrace/backtrace_in_context.cpp index 2d2b79761a8b..6540e3ed1ca9 100644 --- a/ydb/library/yql/utils/backtrace/backtrace_in_context.cpp +++ b/ydb/library/yql/utils/backtrace/backtrace_in_context.cpp @@ -1,37 +1,45 @@ -#include +#include #include +#include -size_t BackTrace(void** p, size_t len, ucontext_t* signal_ucontext) { - unw_context_t unw_context = {}; - unw_getcontext(&unw_context); - unw_cursor_t unw_cursor = {}; - unw_init_local(&unw_cursor, &unw_context); - const sigcontext* signal_mcontext = (const sigcontext*)&(signal_ucontext->uc_mcontext); - - unw_set_reg(&unw_cursor, UNW_X86_64_RSI, signal_mcontext->rsi); - unw_set_reg(&unw_cursor, UNW_X86_64_RDI, signal_mcontext->rdi); - unw_set_reg(&unw_cursor, UNW_X86_64_RBP, signal_mcontext->rbp); - unw_set_reg(&unw_cursor, UNW_X86_64_RAX, signal_mcontext->rax); - unw_set_reg(&unw_cursor, UNW_X86_64_RBX, signal_mcontext->rbx); - unw_set_reg(&unw_cursor, UNW_X86_64_RCX, signal_mcontext->rcx); - unw_set_reg(&unw_cursor, UNW_X86_64_R8, signal_mcontext->r8); - unw_set_reg(&unw_cursor, UNW_X86_64_R9, signal_mcontext->r9); - unw_set_reg(&unw_cursor, UNW_X86_64_R10, signal_mcontext->r10); - unw_set_reg(&unw_cursor, UNW_X86_64_R11, signal_mcontext->r11); - unw_set_reg(&unw_cursor, UNW_X86_64_R12, signal_mcontext->r12); - unw_set_reg(&unw_cursor, UNW_X86_64_R13, signal_mcontext->r13); - unw_set_reg(&unw_cursor, UNW_X86_64_R14, signal_mcontext->r14); - unw_set_reg(&unw_cursor, UNW_X86_64_R15, signal_mcontext->r15); +size_t BackTrace(void** p, size_t len, ucontext_t* con) { + Y_UNUSED(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(&unw_cursor, UNW_REG_SP, 8 + signal_mcontext->rsp); - unw_set_reg(&unw_cursor, UNW_REG_IP, *(size_t*)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; - p[pos++] = (void*)(*(size_t*)signal_mcontext->rsp); - while (pos < len && unw_step(&unw_cursor) > 0) { + while (pos < len && unw_step(&cursor) > 0) { unw_word_t ip = 0; - unw_get_reg(&unw_cursor, UNW_REG_IP, &ip); + unw_get_reg(&cursor, UNW_REG_IP, &ip); + if (unw_is_signal_frame(&cursor)) { + continue; + } p[pos++] = (void*)ip; } return pos; diff --git a/ydb/library/yql/utils/backtrace/symbolize.cpp b/ydb/library/yql/utils/backtrace/symbolize.cpp index e94830ea12cc..4f23462f8c46 100644 --- a/ydb/library/yql/utils/backtrace/symbolize.cpp +++ b/ydb/library/yql/utils/backtrace/symbolize.cpp @@ -59,10 +59,11 @@ TString Symbolize(const TString& input, const THashMap& mappin #ifdef _linux_ std::array addrs = { (const void*)frame.Address }; auto error = NDwarf::ResolveBacktraceLocked(addrs, [&](const NDwarf::TLineInfo& info) { - if (!info.FileName.Empty()) - out << info.FileName << ":" << info.Line << ":" << info.Col << " "; if (!info.FunctionName.Empty()) - out << "in " << info.FunctionName << " "; + out << info.FunctionName << " "; + if (!info.FileName.Empty()) + out << "at " << info.FileName << ":" << info.Line << ":" << info.Col << " "; + out << "\n"; return NDwarf::EResolving::Continue; }); diff --git a/ydb/library/yql/utils/backtrace/symbolizer_linux.cpp b/ydb/library/yql/utils/backtrace/symbolizer_linux.cpp index 428ff65fa49c..b017a6bce139 100644 --- a/ydb/library/yql/utils/backtrace/symbolizer_linux.cpp +++ b/ydb/library/yql/utils/backtrace/symbolizer_linux.cpp @@ -73,10 +73,11 @@ class TBacktraceSymbolizer : public IBacktraceSymbolizer { TStringOutput out(output); auto error = NDwarf::ResolveBacktraceLocked(addrs, [&](const NDwarf::TLineInfo& info) { - if (!info.FileName.Empty()) - out << info.FileName << ":" << info.Line << ":" << info.Col << " "; if (!info.FunctionName.Empty()) - out << "in " << info.FunctionName << " "; + out << info.FunctionName << " "; + if (!info.FileName.Empty()) + out << "at " << info.FileName << ":" << info.Line << ":" << info.Col << " "; + out << "\n"; return NDwarf::EResolving::Continue; }); diff --git a/ydb/library/yql/utils/backtrace/ya.make b/ydb/library/yql/utils/backtrace/ya.make index 94122aa24849..f8cf1078d944 100644 --- a/ydb/library/yql/utils/backtrace/ya.make +++ b/ydb/library/yql/utils/backtrace/ya.make @@ -9,6 +9,9 @@ IF (OS_LINUX AND ARCH_X86_64) backtrace_in_context.cpp symbolizer_linux.cpp ) + ADDINCL( + contrib/libs/libunwind/include + ) PEERDIR( contrib/libs/libunwind library/cpp/dwarf_backtrace