diff options
author | svkrasnov <[email protected]> | 2022-02-18 00:11:31 +0300 |
---|---|---|
committer | svkrasnov <[email protected]> | 2022-02-18 00:11:31 +0300 |
commit | 5d9b03f7d5e4d38860ff05886839b0224222da3e (patch) | |
tree | 85920b5ab330a7d9dab3ad6bf5c75d54d08a8bd1 /util/generic/yexception.cpp | |
parent | 59b572e5c9c4932e5d976212fc0ef905b1ec75b4 (diff) |
IGNIETFERRO-1975, BIGRT-39 [RESUBMIT]: add TBackTrace::FromCurrentException() to CurrentExceptionMessage()
ref:8d5b72512d2b80cfd1ae859a4175cc92cf32a99a
Diffstat (limited to 'util/generic/yexception.cpp')
-rw-r--r-- | util/generic/yexception.cpp | 30 |
1 files changed, 24 insertions, 6 deletions
diff --git a/util/generic/yexception.cpp b/util/generic/yexception.cpp index 26c75b5f51d..7bfed2878d0 100644 --- a/util/generic/yexception.cpp +++ b/util/generic/yexception.cpp @@ -14,21 +14,39 @@ TString FormatExc(const std::exception& exception) { return TString::Join(TStringBuf("("), TypeName(exception), TStringBuf(") "), exception.what()); } +static TString BackTraceToString(const TBackTrace& backtrace) { + try { + Y_ENSURE(backtrace.size() > 0, "backtrace is empty"); + return backtrace.PrintToString(); + } catch (const std::exception& e) { + return TString::Join("Failed to print backtrace: ", FormatExc(e)); + } +} + TString CurrentExceptionMessage() { auto exceptionPtr = std::current_exception(); if (exceptionPtr) { try { std::rethrow_exception(exceptionPtr); } catch (const yexception& e) { - const TBackTrace* bt = e.BackTrace(); - - if (bt) { - return TString::Join(bt->PrintToString(), TStringBuf("\n"), FormatExc(e)); + const TBackTrace* btPtr; +#ifdef _YNDX_LIBUNWIND_ENABLE_EXCEPTION_BACKTRACE + TBackTrace backtrace = TBackTrace::FromCurrentException(); + btPtr = &backtrace; +#else + btPtr = e.BackTrace(); + if (!btPtr) { + return FormatExc(e); } - - return FormatExc(e); +#endif + return TString::Join(BackTraceToString(*btPtr), TStringBuf("\n"), FormatExc(e)); } catch (const std::exception& e) { +#ifdef _YNDX_LIBUNWIND_ENABLE_EXCEPTION_BACKTRACE + TBackTrace backtrace = TBackTrace::FromCurrentException(); + return TString::Join(BackTraceToString(backtrace), TStringBuf("\n"), FormatExc(e)); +#else return FormatExc(e); +#endif } catch (...) { } |