2008-10-22 12 views
14

Aktualnie przechwytuję MiniDumps nieobsłużonych wyjątków przy użyciu SetUnhandledExceptionFilter, ale czasami otrzymuję komunikat "R6025: pure virtual function".Przechwytywanie czystego wywołania wirtualnego R6025

Rozumiem, jak dzieje się zwykłe wywołanie funkcji wirtualnej Zastanawiam się, czy można je przechwycić, aby w tym momencie utworzyć miniDump.

Odpowiedz

15

Jeśli chcesz złapać wszystkie awarie masz zrobić więcej niż tylko: SetUnhandledExceptionFilter

Chciałbym również ustawić obsługi przerwaniu, przewodnik purecall, nieoczekiwane, zniesienia, i nieważne procedury obsługi parametrów.

#include <signal.h> 

inline void signal_handler(int) 
{ 
    terminator(); 
} 

inline void terminator() 
{ 
    int*z = 0; *z=13; 
} 

inline void __cdecl invalid_parameter_handler(const wchar_t *, const wchar_t *, const wchar_t *, unsigned int, uintptr_t) 
{ 
    terminator(); 
} 

A w głównym umieścić to:

signal(SIGABRT, signal_handler); 
_set_abort_behavior(0, _WRITE_ABORT_MSG|_CALL_REPORTFAULT); 

set_terminate(&terminator); 
set_unexpected(&terminator); 
_set_purecall_handler(&terminator); 
_set_invalid_parameter_handler(&invalid_parameter_handler); 

Powyższy wyśle ​​wszystkie awarie do nieobsługiwany obsługi wyjątków.

11

Zobacz this answer here na pytanie where do “pure virtual function call” crashes come from?.

Aby pomóc z debugowania tego rodzaju problemów można w różnych wersjach z MSVC wymienić purecall obsługi biblioteki runtime jest. Można to zrobić poprzez zapewnienie własną funkcję z tej podpisem:

int __cdecl _purecall(void) 

i łącząc go przed odwołuje runtime bibliotekę. Daje to kontrolę nad , co się dzieje, gdy wykryto czystą maskę pod kątem . Gdy już masz kontrolę, możesz zrobić coś bardziej użytecznego niż standardowa procedura obsługi . Mam handler'a , który może dostarczyć ślad stosu , gdzie nastąpił purecall; zobacz tutaj: http://www.lenholgate.com/archives/000623.html , aby uzyskać więcej informacji.

(Uwaga: można również zadzwonić pod numer _set_purecall_handler(), aby zainstalować program obsługi w niektórych wersjach MSVC).

Więc, w swoim czystym treserze, zrób swój minidump.

-1

Spróbuj zdefiniować przestępstwo czystym wirtualnym. Nie ma nic w regułach C++, które zabraniają definiowania czystego wirtualnego, i można go używać z wielu powodów, z których najmniej jest uzyskiwanie śledzenia wstecznego połączenia. Jedynym caviat jest definicja musi być poza deklaracją (virtual void bla() = 0 { } jest nieważna).

Powiązane problemy