st/oxr: Add a debug option to break/trap on error.

Might be useful for debugging, since once the consuming call has returned,
you've lost most of the context of what led to the error.
This commit is contained in:
Ryan Pavlik 2019-04-04 17:57:12 -05:00 committed by Jakob Bornecrantz
parent d7850f2c79
commit 891eb7f1c4

View file

@ -16,8 +16,13 @@
#include "oxr_objects.h" #include "oxr_objects.h"
#include "oxr_logger.h" #include "oxr_logger.h"
#ifdef _MSC_VER
// needed for __debugbreak()
#include <intrin.h>
#endif // _MSC_VER
DEBUG_GET_ONCE_BOOL_OPTION(entrypoints, "OXR_DEBUG_ENTRYPOINTS", false) DEBUG_GET_ONCE_BOOL_OPTION(entrypoints, "OXR_DEBUG_ENTRYPOINTS", false)
DEBUG_GET_ONCE_BOOL_OPTION(break_on_error, "OXR_BREAK_ON_ERROR", false)
static const char * static const char *
oxr_result_to_string(XrResult result); oxr_result_to_string(XrResult result);
@ -85,12 +90,22 @@ oxr_error(struct oxr_logger *logger, XrResult result, const char *fmt, ...)
fprintf(stderr, " in %s", logger->api_func_name); fprintf(stderr, " in %s", logger->api_func_name);
} }
fprintf(stderr, ": ");
va_list args; va_list args;
va_start(args, fmt); va_start(args, fmt);
vfprintf(stderr, fmt, args); vfprintf(stderr, fmt, args);
va_end(args); va_end(args);
fprintf(stderr, "\n"); fprintf(stderr, "\n");
if (debug_get_bool_option_break_on_error()) {
/// Trigger a debugger breakpoint.
#ifdef _MSC_VER
__debugbreak();
#else
__builtin_trap();
#endif
}
return result; return result;
} }