diff options
author | Graham Madarasz <graham@lindenlab.com> | 2013-06-07 12:50:02 -0700 |
---|---|---|
committer | Graham Madarasz <graham@lindenlab.com> | 2013-06-07 12:50:02 -0700 |
commit | c60eac25e5f1655e2c1d2c7ed2680da39db07f51 (patch) | |
tree | 2d36cdf48bd0e01e0cc01503ceca02c8016c8b7f /indra/llcommon | |
parent | 3a4d72f8d993656a566847f1bb3cc9ad8ab9b398 (diff) | |
parent | bc6070bd197159dd81750d1e2e8af493864be818 (diff) |
Merge MAINT-2740 crash fix
Diffstat (limited to 'indra/llcommon')
-rwxr-xr-x | indra/llcommon/llerror.cpp | 27 | ||||
-rwxr-xr-x | indra/llcommon/llerror.h | 13 |
2 files changed, 35 insertions, 5 deletions
diff --git a/indra/llcommon/llerror.cpp b/indra/llcommon/llerror.cpp index 9b0141eb76..d2af004cde 100755 --- a/indra/llcommon/llerror.cpp +++ b/indra/llcommon/llerror.cpp @@ -201,10 +201,7 @@ namespace { virtual void recordMessage(LLError::ELevel level, const std::string& message) { - llutf16string utf16str = - wstring_to_utf16str(utf8str_to_wstring(message)); - utf16str += '\n'; - OutputDebugString(utf16str.c_str()); + LL_WINDOWS_OUTPUT_DEBUG(message); } }; #endif @@ -1401,5 +1398,27 @@ namespace LLError { sIndex = 0 ; } + +#if LL_WINDOWS + void LLOutputDebugUTF8(const std::string& s) + { + // Be careful when calling OutputDebugString as it throws DBG_PRINTEXCEPTION_C + // which works just fine under the windows debugger, but can cause users who + // have enabled SEHOP exception chain validation to crash due to interactions + // between the Win 32-bit exception handling and boost coroutine fiber stacks. BUG-2707 + // + if (IsDebuggerPresent()) + { + // Need UTF16 for Unicode OutputDebugString + // + if (s.size()) + { + OutputDebugString(utf8str_to_utf16str(s).c_str()); + OutputDebugString(TEXT("\n")); + } + } + } +#endif + } diff --git a/indra/llcommon/llerror.h b/indra/llcommon/llerror.h index b65b410153..0b723aeb5d 100755 --- a/indra/llcommon/llerror.h +++ b/indra/llcommon/llerror.h @@ -34,7 +34,6 @@ #include "llerrorlegacy.h" #include "stdtypes.h" - /** Error Logging Facility Information for most users: @@ -199,8 +198,20 @@ namespace LLError static void clear() ; static void end(std::ostringstream* _out) ; }; + +#if LL_WINDOWS + void LLOutputDebugUTF8(const std::string& s); +#endif + } +#if LL_WINDOWS + // Macro accepting a std::string for display in windows debugging console + #define LL_WINDOWS_OUTPUT_DEBUG(a) LLError::LLOutputDebugUTF8(a) +#else + #define LL_WINDOWS_OUTPUT_DEBUG(a) +#endif + //this is cheaper than llcallstacks if no need to output other variables to call stacks. #define llpushcallstacks LLError::LLCallStacks::push(__FUNCTION__, __LINE__) #define llcallstacks \ |