diff options
| author | Andrey Kleshchev <andreykproductengine@lindenlab.com> | 2022-02-11 20:26:00 +0200 | 
|---|---|---|
| committer | Andrey Kleshchev <andreykproductengine@lindenlab.com> | 2022-02-11 20:28:42 +0200 | 
| commit | 236593e997e931580d3bd3192b12e450c8054b07 (patch) | |
| tree | 204d4c10a543c5ea7ceed92c38e55dd20fba5643 | |
| parent | 6f49893fb313d0099900a347cac251f8b7bde40e (diff) | |
Revert "SL-14961 Coroutine crash was not reported to bugsplat"
Will be replaced with retrow from nat
| -rw-r--r-- | indra/llcommon/llapp.h | 4 | ||||
| -rw-r--r-- | indra/llcommon/llcoros.cpp | 56 | ||||
| -rw-r--r-- | indra/llcommon/llcoros.h | 7 | ||||
| -rw-r--r-- | indra/newview/llappviewerwin32.cpp | 10 | ||||
| -rw-r--r-- | indra/newview/llappviewerwin32.h | 2 | 
5 files changed, 19 insertions, 60 deletions
diff --git a/indra/llcommon/llapp.h b/indra/llcommon/llapp.h index c65fe21c9c..b9ae49aa44 100644 --- a/indra/llcommon/llapp.h +++ b/indra/llcommon/llapp.h @@ -286,10 +286,6 @@ public:  	  */  	LLRunner& getRunner() { return mRunner; } -#ifdef LL_WINDOWS -    virtual void reportCrashToBugsplat(void* pExcepInfo /*EXCEPTION_POINTERS*/) { } -#endif -  public:  	typedef std::map<std::string, std::string> string_map;  	string_map mOptionMap;	// Contains all command-line options and arguments in a map diff --git a/indra/llcommon/llcoros.cpp b/indra/llcommon/llcoros.cpp index 75fc0fec99..6a534951ff 100644 --- a/indra/llcommon/llcoros.cpp +++ b/indra/llcommon/llcoros.cpp @@ -264,21 +264,8 @@ std::string LLCoros::launch(const std::string& prefix, const callable_t& callabl  static const U32 STATUS_MSC_EXCEPTION = 0xE06D7363; // compiler specific -U32 cpp_exception_filter(U32 code, struct _EXCEPTION_POINTERS *exception_infop, const std::string& name) +U32 exception_filter(U32 code, struct _EXCEPTION_POINTERS *exception_infop)  { -    // C++ exceptions were logged in toplevelTryWrapper, but not SEH -    // log SEH exceptions here, to make sure it gets into bugsplat's  -    // report and because __try won't allow std::string operations -    if (code != STATUS_MSC_EXCEPTION) -    { -        LL_WARNS() << "SEH crash in " << name << ", code: " << code << LL_ENDL; -    } -    // Handle bugsplat here, since GetExceptionInformation() can only be -    // called from within filter for __except(filter), not from __except's {} -    // Bugsplat should get all exceptions, C++ and SEH -    LLApp::instance()->reportCrashToBugsplat(exception_infop); - -    // Only convert non C++ exceptions.      if (code == STATUS_MSC_EXCEPTION)      {          // C++ exception, go on @@ -291,29 +278,29 @@ U32 cpp_exception_filter(U32 code, struct _EXCEPTION_POINTERS *exception_infop,      }  } -void LLCoros::winlevel(const std::string& name, const callable_t& callable) +void LLCoros::winlevel(const callable_t& callable)  {      __try      { -        toplevelTryWrapper(name, callable); +        callable();      } -    __except (cpp_exception_filter(GetExceptionCode(), GetExceptionInformation(), name)) +    __except (exception_filter(GetExceptionCode(), GetExceptionInformation()))      { -        // convert to C++ styled exception for handlers other than bugsplat +        // convert to C++ styled exception          // Note: it might be better to use _se_set_translator          // if you want exception to inherit full callstack -        // -        // in case of bugsplat this will get to exceptionTerminateHandler and -        // looks like fiber will terminate application after that          char integer_string[512]; -        sprintf(integer_string, "SEH crash in %s, code: %lu\n", name.c_str(), GetExceptionCode()); +        sprintf(integer_string, "SEH, code: %lu\n", GetExceptionCode());          throw std::exception(integer_string);      }  }  #endif -void LLCoros::toplevelTryWrapper(const std::string& name, const callable_t& callable) +// Top-level wrapper around caller's coroutine callable. +// Normally we like to pass strings and such by const reference -- but in this +// case, we WANT to copy both the name and the callable to our local stack! +void LLCoros::toplevel(std::string name, callable_t callable)  {      // keep the CoroData on this top-level function's stack frame      CoroData corodata(name); @@ -323,12 +310,16 @@ void LLCoros::toplevelTryWrapper(const std::string& name, const callable_t& call      // run the code the caller actually wants in the coroutine      try      { +#if LL_WINDOWS && LL_RELEASE_FOR_DOWNLOAD +        winlevel(callable); +#else          callable(); +#endif      }      catch (const Stop& exc)      {          LL_INFOS("LLCoros") << "coroutine " << name << " terminating because " -            << exc.what() << LL_ENDL; +                            << exc.what() << LL_ENDL;      }      catch (const LLContinueError&)      { @@ -341,25 +332,10 @@ void LLCoros::toplevelTryWrapper(const std::string& name, const callable_t& call      {          // Any OTHER kind of uncaught exception will cause the viewer to          // crash, hopefully informatively. -        LOG_UNHANDLED_EXCEPTION(STRINGIZE("coroutine " << name)); -        // to not modify callstack -        throw; +        CRASH_ON_UNHANDLED_EXCEPTION(STRINGIZE("coroutine " << name));      }  } -// Top-level wrapper around caller's coroutine callable. -// Normally we like to pass strings and such by const reference -- but in this -// case, we WANT to copy both the name and the callable to our local stack! -void LLCoros::toplevel(std::string name, callable_t callable) -{ -#if LL_WINDOWS -    // Can not use __try in functions that require unwinding, so use one more wrapper -    winlevel(name, callable); -#else -    toplevelTryWrapper(name, callable); -#endif -} -  //static  void LLCoros::checkStop()  { diff --git a/indra/llcommon/llcoros.h b/indra/llcommon/llcoros.h index a94cfca19f..51f7380def 100644 --- a/indra/llcommon/llcoros.h +++ b/indra/llcommon/llcoros.h @@ -292,12 +292,11 @@ public:  private:      std::string generateDistinctName(const std::string& prefix) const; -#if LL_WINDOWS -    void winlevel(const std::string& name, const callable_t& callable); -#endif -    void toplevelTryWrapper(const std::string& name, const callable_t& callable);      void toplevel(std::string name, callable_t callable);      struct CoroData; +#if LL_WINDOWS +    static void winlevel(const callable_t& callable); +#endif      static CoroData& get_CoroData(const std::string& caller);      S32 mStackSize; diff --git a/indra/newview/llappviewerwin32.cpp b/indra/newview/llappviewerwin32.cpp index ee533875b6..6a504bbdbd 100644 --- a/indra/newview/llappviewerwin32.cpp +++ b/indra/newview/llappviewerwin32.cpp @@ -708,16 +708,6 @@ bool LLAppViewerWin32::cleanup()  	return result;  } -void LLAppViewerWin32::reportCrashToBugsplat(void* pExcepInfo) -{ -#if defined(LL_BUGSPLAT) -    if (sBugSplatSender) -    { -        sBugSplatSender->createReport((EXCEPTION_POINTERS*)pExcepInfo); -    } -#endif // LL_BUGSPLAT -} -  void LLAppViewerWin32::initLoggingAndGetLastDuration()  {  	LLAppViewer::initLoggingAndGetLastDuration(); diff --git a/indra/newview/llappviewerwin32.h b/indra/newview/llappviewerwin32.h index 82b6b0c77c..3e3fc55151 100644 --- a/indra/newview/llappviewerwin32.h +++ b/indra/newview/llappviewerwin32.h @@ -43,8 +43,6 @@ public:  	bool init() override; // Override to do application initialization      bool cleanup() override; -    void reportCrashToBugsplat(void* pExcepInfo) override; -  protected:  	void initLoggingAndGetLastDuration() override; // Override to clean stack_trace info.  	void initConsole() override; // Initialize OS level debugging console.  | 
