Wie bekomme ich den Namen / die Beschreibung einer Ausnahme?

8

Wie erhalten Sie den Namen und / oder die Beschreibung eines SEH Ausnahme ohne die Strings in Ihrer Anwendung fest codieren zu müssen?

Ich habe versucht, FormatMessage() zu verwenden, aber es schneidet die Nachricht manchmal ab, auch wenn Sie angeben, dass Einfügungen zu ignorieren sind:

%Vor%

Löst eine Ausnahme mit dem Code 0xC0000005 (EXCEPTION_ACCESS_VIOLATION) aus.

%Vor%

Füllt msg mit der abgeschnittenen Zeichenfolge: " The instruction at 0x ".

    
Sascha 26.11.2008, 19:38
quelle

2 Antworten

2

Strukturierte Ausnahmecodes werden über NTSTATUS-Nummern definiert. Obwohl jemand aus MS empfiehlt, FormatMessage () um NTSTATUS-Nummern in Strings zu konvertieren, würde ich dies nicht tun. Flag FORMAT_MESSAGE_FROM_SYSTEM wird verwendet, um das Ergebnis von GetLastError () zu konvertieren in eine Schnur, so macht es hier keinen Sinn. Die Verwendung des Flags FORMAT_MESSAGE_FROM_HMODULE zusammen mit ntdll.dll führt bei einigen Codes zu falschen Ergebnissen. ZB für EXCEPTION_ACCESS_VIOLATION erhalten Sie The instruction at 0x , was nicht sehr informativ ist :).

Wenn Sie die Zeichenfolgen betrachten, die in ntdll.dll gespeichert sind, wird offensichtlich, dass viele von ihnen mit der printf () Funktion, nicht mit der FormatMessage () . Die Zeichenfolge für EXCEPTION_ACCESS_VIOLATION lautet beispielsweise:

The instruction at 0x%08lx referenced memory at 0x%08lx. The memory could not be %s.

%0 wird von FormatMessage () behandelt die Escape-Sequenz, die den Nachrichten-Terminator bedeutet, keine Einfügung. Einfügungen sind% 1 bis% 99. Deshalb macht das Flag FORMAT_MESSAGE_IGNORE_INSERTS keinen Unterschied.

Vielleicht möchten Sie die Zeichenfolge von ntdll.dll laden und an vprintf übergeben, aber Sie müssen Argumente genau so vorbereiten, wie die Zeichenfolge angibt (zB für EXCEPTION_ACCESS_VIOLATION ist es unsigned long , unsigned long , char* ) . Und dieser Ansatz hat einen großen Nachteil: Jede Änderung der Anzahl, Reihenfolge oder Größe der Argumente in ntdll.dll kann Ihren Code beschädigen.

Es ist also sicherer und einfacher, die Strings in Ihren eigenen Code zu schreiben. Ich finde es gefährlich, Saiten zu benutzen, die von jemand anderem ohne Koordination mit mir vorbereitet wurden :) und außerdem für andere Funktionen. Dies ist nur eine weitere Möglichkeit für Fehlfunktionen.

    
4LegsDrivenCat 09.10.2015 18:09
quelle
1

Gilt das?

Ссылка

    
John 26.11.2008 20:30
quelle

Tags und Links