Здравствуйте, 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>
Да, этот код у меня тоже работает корректно, равно как и предложенный мной же пример.

Буду выяснять с человеком, который у нас непосредственно имел описанные мной выше проблемы.
Вопрос: кто-нить пытался добавить создание dump'a к описанному выше при помощи MiniDumpWriteDump? Все попытки, которые я предпринимал, закончились провалом: MiniDumpWriteDump стабильно кидает исключение!
Если у кого-то уже есть положительный опыт в этом вопросе — поделитесь плиз.
Заранее благодарен
Здравствуйте, 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;
}