Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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