diff options
| author | AndreyL ProductEngine <alihatskiy@productengine.com> | 2017-11-16 22:59:55 +0200 | 
|---|---|---|
| committer | AndreyL ProductEngine <alihatskiy@productengine.com> | 2017-11-16 22:59:55 +0200 | 
| commit | e8818a3677f8af440456abec77cf31e7621fb9fa (patch) | |
| tree | bc133fdc31e8600eaf3d1ac4a707928c32cf1d57 | |
| parent | fadb3792caa5279d3521dcaad44a6211bfa4bfad (diff) | |
MAINT-8154 Disabled exception handling in LLAppViewer::frame() to get proper call stacks
| -rw-r--r-- | indra/newview/llappviewer.cpp | 94 | ||||
| -rw-r--r-- | indra/newview/llappviewer.h | 4 | ||||
| -rw-r--r-- | indra/newview/llfloatermemleak.cpp | 7 | 
3 files changed, 49 insertions, 56 deletions
| diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 3f4a111a9a..cbe3af5c76 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -359,6 +359,8 @@ BOOL gCrashOnStartup = FALSE;  BOOL gLLErrorActivated = FALSE;  BOOL gLogoutInProgress = FALSE; +BOOL gSimulateMemLeak = FALSE; +  ////////////////////////////////////////////////////////////  // Internal globals... that should be removed.  static std::string gArgs; @@ -1326,6 +1328,35 @@ LLTrace::BlockTimerStatHandle FTM_FRAME("Frame");  bool LLAppViewer::frame()  { +	bool ret = false; + +	if (gSimulateMemLeak) +	{ +		try +		{ +			ret = doFrame(); +		} +		catch (std::bad_alloc) +		{ +			LLMemory::logMemoryInfo(TRUE); +			LLFloaterMemLeak* mem_leak_instance = LLFloaterReg::findTypedInstance<LLFloaterMemLeak>("mem_leaking"); +			if (mem_leak_instance) +			{ +				mem_leak_instance->stop(); +			} +			LL_WARNS() << "Bad memory allocation in LLAppViewer::frame()!" << LL_ENDL; +		} +	} +	else +	{  +		ret = doFrame(); +	} + +	return ret; +} + +bool LLAppViewer::doFrame() +{  	LLEventPump& mainloop(LLEventPumps::instance().obtain("mainloop"));  	LLSD newFrame; @@ -1346,7 +1377,6 @@ bool LLAppViewer::frame()  	//check memory availability information  	checkMemory() ; -	try  	{  		pingMainloopTimeout("Main:MiscNativeWindowEvents"); @@ -1370,12 +1400,15 @@ bool LLAppViewer::frame()  		}  		//memory leaking simulation -		LLFloaterMemLeak* mem_leak_instance = -			LLFloaterReg::findTypedInstance<LLFloaterMemLeak>("mem_leaking"); -		if(mem_leak_instance) +		if (gSimulateMemLeak)  		{ -			mem_leak_instance->idle() ;				 -		}							 +			LLFloaterMemLeak* mem_leak_instance = +				LLFloaterReg::findTypedInstance<LLFloaterMemLeak>("mem_leaking"); +			if (mem_leak_instance) +			{ +				mem_leak_instance->idle(); +			} +		}  		// canonical per-frame event  		mainloop.post(newFrame); @@ -1550,60 +1583,13 @@ bool LLAppViewer::frame()  			pingMainloopTimeout("Main:End");  		}  	} -	catch (const LLContinueError&) -	{ -		LOG_UNHANDLED_EXCEPTION(""); -	} -	catch(std::bad_alloc) -	{ -		LLMemory::logMemoryInfo(TRUE) ; - -		//stop memory leaking simulation -		LLFloaterMemLeak* mem_leak_instance = -			LLFloaterReg::findTypedInstance<LLFloaterMemLeak>("mem_leaking"); -		if(mem_leak_instance) -		{ -			mem_leak_instance->stop() ; -			LL_WARNS() << "Bad memory allocation in LLAppViewer::frame()!" << LL_ENDL ; -		} -		else -		{ -			//output possible call stacks to log file. -			LLError::LLCallStacks::print() ; - -			LL_ERRS() << "Bad memory allocation in LLAppViewer::frame()!" << LL_ENDL ; -		} -	} -	catch (...) -	{ -		CRASH_ON_UNHANDLED_EXCEPTION(""); -	}  	if (LLApp::isExiting())  	{  		// Save snapshot for next time, if we made it through initialization  		if (STATE_STARTED == LLStartUp::getStartupState())  		{ -			try -			{ -				saveFinalSnapshot(); -			} -			catch(std::bad_alloc) -			{ -				LL_WARNS() << "Bad memory allocation when saveFinalSnapshot() is called!" << LL_ENDL ; - -				//stop memory leaking simulation -				LLFloaterMemLeak* mem_leak_instance = -				LLFloaterReg::findTypedInstance<LLFloaterMemLeak>("mem_leaking"); -				if(mem_leak_instance) -				{ -					mem_leak_instance->stop() ; -				} -			} -			catch (...) -			{ -				CRASH_ON_UNHANDLED_EXCEPTION("saveFinalSnapshot()"); -			} +			saveFinalSnapshot();  		}  		delete gServicePump; diff --git a/indra/newview/llappviewer.h b/indra/newview/llappviewer.h index 52d2bce42b..6ea0273874 100644 --- a/indra/newview/llappviewer.h +++ b/indra/newview/llappviewer.h @@ -223,6 +223,8 @@ protected:  private: +	bool doFrame(); +  	void initMaxHeapSize();  	bool initThreads(); // Initialize viewer threads, return false on failure.  	bool initConfiguration(); // Initialize settings from the command line/config file. @@ -414,4 +416,6 @@ extern LLUUID gBlackSquareID;  extern BOOL gRandomizeFramerate;  extern BOOL gPeriodicSlowFrame; +extern BOOL gSimulateMemLeak; +  #endif // LL_LLAPPVIEWER_H diff --git a/indra/newview/llfloatermemleak.cpp b/indra/newview/llfloatermemleak.cpp index 9edfe1e354..c43526acaf 100644 --- a/indra/newview/llfloatermemleak.cpp +++ b/indra/newview/llfloatermemleak.cpp @@ -42,6 +42,8 @@ U32 LLFloaterMemLeak::sTotalLeaked = 0 ;  S32 LLFloaterMemLeak::sStatus = LLFloaterMemLeak::STOP ;  BOOL LLFloaterMemLeak::sbAllocationFailed = FALSE ; +extern BOOL gSimulateMemLeak; +  LLFloaterMemLeak::LLFloaterMemLeak(const LLSD& key)  	: LLFloater(key)  { @@ -104,6 +106,7 @@ void LLFloaterMemLeak::release()  	sStatus = STOP ;  	sTotalLeaked = 0 ;  	sbAllocationFailed = FALSE ; +	gSimulateMemLeak = FALSE;  }  void LLFloaterMemLeak::stop() @@ -140,8 +143,7 @@ void LLFloaterMemLeak::idle()  	}  	if(!p)  	{ -		sStatus = STOP ; -		sbAllocationFailed = TRUE ; +		stop();  	}  } @@ -181,6 +183,7 @@ void LLFloaterMemLeak::onChangeMaxMemLeaking()  void LLFloaterMemLeak::onClickStart()  {  	sStatus = START ; +	gSimulateMemLeak = TRUE;  }  void LLFloaterMemLeak::onClickStop() | 
