2012-01-26 19 views
7

क्रैश हो जाए, मैं अपने एप्लिकेशन के लिए क्रैश होने पर डंप फ़ाइल बनाने का प्रयास कर रहा हूं। मैं वर्तमान में procdump.exe का उपयोग करने के लिए फ्लैग के साथ उपयोग कर रहा हूं, इसलिए यदि मेरे एप्लिकेशन में अनचाहे अपवाद है तो procdump मेरे लिए एक डंप फ़ाइल बनाता है।किसी भी अनुप्रयोग के लिए डंप फ़ाइल बनाएं जब भी यह

मैंने सोचा कि मुझे किया गया था, लेकिन फिर मुझे पता चला कि मेरा एप्लिकेशन क्रैश और procdump डंप फ़ाइल नहीं बनाता है। कुछ जांच के बाद मुझे पता चला है कि वेक्टर :: फ्रंट का अमान्य उपयोग रनटाइम त्रुटि का कारण बनता है। मैंने _SECURE_SCL_THROWS ध्वज चालू कर दिया और उसके बाद procdump.exe -e ने क्रैश को पकड़ लिया और एक डंप फ़ाइल बनाई।

अब मेरे प्रश्न पर: क्या अब मेरा आवेदन क्रैश होने पर procdump.exe -e हमेशा डंप फ़ाइल बनायेगा? मैं कैसे गारंटी दे सकता हूं कि मेरे पास कोई अन्य परिदृश्य नहीं है जहां procdump -e मेरे लिए अच्छा नहीं है?

उत्तर

7

मुझे लगता है कि आप विंडोज वातावरण पर हैं (क्योंकि आप procdump.exe का उपयोग करते हैं)।

  1. SetUnhandledExceptionFilter जो एक दुर्घटना पर सक्रिय किया जाएगा का उपयोग कर एक कॉलबैक फ़ंक्शन रजिस्टर: आप भी अपने programm के लिए एक अपवाद फिल्टर कि एक mindump लिखते हैं, जब भी आपके आवेदन दुर्घटना सेट कर सकते हैं। एक संभावित हस्ताक्षर होगा:

    SetUnhandledExceptionFilter(HandleException); 
    
  2. परिभाषित एक समारोह सूचक समारोह MiniDumpWriteDump कॉल करने के लिए: लिखने के लिए

    typedef BOOL (WINAPI *MINIDUMPWRITEDUMP)(HANDLE hProcess, DWORD dwPid, HANDLE hFile, MINIDUMP_TYPE DumpType,CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,CONSTPMINIDUMP_USER_STREAM_INFORMATIOUserStreamParam,CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam); 
    
  3. उपयोग MiniDumpWriteDump समारोह

    LONG WINAPI HandleException(struct _EXCEPTION_POINTERS* apExceptionInfo) 
    

    कहीं का उपयोग कर इसे रजिस्टर पहले पंजीकृत कॉलबैक विधि (हैंडलएक्सप्शन) में डंप (DbgHelp.dll 5.1 या बाद में) की आवश्यकता है:

    HMODULE mhLib = ::LoadLibrary(_T("dbghelp.dll")); 
    MINIDUMPWRITEDUMP pDump = (MINIDUMPWRITEDUMP)::GetProcAddress(mhLib, "MiniDumpWriteDump"); 
    
    HANDLE hFile = ::CreateFile(_T("dump_name"), GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, 
            FILE_ATTRIBUTE_NORMAL, NULL); 
    
    
    _MINIDUMP_EXCEPTION_INFORMATION ExInfo; 
    ExInfo.ThreadId = ::GetCurrentThreadId(); 
    ExInfo.ExceptionPointers = apExceptionInfo; 
    ExInfo.ClientPointers = FALSE; 
    
    pDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &ExInfo, NULL, NULL); 
    ::CloseHandle(hFile); 
    
+0

जब आप कर सकते हैं 'MiniDumpWriteDump' के लिए' GetProcAddr' का उपयोग क्यों कर रहे हैं डीबगिंगटूल एसडीके से बस डीबीजीएचल्पपीएच शामिल करें ?? –

+0

क्योंकि क्रैश होने पर आईएटी (आयात पता तालिका) पहले ही दूषित हो सकती है। ऐसे क्रैश हैंडलर में, केवल विश्वसनीय चीज है कि पुस्तकालयों से खुद को लिंक करना! –

+0

@ ПетърПетров लेकिन फिर आप 'लोड लाइब्रेरी' को कैसे कॉल करने जा रहे हैं? यदि आईएटी दूषित हो गया है, तो आप शायद पहले से ही खराब हो गए हैं। – LHLaurini

2

/* WinDump.cpp */

#ifdef WIN32 

#include <windows.h> 
#include <Dbghelp.h> 
#include <tchar.h> 


typedef BOOL (WINAPI *MINIDUMPWRITEDUMP)(HANDLE hProcess, DWORD dwPid, HANDLE hFile, MINIDUMP_TYPE DumpType,CONST PMINIDUMP_EXCEPTION_INFORMATION ExceptionParam,CONST PMINIDUMP_USER_STREAM_INFORMATION UserStreamParam,CONST PMINIDUMP_CALLBACK_INFORMATION CallbackParam); 

void create_minidump(struct _EXCEPTION_POINTERS* apExceptionInfo) 
{ 
    HMODULE mhLib = ::LoadLibrary(_T("dbghelp.dll")); 
    MINIDUMPWRITEDUMP pDump = (MINIDUMPWRITEDUMP)::GetProcAddress(mhLib, "MiniDumpWriteDump"); 

    HANDLE hFile = ::CreateFile(_T("core.dmp"), GENERIC_WRITE, FILE_SHARE_WRITE, NULL, CREATE_ALWAYS, 
     FILE_ATTRIBUTE_NORMAL, NULL); 

    _MINIDUMP_EXCEPTION_INFORMATION ExInfo; 
    ExInfo.ThreadId = ::GetCurrentThreadId(); 
    ExInfo.ExceptionPointers = apExceptionInfo; 
    ExInfo.ClientPointers = FALSE; 

    pDump(GetCurrentProcess(), GetCurrentProcessId(), hFile, MiniDumpNormal, &ExInfo, NULL, NULL); 
    ::CloseHandle(hFile); 
} 

LONG WINAPI unhandled_handler(struct _EXCEPTION_POINTERS* apExceptionInfo) 
{ 
    create_minidump(apExceptionInfo); 
    return EXCEPTION_CONTINUE_SEARCH; 
} 

#endif // WIN32 

/* WinDump.h */

#ifdef WIN32 

LONG WINAPI unhandled_handler(struct _EXCEPTION_POINTERS* apExceptionInfo); 

#endif // WIN32 

/* main.cpp */

#include "WinDump.h" 

int main(int argc, char **argv) 
{ 

    // Create a dump file whenever the gateway crashes only on windows 
    SetUnhandledExceptionFilter(unhandled_handler); 
    return 0; 
}