SDC C-Project CF Review 프로그램
kojingeun
2023-07-14 f77e8008cac062596058fca2aeddda62b80bedbf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include <dbghelp.h>
 
//////////////////////////////////////////////////////////////////////////
//
// »ç¿ë¿¹:
//
// #include "selfdump.h"
//
// winmain()
// {
//        ...
//        // ´ë·« Ãʱ⿡...
//        CSelfDump::RegisterExectionFilter();    // <- ÄÚµå·Î ½ÇÇà
//        ..
// }
//
// È¤Àº
//
// CApp theApp;
// ...
// CSelfDump g_cSelfDump();    // <- Àü¿ª º¯¼ö·Î ½ÇÇà
// ..
//
// ==> ¸¸¾à, TestApp.exe¿¡¼­ Crash°¡ ¹ß»ýÇϸé, 
//     (ÆÄ¶ó¹ÌÅ͸¦ default °ªÀ¸·Î À§ ÄÚµå¿Í °°ÀÌ ÁöÁ¤ÇßÀ»¶§),
//
//        * TestApp.exe Path¿¡ Temp Æú´õ°¡ Àִ °æ¿ì, ¹Ì´Ï ´ýÇÁÀΠTestApp_yyyymmddhhmmssmmm.dmp°¡ »ý¼ºµÈ´Ù.
//        * TestApp.exe Path¿¡ Temp Æú´õ°¡ ¾ø´Â °æ¿ì, ´ýÇÁ¸¦ ³²±âÁö ¾Ê´Â´Ù.
//        * TestApp_*.dmpÀÇ Total ÆÄÀÏ Å©±â°¡ 1MB¸¦ ³Ñ¾î°¡¸é, °¡Àå ¿¾³¯²¯À» Áö¿ö¼­ ´ýÇÁ¸¦ ¸¸µé¾î Å©±â¸¦ À¯ÁöÇÑ´Ù.
//        * TestApp.exe PathÀÇ Temp Æú´õ¿¡ CrashDmp.log ÆÄÀÏ¿¡ ¿À·ù »çÇ×µéÀ» ±â·ÏÇÑ´Ù.
//        * XP/VistaÀΠ°æ¿ì, ±âÁ¸ÀÇ µð¹ö°Å·Îµµ ¿¬°áÀÌ µÈ´Ù. (drwtsn32, Problem Reports and Solutions Áö¿ø)
//
// (¾Ë¸²) minidump »ý¼ºÀ̹ǷÎ, !analyze -v Á¤µµ·Î »ç¿ëµÉ ¼ö ÀÖ´Ù.
// (¾Ë¸²) TestApp.exe°¡ User°èÁ¤¿¡¼­ ½ÇÇàµÉ ¼ö ÀÖÀ¸¹Ç·Î, Temp Æú´õ´Â everyone 777 ±ÇÇÑÀÌ Àִ°ÍÀÌ ÁÁÀ» °ÍÀÌ´Ù.
// (¾Ë¸²) CSelfDump ÇÔ¼ö±ºÀº Thread Safe º¸ÀåÀÌ ¾ø´Ù. µû¶ó¼­, .exe ½ÇÇà ÃʱâÈ­¶§ µÇµµ·Ï ´Ü Çѹø¸¸ È£ÃâÇϵµ·Ï ÇÑ´Ù.
// (¾Ë¸²) dbghelp.dllÀ» »ç¿ëÇϴµ¥, ½ÇÇà .exeÀÇ module path ´ÙÀ½ system32 path ¼ø¼­·Î LoadLibrary¸¦ ½ÃµµÇÑ´Ù.
//
//////////////////////////////////////////////////////////////////////////
 
