/// Âü°í ¹× º¯Çü http://serious-code.net/moin.cgi/MiniDump /// http://www.codeproject.com/threads/StackWalker.asp #pragma once #ifndef _WINDOWS_ #include #endif //////////////////////////////////////////////////////////////////////////////// /// \class cMiniDump /// \brief ¹Ì´Ï ´ýÇÁ¸¦ ½ÇÇàÇϱâ À§ÇÑ Å¬·¡½º. Ưº°È÷ ¾î¶² ´çÀ§¼ºÀÌ À־ ¸¸µç /// Ŭ·¡½º´Â ¾Æ´Ï°í, Á¤Àû º¯¼ö¿Í ÇÔ¼ö¸¦ °¡Áö°í ÀÖ±â À§ÇØ ¸¸µç ³×ÀÓ ½ºÆäÀ̽º /// ¿ªÇÒ Å¬·¡½ºÀÌ´Ù. /// /// ´ýÇÁÀÇ ÃʱâÈ­´Â Install ÇÔ¼ö¸¦ ÅëÇØ ÀÌ·ç¾îÁø´Ù. ÇÁ·Î±×·¥ ½ÃÀÛ ºÎºÐ ¾Æ¹« /// °÷¿¡¼­³ª cMiniDump::Install(...) ÇÔ¼ö¸¦ È£ÃâÇØÁÖ¸é µÈ´Ù. /// ///
/// int main()
/// {
///     ...
///     cMiniDump::Install(cMiniDump::DUMP_LEVEL_LIGHT);
///     ...
/// }
/// 
/// /// GUI¸¦ »ç¿ëÇÒ ¼ö ÀÖ´Â ÇÁ·Î±×·¥ÀÇ °æ¿ì, »ç¿ëÀÚ¿¡°Ô ´ýÇÁ ÆÄÀÏ »ý¼º ¿©ºÎ¸¦ ¹¯´Â /// °Íµµ ±¦Âú´Ù°í »ý°¢Çؼ­, ´ëȭâ Äݹé ÇÔ¼ö¸¦ Çϳª Áý¾î ³Ö¾ú´Ù. Install ÇÔ¼ö¸¦ /// ÅëÇØ ´ëȭâ Äݹé ÇÔ¼ö¸¦ ¼³Á¤Çϸé, ´ýÇÁ »ý¼º½Ã À̸¦ È®ÀÎÇØ ¸ÕÀú ´ëȭâÀ» /// ¶ç¿î´Ù. ´ëȭâÀÌ IDOK·Î ³¡³ª¸é, ´ýÇÁ ÆÄÀÏÀ» »ý¼ºÇϰí, ±×¿ÜÀÇ °ªÀ¸·Î ³¡³ª¸é /// ´ýÇÁ ÆÄÀÏÀ» »ý¼ºÇÏÁö ¾Ê´Â´Ù. ±âº»ÀûÀÎ ´ëȭâ ÇÔ¼ö¸¦ ±¸ÇöÇÏÀÚ¸é ´ëÃæ ¾Æ·¡¿Í /// °°À» °ÍÀÌ´Ù. /// ///
/// BOOL CALLBACK CrashDialogProc(
///     HWND hDlg, UINT iMessage, WPARAM wParam, LPARAM /*lParam*/)
/// {
///     RECT parent, dlg;
///     int x, y;
/// 
///     switch (iMessage)
///     {
///     case WM_INITDIALOG:
///         ::GetWindowRect(::GetForegroundWindow(), &parent);
///         ::GetWindowRect(hDlg, &dlg);
///         x = (parent.left + parent.right - dlg.right) / 2;
///         y = (parent.top + parent.bottom - dlg.bottom) / 2;
///         ::MoveWindow(hDlg, x, y, dlg.right, dlg.bottom, FALSE);
//          ...
///         return TRUE;
///     case WM_COMMAND:
///         switch (LOWORD(wParam))
///         {
///         case IDOK: EndDialog(hDlg, IDOK); break;
///         case IDCANCEL: EndDialog(hDlg, IDCANCEL); break;
///         default: break;
///         }
///         return FALSE;
///     default:
///         break;
///     }
/// 
///     return FALSE;
/// }
/// 
//////////////////////////////////////////////////////////////////////////////// class cMiniDump { public: /// ´ýÇÁÇÒ µ¥ÀÌÅÍÀÇ ¼öÁØ enum DumpLevel { DUMP_LEVEL_LIGHT, ///< MiniDumpNormalÀ» »ç¿ë DUMP_LEVEL_MEDIUM, ///< MiniDumpWithDataSegs¸¦ »ç¿ë DUMP_LEVEL_HEAVY ///< MiniDumpWithFullMemory¸¦ »ç¿ë }; private: static DumpLevel ms_DumpLevel; ///< ´ýÇÁ ·¹º§. static bool ms_AddTimeStamp; ///< ³¯Â¥ ±â¹Ý ´ýÇÁ ÆÄÀÏ À̸§ »ç¿ë static TCHAR ms_AppName[_MAX_PATH]; ///< ´ýÇÁ ÆÄÀÏ À̸§ static TCHAR ms_CallStack[8192]; ///< ÄݽºÅà ¹®ÀÚ¿­ static TCHAR ms_Modules[8192]; ///< ¸ðµâ ¹®ÀÚ¿­ static LPCTSTR ms_DialogTemplate; ///< ´ëȭâ ÅÛÇø´ static DLGPROC ms_DialogProc; ///< ´ëȭâ ÇÁ·Î½ÃÁ® public: /// \brief ¹Ì´Ï ´ýÇÁ ±â´ÉÀ» ÃʱâÈ­ÇÑ´Ù. static void Install(DumpLevel dumpLevel, bool addTimestamp=true, LPCTSTR dialogTemplate=NULL, DLGPROC dialogProc=NULL); /// \brief ÄݽºÅà ¹®ÀÚ¿­À» ¹ÝȯÇÑ´Ù. static LPCTSTR GetCallStack() { return ms_CallStack; } /// \brief ¸ðµâ ¹®ÀÚ¿­À» ¹ÝȯÇÑ´Ù. static LPCTSTR GetModules() { return ms_Modules; } private: /// \brief ¿¹¿Ü¿¡ ´ëÇÑ Á¤º¸¸¦ ¹Þ¾Æ¼­, ¹Ì´Ï ´ýÇÁ ÆÄÀÏÀ» »ý¼ºÇÑ´Ù. static LONG WINAPI WriteDump(PEXCEPTION_POINTERS exPtrs); /// \brief »ý¼º ±ÝÁö cMiniDump() {} /// \brief º¹»ç »ý¼º ±ÝÁö cMiniDump(const cMiniDump&) {} /// \brief ´ëÀÔ ¿¬»ê ±ÝÁö cMiniDump& operator = (const cMiniDump&) { return *this; } }; /* #pragma once #ifndef __NONCOPYABLE_H__ #include "Noncopyable.h" #endif class cMiniDumper : private Noncopyable { public: /// \brief ´ýÇÁÇÒ µ¥ÀÌÅÍÀÇ ¼öÁØ enum DumpLevel { DUMP_LEVEL_0, ///< MiniDumpNormalÀ» »ç¿ë DUMP_LEVEL_1, ///< MiniDumpWithDataSegs¸¦ »ç¿ë DUMP_LEVEL_2 ///< MiniDumpWithFullMemory¸¦ »ç¿ë }; private: /// ´ýÇÁ ·¹º§. static DumpLevel ms_eDumpLevel; /// ´ýÇÁ ÆÄÀÏ À̸§¿¡´Ù°¡ ´ýÇÁ ÆÄÀÏÀÌ »ý¼ºµÈ ³¯Â¥¸¦ Áý¾î³Ö´Â°¡ÀÇ ¿©ºÎ. static BOOL ms_bAddTimeStamp; /// ´ýÇÁ ÆÄÀÏ À̸§ ¹®ÀÚ¿­. static TCHAR ms_acAppName[_MAX_PATH]; /// ´ýÇÁ°¡ ¹ß»ýÇÑ ÀÌÀ¯ static TCHAR ms_acFaultReason[2048]; public: /// \brief »ý¼ºÀÚ cMiniDumper(DumpLevel DL, BOOL bAddTimestamp=TRUE); /// \brief ¼Ò¸êÀÚ ~cMiniDumper(); private: /// \brief ¿¹¿Ü¿¡ ´ëÇÑ Á¤º¸¸¦ ¹Þ¾Æ¼­, ¹Ì´Ï ´ýÇÁ ÆÄÀÏÀ» »ý¼ºÇÑ´Ù. static LONG WINAPI TopLevelFilter(struct _EXCEPTION_POINTERS* pExPtrs); /// \brief ¿¹¿ÜÀÇ ¿øÀο¡ ´ëÇÑ ¹®ÀÚ¿­À» ¹ÝȯÇÑ´Ù. static LPCTSTR GetFaultReason(struct _EXCEPTION_POINTERS* pExPtrs); }; */