diff options
| author | babenko <[email protected]> | 2025-09-27 16:10:26 +0300 |
|---|---|---|
| committer | babenko <[email protected]> | 2025-09-27 16:30:32 +0300 |
| commit | 055c3c8b4a5f47044fa04e4f5b71968f6d9e29de (patch) | |
| tree | a16ae15d1102920e4976138db0c8a2e4eadbe701 /library/cpp | |
| parent | 797030c5c49cc061a859059dcda5621c31f9f451 (diff) | |
Fix SymbolizeBacktrace mess
commit_hash:18426181c7e415f097e4d8c2378753768fa3628d
Diffstat (limited to 'library/cpp')
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 |
