intptr_t DefaultAssertionHandler(intptr_t /*userParameter*/, const char* title, const char* message) { if(OVRIsDebuggerPresent()) { OVR_DEBUG_BREAK; } else { #if defined(OVR_BUILD_DEBUG) // Print a stack trace of all threads. OVR::String s; OVR::String threadListOutput; static OVR::SymbolLookup symbolLookup; s = "Failure: "; s += message; if(symbolLookup.Initialize() && symbolLookup.ReportThreadCallstack(threadListOutput, 4)) // This '4' is there to skip our internal handling and retrieve starting at the assertion location (our caller) only. { s += "\r\n\r\n"; s += threadListOutput; } OVR::Util::DisplayMessageBox(title, s.ToCStr()); #else OVR::Util::DisplayMessageBox(title, message); #endif } return 0; }
intptr_t DefaultAssertionHandler(intptr_t /*userParameter*/, const char* title, const char* message) { if(OVRIsDebuggerPresent()) { OVR_DEBUG_BREAK; } else { OVR_UNUSED(title); OVR_UNUSED(message); #if defined(OVR_BUILD_DEBUG) if(Allocator::GetInstance()) // The code below currently depends on having a valid Allocator. { // Print a stack trace of all threads. OVR::String s; OVR::String threadListOutput; static OVR::SymbolLookup symbolLookup; s = "Failure: "; s += message; if(symbolLookup.Initialize() && symbolLookup.ReportThreadCallstack(threadListOutput, 4)) // This '4' is there to skip our internal handling and retrieve starting at the assertion location (our caller) only. { // threadListOutput has newlines that are merely \n, whereas Windows MessageBox wants \r\n newlines. So we insert \r in front of all \n. for(size_t i = 0, iEnd = threadListOutput.GetSize(); i < iEnd; i++) { if(threadListOutput[i] == '\n') { threadListOutput.Insert("\r", i, 1); ++i; ++iEnd; } } s += "\r\n\r\n"; s += threadListOutput; } OVR::Util::DisplayMessageBox(title, s.ToCStr()); } else { OVR::Util::DisplayMessageBox(title, message); } #else OVR::Util::DisplayMessageBox(title, message); #endif } return 0; }