//////////////////////////////////////////////////////////////////////////
//
// Parameter :
//
//    CSelfDump::CSelfDump(...) / CSelfDump::RegisterExectionFilter(...)
//    ÀÇ Argument¸¦ ¼³¸íÇÑ´Ù.
//
//    * lpszDumpPreFixName : ´ýÇÁÆÄÀÏÀÇ À̸§À» ÁöÁ¤ÇÑ´Ù. ÁöÁ¤µÇÁö ¾Ê´Â °æ¿ì, ½ÇÇà .exeÀÇ ÆÄÀϸíÀÌ µÈ´Ù.
//        ex) "abc"·Î ÁöÁ¤Çϴ °æ¿ì, abc_yyyymmddhhmmssmmm.dmp ÆÄÀϸíÀ¸·Î °­Á¦ ÁöÁ¤µÈ´Ù.
//
//    * nMiniDumpType : ´ýÇÁÆÄÀÏÀǠŸÀÔ ÁöÁ¤. ±âº»°ªÀº MiniDumpNormalÀÌ´Ù.
//        **) Å¸ÀÔÀº http://msdn.microsoft.com/en-us/library/ms680519(VS.85).aspx ¿¡¼­ Âü°íÇϽÿÀ.
//
//    * dwDumpCapacityBytes : PreFixNameÀ¸·Î ¸¸µé¾îÁø ´ýÇÁÆÄÀϵéÀÌ À¯ÁöµÉ ÆÄÀÏ Å©±â. ±âº»°ªÀº 1048576(1MB)ÀÌ´Ù.
//        **) ´ýÇÁ¸¦ ¸¸µé±â Àü¿¡ Å©±â¸¦ È®ÀÎÇÏ¿©, ³Ñ¾î°¡´Â °æ¿ì °¡Àå ¿¾³¯°ÍÀ» Â÷·Ê·Î Áö¿ö¼­ Å©±â¸¦ ÀÏÁ¤ÇϰԠÀ¯ÁöÇÑ´Ù.
//
//    * lpszDumpPath : ´ýÇÁÆÄÀÏÀ» »ý¼ºÇÒ Path. ±âº»°ªÀº .exeÀÇ Path ÇϺÎÀÇ Temp Æú´õÀÌ´Ù.
//        ex) ±âº»°ªÀΠ°æ¿ì, C:\ttt\abc.exe´Â C:\ttt\temp\abc_~~~~.dmp·Î ÀúÀåµÈ´Ù)
//
//    * pfnCallback / pfnUserData : ´ýÇÁÆÄÀÏÀ» ¸¸µé±â Àü¿¡ È£Ãâ¹ÞÀ» ¼ö Àִ callbackÀ» µî·Ï. ±âº»°ªÀº NULL
//        **) callback È£Ãâ¹Þ¾Æ UI¸¦ ¶ç¿ö ÁÙ ¼ö ÀÖ´Ù. FALSE¸¦ ¸®ÅÏÇϸ頴ýÇÁ¸¦ ³²±âÁö ¾Ê´Â´Ù.
//
//////////////////////////////////////////////////////////////////////////
 
//////////////////////////////////////////////////////////////////////////
//
// Tool :
//
//    * CSelfDump::SetMiniDumpTypeWhenExist(...)
//        **) nMiniDumpTypeÀ» ·¹Áö½ºÆ®¸® °ªÀ¸·Î ¼¼ÆÃÇÑ´Ù. (·¹Áö½ºÆ®¸® °ªÀÌ Àִ°æ¿ì¸¸ ÇØ´ç)
//        ex) CSelfDump::RegisterExectionFilter(..., MiniDumpScanMemory, ...);
//            CSelfDump::SetMiniDumpTypeWhenExist(TEXT("Sofware\....\Tmp", TEXT("minidumptype"));
//            ÀΠ°æ¿ì, ¸¸¾à ·¹Áö½ºÆ®¸®¿¡ °ªÀÌ ÀÖ´Ù¸é, MiniDumpScanMemory°ª¿¡¼­ ·¹Áö½ºÆ®¸® °ªÀ¸·Î º¯°æµÈ´Ù.
//            ¸¸¾à, ÇØ´ç °ªÀÌ (DWORD)-1ÀΠ°æ¿ì¿¡´Â, ´ýÇÁ¸¦ ³²±âÁö ¾Êµµ·Ï ¿¹¿Ü Ã³¸®µÇ¾ú´Ù.
//
//////////////////////////////////////////////////////////////////////////
 
