Re[10]: Централизованная обработка исключений
От: D. Lex  
Дата: 05.10.04 07:22
Оценка:
Здравствуйте, Ivan, Вы писали:

I>
I>LONG WINAPI MyUnhandledExceptionFilter(_EXCEPTION_POINTERS* ExceptionInfo)
I>{
I>    printf("filter called\n");
I>    return 0;
I>}
I>int _tmain(int argc, _TCHAR* argv[])
I>{
I>    SetUnhandledExceptionFilter(MyUnhandledExceptionFilter);
I>    MessageBox(0, "123", "13", MB_OK);
I>    *(reinterpret_cast<long*>(0)) = 0;
I>    return 0;
I>}
I>


Да, этот код у меня тоже работает корректно, равно как и предложенный мной же пример. Буду выяснять с человеком, который у нас непосредственно имел описанные мной выше проблемы.
Re: Централизованная обработка исключений
От: pavelsua  
Дата: 17.10.06 14:26
Оценка:
Вопрос: кто-нить пытался добавить создание dump'a к описанному выше при помощи MiniDumpWriteDump? Все попытки, которые я предпринимал, закончились провалом: MiniDumpWriteDump стабильно кидает исключение!

Если у кого-то уже есть положительный опыт в этом вопросе — поделитесь плиз.

Заранее благодарен
Re[2]: Централизованная обработка исключений
От: alexxys Россия  
Дата: 17.10.06 17:29
Оценка:
Здравствуйте, pavelsua, Вы писали:

P>Вопрос: кто-нить пытался добавить создание dump'a к описанному выше при помощи MiniDumpWriteDump? Все попытки, которые я предпринимал, закончились провалом: MiniDumpWriteDump стабильно кидает исключение!


P>Если у кого-то уже есть положительный опыт в этом вопросе — поделитесь плиз.

У меня есть положительный опыт. Привожу пример:

__try
{
    lResult = ::DispatchMessage(&Msg);
}
__except(WriteDump(GetExceptionInformation()), EXCEPTION_CONTINUE_SEARCH)
{
}


void WriteDump(LPEXCEPTION_POINTERS pep)
{
    CMiniDump(pep, MiniDumpWithDataSegs).Write("c:\\", CMiniDump::dnThisModule);
}



class CMiniDump
{
public:
    CMiniDump(LPEXCEPTION_POINTERS pep, MINIDUMP_TYPE mdtMinidumpType = MiniDumpNormal);
    ~CMiniDump(void);

    enum ENDumpNaming{
        dnThisModule
    };

//     static void Write(LPEXCEPTION_POINTERS pep, boost::filesystem::path ptBase,
//         ENDumpNaming dnDumpNaming);
    static BOOL Write(LPEXCEPTION_POINTERS pep, LPCSTR szPrefix = "",
        ENDumpNaming dnDumpNaming = CMiniDump::dnThisModule);
    BOOL Write(string sPrefix, ENDumpNaming dnDumpNaming = CMiniDump::dnThisModule);
    BOOL Write(string sBasePath, string sPrefix, ENDumpNaming dnDumpNaming = CMiniDump::dnThisModule);
    static BOOL IsMiniDumpSupported();

private:
    boost::filesystem::path GetMiniDumpPath(string sBasePath, string sPrefix,
        ENDumpNaming dnDumpNaming) const;

    LPEXCEPTION_POINTERS    m_pep;
    MINIDUMP_TYPE            m_mdtMinidumpType;
};


CMiniDump::CMiniDump(LPEXCEPTION_POINTERS pep, MINIDUMP_TYPE mdtMinidumpType)
    :m_pep(pep), m_mdtMinidumpType(mdtMinidumpType)
{
}

CMiniDump::~CMiniDump(void)
{
}

BOOL CMiniDump::Write(LPEXCEPTION_POINTERS pep, LPCSTR szPrefix, ENDumpNaming dnDumpNaming)
{
    return CMiniDump(pep).Write(szPrefix, dnDumpNaming);
}

BOOL CMiniDump::Write(string sPrefix, ENDumpNaming dnDumpNaming)
{
    return Write("", sPrefix, dnDumpNaming);
}

BOOL CMiniDump::Write(string sBasePath, string sPrefix, ENDumpNaming dnDumpNaming)
{
    BOOL
        bSuccess = FALSE;

    if (IsMiniDumpSupported()){
        ATL::CAtlFile
            flDump;
        flDump.Create(GetMiniDumpPath(sBasePath, sPrefix, dnDumpNaming).string().c_str(),
            GENERIC_WRITE, 0, CREATE_ALWAYS);

        MINIDUMP_EXCEPTION_INFORMATION eInfo;
        eInfo.ThreadId = GetCurrentThreadId();
        eInfo.ExceptionPointers = m_pep;
        eInfo.ClientPointers = TRUE;

        bSuccess = MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), flDump,
            m_mdtMinidumpType, &eInfo, NULL, NULL);
    }

    return bSuccess;
}

boost::filesystem::path CMiniDump::GetMiniDumpPath(string sBasePath, string sPrefix,
    ENDumpNaming dnDumpNaming) const
{
    CAtlPath
        ptModulePath = CCurrentExeModule::Instance().GetPath();
    ptModulePath.StripPath();
    ptModulePath.RemoveExtension();
    boost::filesystem::path
        ptDump,
        ptShortDumpName(sPrefix + string(ptModulePath), boost::filesystem::native);

    int iDumpNumber = 0;

    while (iDumpNumber < 1000)
    {
        ptDump = boost::filesystem::path(ptShortDumpName.string() + IntToString(iDumpNumber) + ".dmp",
            boost::filesystem::native);

        if (!sBasePath.empty()){
            boost::filesystem::path
                ptBase(sBasePath, boost::filesystem::native);
            ptDump = ptBase / ptDump;
        }

        if (!boost::filesystem::exists(ptDump))
            break;
        ++iDumpNumber;
    }

    return ptDump;
}

BOOL CMiniDump::IsMiniDumpSupported()
{
    return CDll("DbgHelp.DLL").GetProcAddress("MiniDumpWriteDump") != NULL;
}
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.