4 Stimmen

Wie findet man den Wert von LastError beim Debuggen von .net-Prozessen?

Ich erhalte eine Ausnahme von einem .net-Prozess, der einen Interop-Aufruf zu einer Win32-Api-Funktion verwendet. Ich habe einen Debugger angeschlossen, und ich möchte den Wert von LastError sehen. Ist es möglich, den Wert von LastError von Visual Studio Debugger zu sehen?

Zwei Anmerkungen: Der Prozess, der die Ausnahme auslöst, gehört nicht zu mir, und ich kann seinen Quellcode nicht ändern, um den Wert von LastError zu erhalten.
Ich verwende die Beta-Version von Visual Studio 2010 und gehe davon aus, dass eine Lösung, die für VS 2008 funktioniert, auch mit 2010 funktioniert.

Gracias.

10voto

Reed Copsey Punkte 536986

Sie können anrufen Marshal.GetLastWin32Error() um die letzte Windows-API-Fehlermeldung zu erhalten. Dies ist die vorgeschlagene Methode (im Gegensatz zur Verwendung von P/Invoke).

Aus den Unterlagen: "GetLastWin32Error stellt die Win32 GetLastError API-Methode von Kernel32.DLL zur Verfügung. Diese Methode existiert, weil es nicht sicher ist, einen direkten Plattformaufruf zu GetLastError zu machen, um diese Informationen zu erhalten. Wenn Sie auf diesen Fehlercode zugreifen möchten, müssen Sie GetLastWin32Error aufrufen, anstatt Ihre eigene Plattformaufrufdefinition für GetLastError zu schreiben und diese aufzurufen. Die Common Language Runtime kann interne Aufrufe an APIs vornehmen, die das vom Betriebssystem gepflegte GetLastError überschreiben."

Auch in Bezug auf die Nichtänderung der Quelle:

Dies funktioniert im Visual Studio-Sofortfenster, vorausgesetzt der P/Invoke-Aufruf wurde mit DllImportAttribute.SetLastError . Wenn der P/Invoke-Aufruf an die Windows-API dieses Attribut fehlte, werden Sie jedoch etwas Pech haben, da es sehr gut möglich ist, dass die Marshalling-Api den Wert in GetLastError überschreibt, bevor Sie ihn sehen können.

3voto

Jeff Moser Punkte 19228

Versuchen Sie, "$err" zu beobachten (siehe diese Frage ). Sehen Sie sich auch Folgendes an diese Frage in dem das Hinzufügen von "SetLastError" zu Ihrem P/Invoke-Aufruf erörtert wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X