summaryrefslogtreecommitdiffstats
path: root/util/generic/yexception.cpp
diff options
context:
space:
mode:
authorsvkrasnov <[email protected]>2022-02-15 13:44:41 +0300
committersvkrasnov <[email protected]>2022-02-15 13:44:41 +0300
commit19819502b97c522946fb88cacc5c7ea42a6dbec8 (patch)
tree3d9b598232d4e5bfda2f02a9218d67c60cd798c6 /util/generic/yexception.cpp
parent441ade95e65652a8c592dfa3a88c14cddcf137f6 (diff)
IGNIETFERRO-1975, BIGRT-39: add TBackTrace::FromCurrentException() to CurrentExceptionMessage()
support TBackTrace::FromCurrentException() in CurrentExceptionMessage() ref:ca43c6538722fc9d169d92f85395093a21136884
Diffstat (limited to 'util/generic/yexception.cpp')
-rw-r--r--util/generic/yexception.cpp30
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 (...) {
}