summaryrefslogtreecommitdiffstats
path: root/library/cpp
diff options
context:
space:
mode:
authorbabenko <[email protected]>2025-09-27 16:10:26 +0300
committerbabenko <[email protected]>2025-09-27 16:30:32 +0300
commit055c3c8b4a5f47044fa04e4f5b71968f6d9e29de (patch)
treea16ae15d1102920e4976138db0c8a2e4eadbe701 /library/cpp
parent797030c5c49cc061a859059dcda5621c31f9f451 (diff)
Fix SymbolizeBacktrace mess
commit_hash:18426181c7e415f097e4d8c2378753768fa3628d
Diffstat (limited to 'library/cpp')
-rw-r--r--library/cpp/yt/backtrace/backtrace.cpp24
-rw-r--r--library/cpp/yt/backtrace/backtrace.h6
-rw-r--r--library/cpp/yt/backtrace/symbolizers/dummy/dummy_symbolizer.cpp10
-rw-r--r--library/cpp/yt/backtrace/symbolizers/dwarf/dwarf_symbolizer.cpp12
-rw-r--r--library/cpp/yt/backtrace/symbolizers/dynload/dynload_symbolizer.cpp10
5 files changed, 44 insertions, 18 deletions
diff --git a/library/cpp/yt/backtrace/backtrace.cpp b/library/cpp/yt/backtrace/backtrace.cpp
index e663cbb8a40..08c5e3d6b13 100644
--- a/library/cpp/yt/backtrace/backtrace.cpp
+++ b/library/cpp/yt/backtrace/backtrace.cpp
@@ -4,6 +4,30 @@ namespace NYT::NBacktrace {
////////////////////////////////////////////////////////////////////////////////
+namespace NDetail {
+
+void SymbolizeBacktraceImpl(
+ TBacktrace backtrace,
+ const std::function<void(TStringBuf)>& writeCallback);
+
+} // namespace NDetail
+
+void SymbolizeBacktrace(
+ TBacktrace backtrace,
+ const std::function<void(TStringBuf)>& writeCallback,
+ void* startPC)
+{
+ if (backtrace.empty()) {
+ writeCallback(TStringBuf("<stack trace is not available>"));
+ } else {
+ TBacktrace::const_iterator it;
+ if (startPC && (it = std::find(backtrace.Begin(), backtrace.End(), startPC)) != backtrace.End()) {
+ backtrace = backtrace.Slice(it - backtrace.Begin(), backtrace.Size());
+ }
+ NDetail::SymbolizeBacktraceImpl(backtrace, writeCallback);
+ }
+}
+
std::string SymbolizeBacktrace(TBacktrace backtrace)
{
std::string result;
diff --git a/library/cpp/yt/backtrace/backtrace.h b/library/cpp/yt/backtrace/backtrace.h
index fcb1dc782f7..8d26ded545d 100644
--- a/library/cpp/yt/backtrace/backtrace.h
+++ b/library/cpp/yt/backtrace/backtrace.h
@@ -24,11 +24,13 @@ TBacktrace GetBacktrace(
//! Symbolizes a backtrace invoking a given callback for each frame.
/*!
* \param backtrace Backtrace to symbolize
- * \param frameCallback Callback to invoke per each frame
+ * \param writeCallback Callback to invoke for writing symbolized frames
+ * \param startPC PC to start symbolization from (if null then start with the very first frame)
*/
void SymbolizeBacktrace(
TBacktrace backtrace,
- const std::function<void(TStringBuf)>& frameCallback);
+ const std::function<void(TStringBuf)>& writeCallback,
+ void* startPC = nullptr);
//! Symbolizes a backtrace to a string.
/*!
diff --git a/library/cpp/yt/backtrace/symbolizers/dummy/dummy_symbolizer.cpp b/library/cpp/yt/backtrace/symbolizers/dummy/dummy_symbolizer.cpp
index 3b1d37aa028..f658bc16ff2 100644
--- a/library/cpp/yt/backtrace/symbolizers/dummy/dummy_symbolizer.cpp
+++ b/library/cpp/yt/backtrace/symbolizers/dummy/dummy_symbolizer.cpp
@@ -2,13 +2,13 @@
#include <library/cpp/yt/string/raw_formatter.h>
-namespace NYT::NBacktrace {
+namespace NYT::NBacktrace::NDetail {
////////////////////////////////////////////////////////////////////////////////
-void SymbolizeBacktrace(
+void SymbolizeBacktraceImpl(
TBacktrace backtrace,
- const std::function<void(TStringBuf)>& frameCallback)
+ const std::function<void(TStringBuf)>& writeCallback)
{
for (int index = 0; index < std::ssize(backtrace); ++index) {
TRawFormatter<1024> formatter;
@@ -16,10 +16,10 @@ void SymbolizeBacktrace(
formatter.AppendString(". 0x");
formatter.AppendNumber(reinterpret_cast<uintptr_t>(backtrace[index]), /*radix*/ 16, /*width*/ 12);
formatter.AppendString("\n");
- frameCallback(formatter.GetBuffer());
+ writeCallback(formatter.GetBuffer());
}
}
////////////////////////////////////////////////////////////////////////////////
-} // namespace NYT::NBacktrace
+} // namespace NYT::NBacktrace::NDetail
diff --git a/library/cpp/yt/backtrace/symbolizers/dwarf/dwarf_symbolizer.cpp b/library/cpp/yt/backtrace/symbolizers/dwarf/dwarf_symbolizer.cpp
index e95d920f188..a772705b635 100644
--- a/library/cpp/yt/backtrace/symbolizers/dwarf/dwarf_symbolizer.cpp
+++ b/library/cpp/yt/backtrace/symbolizers/dwarf/dwarf_symbolizer.cpp
@@ -4,13 +4,13 @@
#include <library/cpp/yt/string/raw_formatter.h>
-namespace NYT::NBacktrace {
+namespace NYT::NBacktrace::NDetail {
////////////////////////////////////////////////////////////////////////////////
-void SymbolizeBacktrace(
+void SymbolizeBacktraceImpl(
TBacktrace backtrace,
- const std::function<void(TStringBuf)>& frameCallback)
+ const std::function<void(TStringBuf)>& writeCallback)
{
auto error = NDwarf::ResolveBacktrace({backtrace.begin(), backtrace.size()}, [&] (const NDwarf::TLineInfo& info) {
TRawFormatter<1024> formatter;
@@ -37,7 +37,7 @@ void SymbolizeBacktrace(
formatter.Revert(1);
}
formatter.AppendString("\n");
- frameCallback(formatter.GetBuffer());
+ writeCallback(formatter.GetBuffer());
// Call the callback exactly `frameCount` times,
// even if there are inline functions and one frame resolved to several lines.
// It needs for case when caller uses `frameCount` less than 100 for pretty formatting.
@@ -55,10 +55,10 @@ void SymbolizeBacktrace(
formatter.AppendString("*** Message: ");
formatter.AppendString(error->Message);
formatter.AppendString("\n");
- frameCallback(formatter.GetBuffer());
+ writeCallback(formatter.GetBuffer());
}
}
////////////////////////////////////////////////////////////////////////////////
-} // namespace NYT::NBacktrace
+} // namespace NYT::NBacktrace::NDetail
diff --git a/library/cpp/yt/backtrace/symbolizers/dynload/dynload_symbolizer.cpp b/library/cpp/yt/backtrace/symbolizers/dynload/dynload_symbolizer.cpp
index ca4b157045b..749f28ae1f0 100644
--- a/library/cpp/yt/backtrace/symbolizers/dynload/dynload_symbolizer.cpp
+++ b/library/cpp/yt/backtrace/symbolizers/dynload/dynload_symbolizer.cpp
@@ -7,7 +7,7 @@
#include <dlfcn.h>
#include <cxxabi.h>
-namespace NYT::NBacktrace {
+namespace NYT::NBacktrace::NDetail {
////////////////////////////////////////////////////////////////////////////////
@@ -94,9 +94,9 @@ void DumpStackFrameInfo(TBaseFormatter* formatter, const void* pc)
} // namespace
-Y_WEAK void SymbolizeBacktrace(
+void SymbolizeBacktraceImpl(
TBacktrace backtrace,
- const std::function<void(TStringBuf)>& frameCallback)
+ const std::function<void(TStringBuf)>& writeCallback)
{
for (int i = 0; i < std::ssize(backtrace); ++i) {
TRawFormatter<1024> formatter;
@@ -104,10 +104,10 @@ Y_WEAK void SymbolizeBacktrace(
formatter.AppendNumber(i + 1, 10, 2);
formatter.AppendString(". ");
DumpStackFrameInfo(&formatter, backtrace[i]);
- frameCallback(formatter.GetBuffer());
+ writeCallback(formatter.GetBuffer());
}
}
////////////////////////////////////////////////////////////////////////////////
-} // namespace NYT::NBacktrace
+} // namespace NYT::NBacktrace::NDetail