Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

YQL-17711: Fix backtrace #1619

Merged
merged 1 commit into from
Feb 7, 2024
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
Loading