/////////////////////////////////////////////////////////////////////// // Crash Handler / Win32 Application crash handling service. // Version 0.1 // // Note : Using Runtime library is MT and MTd //--------------------------------------------------------------------- // Built in Server Engine part, Research & Development, Webzen #ifndef __CrashHandler_H #define __CrashHandler_H #if !defined( _MT ) #error You must link against multi-threaded libraries when using CrashHandler. #endif #define EXCEPTION_FILTER LPTOP_LEVEL_EXCEPTION_FILTER //================================================================================================= /// ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ CrashµÈ »óȲÀ» Çڵ鸵ÇÏ¿© µð¹ö±ëÀÌ °¡´ÉÇϵµ·Ï °ü·Ã Á¤º¸¸¦ º¸°íÇÑ´Ù. /** @author Server Engine part, Research & Development, Webzen @since 2005. 2. 7 @remarks ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ Unhandled ExceptionÀ» ¹Þ¾Æ³»¾î ¿À·ù°¡ ¹ß»ýµÈ »óȲÀ» µð¹ö±ë ÇÒ ¼ö ÀÖµµ·Ï Code ¼öÁØÀÇ Á¤º¸¸¦ »ý¼ºÇÑ´Ù. Crash Handler´Â ÀÌ Á¤º¸¸¦ Stack trace¿Í Mini Dump µÎ °¡Áö·Î Á¦°øÇÑ´Ù. - Stack TraceÀÇ °æ¿ì, Text·Î ¹ÝȯµÇ¸ç CrashµÈ ´ç½Ã ÇÔ¼öÀÇ È£ÃâµÈ »óȲÀ» °£·«È÷ º¸¿©ÁØ´Ù. - Mini DumpÀÇ °æ¿ì, dmpÆÄÀÏ·Î ÀúÀåµÇ¸ç CrashµÈ ´ç½Ã Call stack ¹× °¢ º¯¼öµéÀÇ »óÅ µî ÀÚ¼¼ÇÑ Á¤º¸¸¦ Á¦°øÇÑ´Ù. ÀÌ °ÍÀº Visual Studio¸¦ ÅëÇØ µð¹ö±ëÀ» ÇÒ ¼ö ÀÖ´Ù. - CrashHandler.h¸¦ includeÇϱâ Àü¿¡ ¾Õ¼­ Windows.h¸¦ includeÇØ¾ß ÇÑ´Ù. @note - 1) ¿À·ù ¹ß»ý ¿©±â¿¡¼­ Á¤ÀÇÇÏ´Â ¿À·ù´Â Unhandled ExceptionÀÌ´Ù. ÀϹÝÀûÀ¸·Î SEH¸¦ »ç¿ëÇÏ¿© °¢Á¾ ¿¹¿Ü¸¦ ó¸®ÇÒ ¼ö ÀÖÁö¸¸ SEH°¡ Àû¿ëµÇÁö ¾ÊÀº Äڵ忡¼­ ¿À·ù°¡ ¹ß»ýÇÒ °æ¿ì ±× ¼öÁØ¿¡ µû¶ó O/S´Â ÀÀ¿ë ÇÁ·Î±×·¥ÀÇ µ¿ÀÛÀ» ¸ØÃß°í ÇÁ·Î¼¼½º¸¦ Á¾·áÇÑ´Ù. ¿À·ù·ÎºÎÅÍ ¹ß»ýµÈ ¿¹¿Ü¸¦ HandlingÇÏÁö ¾Ê¾Ò±â ¶§¹®ÀÌ´Ù. ÀÌó·³ ¿¹¿Ü¿¡ ´ëÇÑ Çڵ鸵À» ÇÏÁö ¸øÇØ ¹ß»ýÇÏ´Â ¿¹¿Ü¸¦ ¿À·ù·Î °¡Á¤ÇÑ´Ù. - 2) ȯ°æ ¼³Á¤ Crash Handler¸¦ »ç¿ëÇϱâ À§Çؼ­´Â Project SettingÀ» ¼³Á¤ÇØ¾ß ÇÑ´Ù. ÁÖÀÇÇØ¾ßÇÒ ºÎºÐÀº Release¿¡¼­µµ ÃÖÀûÈ­ ¿É¼ÇÀ» Disable·Î ¼³Á¤ÇؾßÇÑ´Ù´ÂÁ¡ÀÌ´Ù. Debugging Á¤º¸ÀÇ »ý¼ºÀ» À§Çؼ­ ÃÖÀûÈ­ ¿É¼ÇÀ» Æ÷±âÇϴµ¥, ¸¸ÀÏ ÃÖÀûÈ­ ¿É¼ÇÀÌ ²À ÇÊ¿äÇÏ´Ù¸é Crash Handler¿¡¼­´Â Á¤È®ÇÑ ¿À·ù¸¦ º¸°íÇÒ ¼ö ¾ø´Ù. - 3) ¼Óµµ ÀúÇÏ Crash Handler´Â ÇÁ·Î±×·¥ÀÌ µ¿ÀÛÇÏ´Â µ¿¾È °è¼Ó °¨½ÃÇϰí ÀÖÁö ¾Ê´Â´Ù. À̸§ ±×´ë·Î ¿À·ù¸¦ Çڵ鸵ÇÏ´Â ÀÛ¾÷ÀÌ¸ç ¸ð´ÏÅ͸µÀ» ÇÏÁö ¾Ê±â ¶§¹®¿¡ ÀÌ ¸ðµâÀ» »ç¿ëÇÏ´õ¶óµµ ÀÀ¿ëÇÁ·Î±×·¥¿¡ ¿µÇâÀ» ¹ÌÄ¡Áö¾Ê´Â´Ù. - 4) pdb ÆÄÀÏÀÇ ¹èÆ÷ Crash Handler´Â µð¹ö±ëÀ» À§ÇØ Debug ȤÀº Release¿¡¼­µµ pdb ÆÄÀÏÀ» ÇÊ¿ä·ÎÇÑ´Ù. ¿©±â¿¡¼­´Â ´ÙÀ½ µÎ °¡Áö »çÇ׿¡ À¯ÀÇÇØ¾ßÇÑ´Ù. 1. Stack Walker Stack WalkerÀÇ ÀÛ¾÷ÀÌ ¿äûµÈ ½ÃÁ¡¿¡¼­ ¼Ò½ºÄÚµå ¼öÁØÀÇ Call stackÀ» ±â·ÏÇÑ´Ù. ¶§¹®¿¡ ÀÀ¿ë ÇÁ·Î±×·¥À» ¹èÆ÷ÇÒ ¶§ pdb¸¦ ÇÔ²² ¹èÆ÷ÇØ¾ßÇÑ´Ù. 2. Mini Dump Mini DumpÀÇ ÀÛ¾÷ÀÌ ¿äûµÈ ½ÃÁ¡¿¡¼­ ´ÜÁö ¸Þ¸ð¸®¸¦ ¹é¾÷ ¹Þ´Â Á¤µµÀÇ ÀÛ¾÷À» ¼öÇàÇÑ´Ù. ´Ù½Ã¸»ÇØ Mini Dump¿¡´Â µð¹ö±ë Á¤º¸°¡ Æ÷ÇÔµÇÁö¾ÊÁö¸¸ ´ýÇÁÆÄÀÏÀÎ *.dmp ¸¦ »ç¿ëÇØ µð¹ö±ëÀ» ½ÃµµÇϱâ À§Çؼ­´Â pdbÆÄÀÏÀÌ ÇÊ¿äÇÏ´Ù. ÀÌ °ÍÀº End User°¡ µð¹ö±ëÀ» ½ÃµµÇÏÁö ¾Ê±â ¶§¹®¿¡ pdb¸¦ ¹èÆ÷ÇÒ Çʿ䰡 ¾øÀ½À» ÀǹÌÇÑ´Ù. * Mini Dump¿¡´Â Stack WalkerÀÇ ³»¿ëÀÌ Æ÷ÇԵǾîÀÖÀ¸¹Ç·Î ±»ÀÌ Stack Walker¸¦ »ç¿ëÇÒ Çʿ䰡 ¾ø´Ù. - 5) Run vs Debug Run ÇÁ·Î±×·¥À» ½ÇÇàÇÏ´Â ¹æ¹ýÀº Ctrl + F5( Run )°ú F5( Debug Run ), µÎ °¡Áö ¹æ¹ýÀÌ ÀÖ´Ù. Debug RunÀ¸·Î ½ÇÇàÇÒ °æ¿ì Top level exception filter¸¦ °³¹ß ȯ°æ(VC++)¿¡¼­ Â÷ÁöÇϱ⠶§¹®¿¡ CrashHandler´Â ½º½º·Î µ¿ÀÛÇÏÁö ¸øÇÑ´Ù. ÀÌ ¶§ CrashHandler¸¦ »ç¿ëÇϱâ À§Çؼ­ SEH¸¦ Á÷Á¢ »ç¿ëÇÏ¿© CrashHandler¸¦ È£ÃâÇÏ´Â ¹æ¹ýÀ» »ç¿ëÇØ¾ßÇÑ´Ù. */ //================================================================================================= class CrashHandler { public: typedef void ( *ProcResult )( LPCTSTR stackWalkLog, LPCTSTR dumpFileName ); typedef LPCTSTR ( *CallbackDmpName )(); public: static void Install( bool stackWalk, CallbackDmpName cb, ProcResult procResult ); static void Uninstall(); static LONG __stdcall HandleException( PEXCEPTION_POINTERS exceptionInfo ); private: CrashHandler() {} ~CrashHandler() {} static void GetExceptionCode( char* errorMsg, DWORD errorType ); static EXCEPTION_FILTER m_prevFilter; static bool m_stackWalk; static CallbackDmpName m_cbDmpName; static ProcResult m_procResult; }; #endif