summaryrefslogtreecommitdiff
path: root/indra/llcommon/llexception.cpp
diff options
context:
space:
mode:
authorErik Kundiman <erik@megapahit.org>2025-06-03 16:20:27 +0800
committerErik Kundiman <erik@megapahit.org>2025-06-03 16:20:27 +0800
commit9bae19198fdc7bfb71f900cfe6c1982cb2a80e4f (patch)
tree498aadebb88733f10bb0374eef5dee781d985339 /indra/llcommon/llexception.cpp
parent08d4f307b0c2281f5aa4a11329c6c6e8c625e6ea (diff)
Revert "Fix up llexception.h's cross-platform SEH wrapper."
This reverts commit 5ed8df22cd59680a685c4ada7daa5555bf59d4fe.
Diffstat (limited to 'indra/llcommon/llexception.cpp')
-rw-r--r--indra/llcommon/llexception.cpp24
1 files changed, 16 insertions, 8 deletions
diff --git a/indra/llcommon/llexception.cpp b/indra/llcommon/llexception.cpp
index 107fdc2b2d..74b33f1e3b 100644
--- a/indra/llcommon/llexception.cpp
+++ b/indra/llcommon/llexception.cpp
@@ -101,36 +101,44 @@ void annotate_exception_(boost::exception& exc)
static constexpr U32 STATUS_MSC_EXCEPTION = 0xE06D7363; // compiler specific
static constexpr U32 STATUS_STACK_FULL = 0xC00000FD;
-void LL::seh::fill_stacktrace(std::string& stacktrace, U32 code)
+U32 ll_seh_filter(
+ std::string& stacktrace,
+ std::function<U32(U32, struct _EXCEPTION_POINTERS*)> filter,
+ U32 code,
+ struct _EXCEPTION_POINTERS* exception_infop)
{
- // Sadly, despite its diagnostic importance, trying to capture a
- // stacktrace when the stack is already blown only terminates us faster.
+ // By the time the handler gets control, the stack has been unwound,
+ // so report the stack trace now at filter() time.
+ // Even though stack overflow is a problem we would very much like to
+ // diagnose, calling another function when the stack is already blown only
+ // terminates us faster.
if (code == STATUS_STACK_FULL)
{
stacktrace = "(stack overflow, no traceback)";
}
else
{
- stacktrace = to_string(boost::stacktrace::stacktrace());
+ stacktrace = boost::stacktrace::stacktrace().to_string();
}
+
+ return filter(code, exception_infop);
}
-U32 LL::seh::common_filter(U32 code, struct _EXCEPTION_POINTERS*)
+U32 seh_filter(U32 code, struct _EXCEPTION_POINTERS*)
{
if (code == STATUS_MSC_EXCEPTION)
{
- // C++ exception, don't stop at this handler
+ // C++ exception, go on
return EXCEPTION_CONTINUE_SEARCH;
}
else
{
// This is a non-C++ exception, e.g. hardware check.
- // Pass control into the handler block.
return EXCEPTION_EXECUTE_HANDLER;
}
}
-void LL::seh::rethrow(U32 code, const std::string& stacktrace)
+void seh_rethrow(U32 code, const std::string& stacktrace)
{
std::ostringstream out;
out << "Windows exception 0x" << std::hex << code;