Seltsames Verhalten in __except



  • Hallo,

    mein Testprogramm reagiert nicht so, wie es sollte. Prinzipiell funktioniert alles, der Minidump für die erste Exception ist korrekt, der zweite Minidump für die zweite Exception allerdings nicht! MiniDumpWriteDump schlägt in der zweiten Exception mit "error 18: Es sind keine weiteren Daten vorhanden" fehl.
    Die PEXCEPTION_POINTERS Struktur ist aber mit richtig ausgefüllt.

    #include <windows.h>
    #include <stdio.h>
    #include <dbghelp.h>
    
    #pragma comment (lib, "Dbghelp.lib")
    #pragma comment (lib, "user32.lib")
    
    LONG CALLBACK SelfProtect (PEXCEPTION_POINTERS pExcPointers)
    {
    	HANDLE hDumpFile = CreateFile (L"C:\\minidumpSelfProtect.dmp", FILE_ALL_ACCESS, 0, NULL, CREATE_ALWAYS, 0, NULL);
    	if (hDumpFile != INVALID_HANDLE_VALUE)
    	{
    		MINIDUMP_EXCEPTION_INFORMATION	MiniDumpInfo;
    
    		memset (&MiniDumpInfo, 0, sizeof (MINIDUMP_EXCEPTION_INFORMATION));
    
    		MiniDumpInfo.ThreadId = GetCurrentThreadId();
    		MiniDumpInfo.ClientPointers = NULL;
    		MiniDumpInfo.ExceptionPointers = pExcPointers;
    
    		// Das hier schlägt fehl!
    		MiniDumpWriteDump (GetCurrentProcess(),
    						   GetCurrentProcessId(),
    						   hDumpFile,
    						   MiniDumpNormal,
    						   &MiniDumpInfo,
    						   NULL,
    						   NULL
    
    		CloseHandle (hDumpFile); 
    	}
    
    	return 0;
    }
    
    LONG CALLBACK Handler (PEXCEPTION_POINTERS pExcPointers)
    {
    	HANDLE hDumpFile = CreateFile (L"C:\\minidumpHandler.dmp", FILE_ALL_ACCESS, 0, NULL, CREATE_ALWAYS, 0, NULL);
    	if (hDumpFile != INVALID_HANDLE_VALUE)
    	{
    		MINIDUMP_EXCEPTION_INFORMATION	MiniDumpInfo;
    
    		memset (&MiniDumpInfo, 0, sizeof (MINIDUMP_EXCEPTION_INFORMATION));
    
    		MiniDumpInfo.ThreadId = GetCurrentThreadId();
    		MiniDumpInfo.ClientPointers = NULL;
    		MiniDumpInfo.ExceptionPointers = pExcPointers;
    
    		// Das hier funktioniert
    		MiniDumpWriteDump (GetCurrentProcess(),
    						   GetCurrentProcessId(),
    						   hDumpFile,
    						   MiniDumpNormal,
    						   &MiniDumpInfo,
    						   NULL,
    						   NULL
    						   );
    
    		CloseHandle (hDumpFile); 
    	}
    
    	// Wenn diese Funktion verwendet wird, wird SelfProtect bei einer Exception nicht aufgerufen!
    	//SetUnhandledExceptionFilter (SelfProtect);		
    
    	__try
    	{
    		char *p = 0;
    		p[0] = 5;
    	}
    	__except (SelfProtect (GetExceptionInformation ()))
    	{
    	}
    
    	return 0;
    }
    
    int main ()
    {
    	SetUnhandledExceptionFilter (Handler);
    
    	char *p = 0;
    	p[0] = 0;
    
    	return 0;
    }
    

  • Mod

    IMHO kanst Du in einem Unhandled Exception Handler nicht den Unhandled Exception Handler umbiegen. Du bearbeitest ja immer noch die entsprechende Exception.



  • Das Verhalten ist allgemein etwas komisch. Eine Exception lässt sich in einem Unhandled Exception Handler noch durch einen __try __except Block abfangen (wahrscheinlich da dies Threadbasierend ist) und die PEXCEPTION_POINTER Struktur wird korrekt ausgefüllt. MiniDumpWriteDump aber funktioniert nicht richtig...
    Bei FAULTING_IP wird die richtige Adresse angezeigt, der Rest sind aber noch die Informationen vom alten MiniDump!

    BTW: Was Spricht eigentlich dagegen ein komplettes Programm über einen __try __except Block abzusichern?

    Und könntest du mir vl. erklären, wie ungefähr SetUnhandledExceptionFilter funktioniert, da dieser ja alle Exceptions eines Programmes abfängt, __try __except nur die innerhalb der Klammern = Threadbasierend/SEH Frame?


  • Mod

    Stell Dir einfach vor, dass wenn ein Thread gestartet wird, er als aller erstes einen __try/__except Block bekommt. Und die entsprechende Handlerfunktion die ausgeführt wird bestimmst Du prozessweit mit SetUnhandledExceptionFilter.


Anmelden zum Antworten