Windows-Fehlerberichte und Ausnahmen außerhalb des Bereichs

9

Ich beobachte ein ähnliches Problem in einem viel größeren Programm auf etwas, das mit dem folgenden Code repliziert werden kann:

%Vor%

Dies stürzt offensichtlich mit einem nicht erfassten std::range_error ab.

Um dies zu debuggen, habe ich die Windows-Fehlerberichterstattung eingerichtet und wie erwartet wird eine Minidump erstellt. Wenn ich jedoch den Minidump in Visual Studio lade, um einen Aufruf-Stack zu generieren, bekomme ich Folgendes:

%Vor%

was bei der Identifizierung der Ursache des Problems völlig nutzlos ist.

Was ich möchte, ist ein Callstack wie:

%Vor%

(beim Ausführen mit einem Debugger) Das identifiziert den Ort, an dem der std :: range_error aufgetreten ist. Weiß jemand, wie man Windows Error Reporting so konfiguriert, dass der Fehler nicht wie im obersten Callstack versteckt wird?

Ich verwende Visual Studio 2013 unter Linux mit g ++. Die Anwendung Core-Dumps und wenn der Kern in Gdb ausgeführt wird, erhalte ich einen Aufrufstack, der an den Ort der Ausnahme ausgelöst wird.

    
doron 30.10.2017, 14:24
quelle

2 Antworten

1

Es gibt einen Trick, um zum "originalen" Stack der SEH-Exception zu gelangen. Wenn der Kernel das Programm beendet (das zeigt Ihr Stack), wird immer noch der Kontextsatz des ursprünglichen Stapels gespeichert. Dieser Artikel beschreibt, wie Sie mit WinDBG zu diesem Datensatz gelangen: Ссылка

Wenn Sie dies oft tun, können Sie wahrscheinlich ein WinDBG-Makro dafür schreiben.

    
Steed 03.11.2017, 07:37
quelle
2

Sie mischen zwei Microsoft-Produkte, Windows und Visual Studio.

Die Windows-Fehlerberichterstattung behandelt Win32-Fehler, z. B. nicht behandelte SEH-Ausnahmen (natove). Der Visual Studio CRT ist verantwortlich für std::range_error .

Sie schlagen eine Windows-Fehlerberichterstattungseinstellung vor, die sich auf die CRT auswirkt. Das kann nicht funktionieren. Die Windows-Fehlerberichterstattung kann nicht einmal davon ausgehen, dass ein Microsoft CRT vorhanden ist.

Stattdessen nähern Sie sich dies von der CRT-Seite. Die relevante Funktion in der CRT ist std::set_terminate(&your_handler)

[Bearbeiten] Da Sie in den Debugger einbrechen möchten (was eine Windows-Sache ist, nicht CRT), würden Sie FatalExit

    
MSalters 30.10.2017 16:08
quelle

Tags und Links