Skip to content

Commit ac7139a

Browse files
committed
YQL-17711: Fix backtrace
1 parent fbc9d17 commit ac7139a

4 files changed

Lines changed: 47 additions & 34 deletions

File tree

ydb/library/yql/utils/backtrace/backtrace_in_context.cpp

Lines changed: 36 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,45 @@
1-
#include <contrib/libs/libunwind/include/libunwind.h>
1+
#include <libunwind.h>
22
#include <signal.h>
3+
#include <util/system/compiler.h>
34

4-
size_t BackTrace(void** p, size_t len, ucontext_t* signal_ucontext) {
5-
unw_context_t unw_context = {};
6-
unw_getcontext(&unw_context);
7-
unw_cursor_t unw_cursor = {};
8-
unw_init_local(&unw_cursor, &unw_context);
9-
const sigcontext* signal_mcontext = (const sigcontext*)&(signal_ucontext->uc_mcontext);
10-
11-
unw_set_reg(&unw_cursor, UNW_X86_64_RSI, signal_mcontext->rsi);
12-
unw_set_reg(&unw_cursor, UNW_X86_64_RDI, signal_mcontext->rdi);
13-
unw_set_reg(&unw_cursor, UNW_X86_64_RBP, signal_mcontext->rbp);
14-
unw_set_reg(&unw_cursor, UNW_X86_64_RAX, signal_mcontext->rax);
15-
unw_set_reg(&unw_cursor, UNW_X86_64_RBX, signal_mcontext->rbx);
16-
unw_set_reg(&unw_cursor, UNW_X86_64_RCX, signal_mcontext->rcx);
17-
unw_set_reg(&unw_cursor, UNW_X86_64_R8, signal_mcontext->r8);
18-
unw_set_reg(&unw_cursor, UNW_X86_64_R9, signal_mcontext->r9);
19-
unw_set_reg(&unw_cursor, UNW_X86_64_R10, signal_mcontext->r10);
20-
unw_set_reg(&unw_cursor, UNW_X86_64_R11, signal_mcontext->r11);
21-
unw_set_reg(&unw_cursor, UNW_X86_64_R12, signal_mcontext->r12);
22-
unw_set_reg(&unw_cursor, UNW_X86_64_R13, signal_mcontext->r13);
23-
unw_set_reg(&unw_cursor, UNW_X86_64_R14, signal_mcontext->r14);
24-
unw_set_reg(&unw_cursor, UNW_X86_64_R15, signal_mcontext->r15);
5+
size_t BackTrace(void** p, size_t len, ucontext_t* con) {
6+
Y_UNUSED(con);
7+
unw_context_t context;
8+
unw_cursor_t cursor;
9+
if (unw_getcontext(&context)) {
10+
return 0;
11+
}
12+
13+
if (unw_init_local(&cursor, &context)) {
14+
return 0;
15+
}
16+
const sigcontext* signal_mcontext = (const sigcontext*)&(con->uc_mcontext);
17+
unw_set_reg(&cursor, UNW_X86_64_RSI, signal_mcontext->rsi);
18+
unw_set_reg(&cursor, UNW_X86_64_RDI, signal_mcontext->rdi);
19+
unw_set_reg(&cursor, UNW_X86_64_RBP, signal_mcontext->rbp);
20+
unw_set_reg(&cursor, UNW_X86_64_RAX, signal_mcontext->rax);
21+
unw_set_reg(&cursor, UNW_X86_64_RBX, signal_mcontext->rbx);
22+
unw_set_reg(&cursor, UNW_X86_64_RCX, signal_mcontext->rcx);
23+
unw_set_reg(&cursor, UNW_X86_64_R8, signal_mcontext->r8);
24+
unw_set_reg(&cursor, UNW_X86_64_R9, signal_mcontext->r9);
25+
unw_set_reg(&cursor, UNW_X86_64_R10, signal_mcontext->r10);
26+
unw_set_reg(&cursor, UNW_X86_64_R11, signal_mcontext->r11);
27+
unw_set_reg(&cursor, UNW_X86_64_R12, signal_mcontext->r12);
28+
unw_set_reg(&cursor, UNW_X86_64_R13, signal_mcontext->r13);
29+
unw_set_reg(&cursor, UNW_X86_64_R14, signal_mcontext->r14);
30+
unw_set_reg(&cursor, UNW_X86_64_R15, signal_mcontext->r15);
31+
unw_set_reg(&cursor, UNW_X86_64_RSP, signal_mcontext->rsp);
2532

26-
unw_set_reg(&unw_cursor, UNW_REG_SP, 8 + signal_mcontext->rsp);
27-
unw_set_reg(&unw_cursor, UNW_REG_IP, *(size_t*)signal_mcontext->rsp);
33+
unw_set_reg(&cursor, UNW_REG_SP, signal_mcontext->rsp);
34+
unw_set_reg(&cursor, UNW_REG_IP, signal_mcontext->rip);
2835

2936
size_t pos = 0;
30-
p[pos++] = (void*)signal_mcontext->rip;
31-
p[pos++] = (void*)(*(size_t*)signal_mcontext->rsp);
32-
while (pos < len && unw_step(&unw_cursor) > 0) {
37+
while (pos < len && unw_step(&cursor) > 0) {
3338
unw_word_t ip = 0;
34-
unw_get_reg(&unw_cursor, UNW_REG_IP, &ip);
39+
unw_get_reg(&cursor, UNW_REG_IP, &ip);
40+
if (unw_is_signal_frame(&cursor)) {
41+
continue;
42+
}
3543
p[pos++] = (void*)ip;
3644
}
3745
return pos;

ydb/library/yql/utils/backtrace/symbolize.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,11 @@ TString Symbolize(const TString& input, const THashMap<TString, TString>& mappin
5959
#ifdef _linux_
6060
std::array<const void*, 1> addrs = { (const void*)frame.Address };
6161
auto error = NDwarf::ResolveBacktraceLocked(addrs, [&](const NDwarf::TLineInfo& info) {
62-
if (!info.FileName.Empty())
63-
out << info.FileName << ":" << info.Line << ":" << info.Col << " ";
6462
if (!info.FunctionName.Empty())
65-
out << "in " << info.FunctionName << " ";
63+
out << info.FunctionName << " ";
64+
if (!info.FileName.Empty())
65+
out << "at " << info.FileName << ":" << info.Line << ":" << info.Col << " ";
66+
out << "\n";
6667
return NDwarf::EResolving::Continue;
6768
});
6869

ydb/library/yql/utils/backtrace/symbolizer_linux.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,10 +73,11 @@ class TBacktraceSymbolizer : public IBacktraceSymbolizer {
7373
TStringOutput out(output);
7474

7575
auto error = NDwarf::ResolveBacktraceLocked(addrs, [&](const NDwarf::TLineInfo& info) {
76-
if (!info.FileName.Empty())
77-
out << info.FileName << ":" << info.Line << ":" << info.Col << " ";
7876
if (!info.FunctionName.Empty())
79-
out << "in " << info.FunctionName << " ";
77+
out << info.FunctionName << " ";
78+
if (!info.FileName.Empty())
79+
out << "at " << info.FileName << ":" << info.Line << ":" << info.Col << " ";
80+
out << "\n";
8081
return NDwarf::EResolving::Continue;
8182
});
8283

ydb/library/yql/utils/backtrace/ya.make

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,9 @@ IF (OS_LINUX AND ARCH_X86_64)
99
backtrace_in_context.cpp
1010
symbolizer_linux.cpp
1111
)
12+
ADDINCL(
13+
contrib/libs/libunwind/include
14+
)
1215
PEERDIR(
1316
contrib/libs/libunwind
1417
library/cpp/dwarf_backtrace

0 commit comments

Comments
 (0)