Skip to content

Commit

Permalink
YQL-17711: Fix backtrace (#1619)
Browse files Browse the repository at this point in the history
  • Loading branch information
MrLolthe1st authored Feb 7, 2024
1 parent b009412 commit 3a9f13e
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 34 deletions.
64 changes: 36 additions & 28 deletions ydb/library/yql/utils/backtrace/backtrace_in_context.cpp
Original file line number Diff line number Diff line change
@@ -1,37 +1,45 @@
#include <contrib/libs/libunwind/include/libunwind.h>
#include <libunwind.h>
#include <signal.h>
#include <util/system/compiler.h>

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;
Expand Down
7 changes: 4 additions & 3 deletions ydb/library/yql/utils/backtrace/symbolize.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -59,10 +59,11 @@ TString Symbolize(const TString& input, const THashMap<TString, TString>& mappin
#ifdef _linux_
std::array<const void*, 1> 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;
});

Expand Down
7 changes: 4 additions & 3 deletions ydb/library/yql/utils/backtrace/symbolizer_linux.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;
});

Expand Down
3 changes: 3 additions & 0 deletions ydb/library/yql/utils/backtrace/ya.make
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 3a9f13e

Please sign in to comment.