2016-05-13 6 views
3

Ungefähr ist der Code:Gibt es eine Möglichkeit, den Zeiger zu erhalten, auf den während der Behandlung eines Signals zugegriffen wurde? diese

#include <signal.h> 

void SegmentationFaultHandler(int signal) { 
    if (signal == SIGSEGV) { 
     // how to check here if it's actual null pointer? 
     Throw(NullPointerException, "Object pointer not set to an instance of an object."); 
    } 
    else 
     Throw(InvalidOperationException, "Signal has been intercepted by wrong function."); 
} 

int main() { 
    signal(SIGSEGV, SegmentationFaultHandler); 
    try { 
     int *i = null; 
     *i = 0; 
... 

Wie kann ich überprüfen, ob ich nicht einen Zeiger überprüfen hat verdoppeln, oder einfach nur zugegriffen nicht initialisierte Daten und Ehrerbietung es?

Ich weiß, dass es möglich ist, weil Debugger wissen, auf welche Adresse das Programm zuzugreifen versuchte.

+0

Ich glaube nicht, dass die Debugger auf diese Weise arbeiten. – Boiethios

+0

@Boiethios Debugger arbeiten, indem sie Signale überschreiben und dann schlechte Anweisungen anlegen, um Breakpoints zu erzeugen (?) – LyingOnTheSky

+0

Vielleicht können Sie stattdessen 'sigaction' verwenden? –

Antwort

1

Es scheint, dass Sie PEXCEPTION_POINTERS in Ihrem Handler abrufen können, indem Sie die globale Variable _pxcptinfoptrs verwenden, die in signal.h deklariert ist. Verwenden Sie dann diesen Zeiger wie in den folgenden Beispielen.

static void sigsegv_handler(int signo) 
{ 
    PEXCEPTION_POINTERS excptr = _pxcptinfoptrs; 
    if (excptr != NULL) { 

    } 
    // ... 
} 

Vectored Exception Handler

Unter Windows können Sie Vectored Exception Handler verwenden. Sie Handler wird wie folgt aussehen:

LONG WINAPI ExceptionFilter(struct _EXCEPTION_POINTERS * pExceptionPointers) { 

dann:

pExceptionPointers->ExceptionRecord->ExceptionCode 

Sie Ausnahmecode ist, EXCEPTION_ACCESS_VIOLATION ist, wenn Sie ungültige Speicher zugreifen.

pExceptionPointers->ExceptionRecord->ExceptionInformation[0] == 0 

gilt, wenn Leseoperation

pExceptionPointers->ExceptionRecord->ExceptionInformation[0] == 1 

für den Betrieb Schreib getan wurde

ist
pExceptionPointers->ExceptionRecord->ExceptionInformation[1] 

ist die Adresse, die geschrieben gelesen/wurde, als Ausnahme

happend

Structured Ausnahmefilterung

Wenn Sie den Vectored Exception Handler nicht verwenden können, können Sie __try/__ hinzufügen, außer auf der niedrigsten Ebene Ihres Codes, d. in main() oder wo Sie Thread-Funktion ist in der Nähe:

__try { 
    // Code which might cause access violation or any other hardware exceptions 
} 
__except(ExceptionFilter(GetExceptionInformation())) { 
} 
+0

Ich kann nicht __try und __except einrichten, ich muss es die richtige Ausnahme werfen lassen. Jedenfalls habe ich einen Weg gefunden, wie der Signal-Handler-Weg zu gehen. Sie können es mit 'AddVectoredExceptionHandler (0, ...)' tun. – LyingOnTheSky

+0

@LyingOnTheSky Ich habe gerade die Antwort aktualisiert, siehe oben - aber ehrlich gesagt habe ich noch nie _pxcptinfoptrs verwendet – marcinj

+0

Stört es nicht, ich habe eine einzige Zeile verpasst. (Die Antwort war von Anfang an in Ordnung) – LyingOnTheSky