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:
Löst eine Ausnahme mit dem Code 0xC0000005 (EXCEPTION_ACCESS_VIOLATION)
aus.
Füllt msg
mit der abgeschnittenen Zeichenfolge: " The instruction at 0x
".
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.