SL-17077 Ensure profiling is disabled if gpu_benchmark fails. Log the source of the real crash for when the viewer inevitably crashes later.

master
Dave Parks 2022-03-25 13:05:50 -05:00
parent 96178e689b
commit 9b2df75c87
2 changed files with 12 additions and 1 deletions

View File

@ -97,6 +97,11 @@ static const U32 STATUS_MSC_EXCEPTION = 0xE06D7363; // compiler specific
U32 msc_exception_filter(U32 code, struct _EXCEPTION_POINTERS *exception_infop)
{
const auto stack = to_string(boost::stacktrace::stacktrace());
LL_WARNS() << "SEH Exception handled (that probably shouldn't be): Code " << code
<< "\n Stack trace: \n"
<< stack << LL_ENDL;
if (code == STATUS_MSC_EXCEPTION)
{
// C++ exception, go on

View File

@ -381,7 +381,10 @@ F32 gpu_benchmark();
F32 logExceptionBenchmark()
{
// Todo: make a wrapper/class for SEH exceptions
// FIXME: gpu_benchmark uses many C++ classes on the stack to control state.
// SEH exceptions with our current exception handling options do not call
// destructors for these classes, resulting in an undefined state should
// this handler be invoked.
F32 gbps = -1;
__try
{
@ -389,6 +392,9 @@ F32 logExceptionBenchmark()
}
__except (msc_exception_filter(GetExceptionCode(), GetExceptionInformation()))
{
// HACK - ensure that profiling is disabled
LLGLSLShader::finishProfile(false);
// convert to C++ styled exception
char integer_string[32];
sprintf(integer_string, "SEH, code: %lu\n", GetExceptionCode());