Доброго всем времени суток. Возникла следующая проблема. Приложение вылетает с ошибкой «R6025- pure virtual function call». На сколько я понял данное исключениможно поймать с помощью _purecall или _set_purecall_handler. Но в обоих случаях обработчики события вызова чисто виртальной функции не принимают на вход никаких параметров. То есть я могу отследить данное исключение, но немогу понять где оно вызвано. Пробовал ставить в обработчике DebugBreak, но он работает только в дебаге, да и в дебаге никакой отладчной информации не дает, разве только что указывает место где это обработчик вызван. Поэтому есть ли способы получения отладочной информации в случае вызова данного исключения? Может быть можно как то уронить программу с крашдампом, или возможно как то можно собрать информацию о текущем состоянии и выгрузить ее из программы? Самое главное что бы можно было понять где был вызван абстрактный метод.
Здравствуйте, limpli, Вы писали:
A>>я в purecall handler бросаю исключение, ловлю его обработчиком необработанных исключений (UnhandledExceptionFilter) и пишу крешдамп.
L>Плиз можно немного подробней? Область для меня новая, и я в ней дуб дубом Как вы бросаете исключение? С помощью throw? Или как то еще?
throw или RaiseException, без разницы. можно хоть *(void*)0=0; или __asm _emit 0xCC
L>Как пишите крашдамп? Сегодня часа четыре гуглил, так и не нашел как можно програмно вызвать запись крашдампа. http://stackoverflow.com/questions/5028781/c-how-to-write-a-sample-code-that-will-crash-and-produce-dump-file/5028973#5028973
In Zen We Trust
Re[4]: Проблемы с _purecall и _set_purecall_handler
Появились дополнительные трудности, данную проблему нужно решить в рамках MFC. Поэтому сразу же возникли вопросы:
1) Где должна быть _set_purecall_handler. Думаю что в CWinApp::InitInstance() но не уверен.
2) На сколько я понял обработчик который мы передаем в _set_purecall_handler должен быть обычной функцией, а не методом класса. Можем ли мы определить метод вне класса и передать его CWinApp?
3) Да и вообще, данный механизм работает в MFC? Может там что то свое есть?
Зарание благодарен!
Re[2]: Проблемы с _purecall и _set_purecall_handler
От:
Аноним
Дата:
02.11.12 10:53
Оценка:
Написал простенькое приложение на MFC. Что бы проверить можно ли поймать исключение. Ничего к сожалению не работает. Исключение вызова абстрактной функции проскакивает мимо обработчика и вываливается в окно ошибки CRT.
Вот код:
// CrashMFC1.cpp #include"stdafx.h"#include"CrashMFC1.h"#include"CrashMFC1Dlg.h"#include <Windows.h>
#include <Dbghelp.h>
#ifdef _DEBUG
#define new DEBUG_NEW
#endif// CCrashMFC1App
BEGIN_MESSAGE_MAP(CCrashMFC1App, CWinApp)
ON_COMMAND(ID_HELP, &CWinApp::OnHelp)
END_MESSAGE_MAP()
void myPurecallHandler(void)
{
throw; // Данный метод не вызывается, исключение пролетает мимо него, и выскакивает окошко CRT ошибки
}
void make_minidump(EXCEPTION_POINTERS* e)
{
... // здесь пишется крашдамп, но до выполнения этого метода к сожалению не доходит
}
LONG CALLBACK unhandled_handler(EXCEPTION_POINTERS* e)
{
make_minidump(e);
return EXCEPTION_CONTINUE_SEARCH;
}
CCrashMFC1App::CCrashMFC1App()
{
...
}
CCrashMFC1App theApp;
BOOL CCrashMFC1App::InitInstance()
{
...
//Видимо не самое удачное место для этих методов
_set_purecall_handler(myPurecallHandler);
SetUnhandledExceptionFilter(unhandled_handler);
return FALSE;
}
Здравствуйте, Аноним, Вы писали:
А>К сожалению, не имею ни малейшего представления почему обработчик исключения не вызывается. И вообще должен ли он вызываться.
наверное потому что в MFC где-то есть catch(...) .
крешдамп можно сделать и из purecall_handler
In Zen We Trust
Re[4]: Проблемы с _purecall и _set_purecall_handler