// dbghelp.dll::MinuDumpWriteDump(...)ÀÇ prototype
typedef BOOL (WINAPI *LPFN_MinuDumpWriteDump)    (HANDLE                                hProcess, 
                                                 DWORD                                dwPid, 
                                                 HANDLE                                hFile, 
                                                 MINIDUMP_TYPE                        DumpType,
                                                 PMINIDUMP_EXCEPTION_INFORMATION    ExceptionParam,
                                                 PMINIDUMP_USER_STREAM_INFORMATION    UserStreamParam,
                                                 PMINIDUMP_CALLBACK_INFORMATION        CallbackParam);
 
// Crash ¹ß»ý¶§ È£ÃâµÇ´Â CallbackÀÇ Prototype
// FALSE¸¦ ¸®ÅÏÇϸé, ´ýÇÁ¸¦ ³²±âÁö ¾Ê´Â´Ù.
typedef BOOL (*pfnCbOnCrash)    (IN LPVOID lpUserData);
 
// Capacity¿¡ ¸ÂÃç ÆÄÀÏÀ» »èÁ¦Çϰí write dump ÇϹǷÎ, Total ¿ë·®Àº ÃÖ´ë (1MB + ¸¶Áö¸· Dump File Å©±â) °¡ µÉ¼ö ÀÖ´Ù.
#define DEFAULT_DUMP_CAPACITY    1048576    // 1MB
 
// ´ýÇÁ ÆÄÀÏ manage¸¦ À§ÇØ, ÇѲ¨¹ø¿¡ »èÁ¦µÉ ÆÄÀÏ °³¼ö
#define MAX_DEL_TRY_MANAGE        32
 
#define MAX_PATH_SELFDUMP        1024
 
class CSelfDump
{
    public:
        CSelfDump(IN LPCTSTR lpszDumpPreFixName = NULL, IN MINIDUMP_TYPE nMiniDumpType = MiniDumpNormal, IN DWORD dwDumpCapacityBytes = DEFAULT_DUMP_CAPACITY, IN LPCTSTR lpszDumpPath = NULL, IN pfnCbOnCrash pfnCallback = NULL, IN LPVOID lpUserData = NULL);
        virtual ~CSelfDump();
 
    public:
        static BOOL RegisterExceptionFilter        (IN LPCTSTR lpszDumpPreFixName = NULL, IN MINIDUMP_TYPE nMiniDumpType = MiniDumpNormal, IN DWORD dwDumpCapacityBytes = DEFAULT_DUMP_CAPACITY, IN LPCTSTR lpszDumpPath = NULL, IN pfnCbOnCrash pfnCallback = NULL, IN LPVOID lpUserData = NULL);
        static VOID SetMiniDumpTypeWhenExist    (IN LPCTSTR lpszRegKeyPath, IN LPCTSTR lpszValueName);
 
    private:
        static LONG WINAPI CbTopLevelExceptionFilter(struct _EXCEPTION_POINTERS *pExceptionInfo);
        static VOID        WriteLogFile            (IN LPCTSTR lpszPath, IN LPCTSTR lpszDumpFileFullPathName, IN PSYSTEMTIME pstTimeOccur, IN LPCTSTR lpszDumpPrefixName, IN BOOL bWriteDumpSuccess);
 
    // Utility
    private:
        static DWORD    GetDefaultDumpPreFixName(OUT LPTSTR lpszDefaultDumpPreFixName, IN DWORD dwCchDefaultDumpPreFixName);
        static DWORD    GetDefaultModuleTempPath(OUT LPTSTR lpszPath, IN DWORD dwCchPath);
        static HMODULE    LoadLibrary_DbgHelp        (VOID);
        static HMODULE    LoadLibraryFromSystem    (IN LPCTSTR lpFileName);
        static BOOL        ManageCapacity            (IN LPCTSTR lpszPath, IN LPCTSTR lpszDumpPreFixName, IN DWORD dwDumpCapacityBytes);
        static BOOL        GetDumpFileFullPathName    (IN LPCTSTR lpszPath, IN LPCTSTR lpszDumpPreFixName, OUT LPTSTR lpszDumpFileFullPathName, IN DWORD dwCchDumpFileFullPathName, OUT PSYSTEMTIME pstTime);
        static DWORD    GetFilesSize            (IN LPCTSTR lpszFindFileName, OUT LPTSTR lpszEarlyFileName, IN DWORD dwCchEarlyFileName);
};