Проблемы с _purecall и _set_purecall_handler
От: limpli  
Дата: 01.11.12 14:27
Оценка:
Доброго всем времени суток. Возникла следующая проблема. Приложение вылетает с ошибкой «R6025- pure virtual function call». На сколько я понял данное исключениможно поймать с помощью _purecall или _set_purecall_handler. Но в обоих случаях обработчики события вызова чисто виртальной функции не принимают на вход никаких параметров. То есть я могу отследить данное исключение, но немогу понять где оно вызвано. Пробовал ставить в обработчике DebugBreak, но он работает только в дебаге, да и в дебаге никакой отладчной информации не дает, разве только что указывает место где это обработчик вызван. Поэтому есть ли способы получения отладочной информации в случае вызова данного исключения? Может быть можно как то уронить программу с крашдампом, или возможно как то можно собрать информацию о текущем состоянии и выгрузить ее из программы? Самое главное что бы можно было понять где был вызван абстрактный метод.
Re: Проблемы с _purecall и _set_purecall_handler
От: Abyx Россия  
Дата: 01.11.12 14:35
Оценка:
Здравствуйте, limpli,

я в purecall handler бросаю исключение, ловлю его обработчиком необработанных исключений (UnhandledExceptionFilter) и пишу крешдамп.
In Zen We Trust
Re[2]: Проблемы с _purecall и _set_purecall_handler
От: limpli  
Дата: 01.11.12 14:46
Оценка:
Здравствуйте, Abyx, Вы писали:

A>Здравствуйте, limpli,


A>я в purecall handler бросаю исключение, ловлю его обработчиком необработанных исключений (UnhandledExceptionFilter) и пишу крешдамп.


Плиз можно немного подробней? Область для меня новая, и я в ней дуб дубом Как вы бросаете исключение? С помощью throw? Или как то еще?

Как пишите крашдамп? Сегодня часа четыре гуглил, так и не нашел как можно програмно вызвать запись крашдампа.

Зарание спасибо!
Re[3]: Проблемы с _purecall и _set_purecall_handler
От: Abyx Россия  
Дата: 01.11.12 15:13
Оценка:
Здравствуйте, 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
От: limpli  
Дата: 01.11.12 15:56
Оценка:
Abyx, огромное вам спасибо!
Re: Проблемы с _purecall и _set_purecall_handler
От: Аноним  
Дата: 02.11.12 08:34
Оценка:
Появились дополнительные трудности, данную проблему нужно решить в рамках 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;
}



// CrashMFC1Dlg.cpp 

#include "stdafx.h"
#include "CrashMFC1.h"
#include "CrashMFC1Dlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

class CAboutDlg : public CDialogEx
{
  ...
};

CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD)
{
}

void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
END_MESSAGE_MAP()


CCrashMFC1Dlg::CCrashMFC1Dlg(CWnd* pParent /*=NULL*/)
    : CDialogEx(CCrashMFC1Dlg::IDD, pParent)
{
    m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CCrashMFC1Dlg::DoDataExchange(CDataExchange* pDX)
{
    CDialogEx::DoDataExchange(pDX);
}

BEGIN_MESSAGE_MAP(CCrashMFC1Dlg, CDialogEx)
    ON_WM_SYSCOMMAND()
    ON_WM_PAINT()
    ON_WM_QUERYDRAGICON()
    ON_BN_CLICKED(IDC_BUTTON1, &CCrashMFC1Dlg::OnBnClickedButton1)
END_MESSAGE_MAP()

BOOL CCrashMFC1Dlg::OnInitDialog()
{
   ...
}

void CCrashMFC1Dlg::OnSysCommand(UINT nID, LPARAM lParam)
{
  ...
}

void CCrashMFC1Dlg::OnPaint()
{
   ...
}
HCURSOR CCrashMFC1Dlg::OnQueryDragIcon()
{
    return static_cast<HCURSOR>(m_hIcon);
}

class CDerived;
class CBase
{
public:
   CBase(CDerived *derived): m_pDerived(derived) {};
   ~CBase();
   virtual void function(void) = 0;
   CDerived * m_pDerived;
};
class CDerived : public CBase
{
public:
   CDerived() : CBase(this) {};   
   virtual void function(void) { };
};
CBase::~CBase()
{
   m_pDerived -> function(); // Вызов абстрактного метода
}

void CCrashMFC1Dlg::OnBnClickedButton1()
{
    CDerived myDerived; 
}


К сожалению, не имею ни малейшего представления почему обработчик исключения не вызывается. И вообще должен ли он вызываться.

Буду очень благодарен за любую подсказку!
Re[3]: Проблемы с _purecall и _set_purecall_handler
От: Abyx Россия  
Дата: 02.11.12 11:58
Оценка:
Здравствуйте, Аноним, Вы писали:

А>К сожалению, не имею ни малейшего представления почему обработчик исключения не вызывается. И вообще должен ли он вызываться.


наверное потому что в MFC где-то есть catch(...) .
крешдамп можно сделать и из purecall_handler
In Zen We Trust
Re[4]: Проблемы с _purecall и _set_purecall_handler
От: limpli  
Дата: 02.11.12 12:12
Оценка:
Здравствуйте, Abyx, Вы писали:

A>крешдамп можно сделать и из purecall_handler


Проблема только в том purecall_handler(myPurecallHandler) не вызывается.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.