Wie Programmabsturz bei Zugriff auf Datei mit "Datenfehler (CRC-Prüfung)" verhindern?

13/01/2009 - 14:58 von Edzard Egberts | Report spam
Hallo,

den oben genannten Absturz würde ich gerne abfangen. Der Fehler tritt
bei einer defekten Datei auf, die beim Versuch, mit Windows eine Kopie
zu erstellen, zum Fehler "Datenfehler (CRC-Prüfung)" führt, aber die
korrekte Dateilànge hat. Windows stürzt dabei aber nicht ab, nur meine
Software. ;o(

Ich benutze gcc 3.4.5 mit MinGW und greife mit einem std::fstream auf
die Datei zu. Nach einer Datensicherung soll die Datei zur Überprüfung
eingelesen werden:

std::fstream In(Name.c_str(), ios_base::binary | ios_base::in);
...
In.read(pBuf, Size);

Beim read() stürzt das Programm ab, wobei gdb folgendes ausgibt:

Thread [2] (Suspended: Signal 'SIGSEGV' received. Description:
Segmentation fault.)
[24] <symbol is not available> 0xbaadf00d
[23] _Unwind_SjLj_RaiseException() C:\MinGW\include\c++\3.4\iostream:77
0x005d14dc
[22] __cxa_throw() C:\MinGW\include\c++\3.4.5\iostream:77 0x005c43d5
[21] std::__throw_ios_failure() C:\MinGW\include\c++\3.4.5\iostream:77
0x005c7f84
[20] std::basic_filebuf<char, std::char_traits<char> >::xsgetn()
C:\MinGW\include\c++\3.4.5\iostream:77 0x00637e3b
[19] std::istream::read() C:\MinGW\include\c++\3.4.5\iostream:77 0x006264f0

[18] In der Zeile 18 des Stacks wird dann das oben genannte In.read()
aufgerufen. Dieser Aufruf befindet sich in einer try-catch(...)-Abfrage,
sollte also eigentlich nicht zu einem Programmabsturz führen. So wie ich
die Debugger-Ausgabe interpretiere, wird hier auch eine Exception
ausgelöst[22], bei "Unwind"[23] geht dann aber etwas schief. Der Puffer
wurde übrigens außerhalb des catch angelegt und muss nicht "abgewickelt"
werden. Warum wird die Exception nicht abgefangen? Zur Sicherheit habe
ich mit -fexceptions ein clean build des Projektes durchgeführt und
denke, dass die damit auch garantiert aktiv sind. Mit Exceptions bin ich
aber nicht so vertraut - müsste die STL eigentlich nicht auch ohne
"-fexceptions" funktionieren? Und wenn nicht, muss ich die dann nicht
mit Exceptions neu bauen? Bin da etwas ratlos, wo mein Problem
eigentlich her kommt.

Gruß,

Ed
 

Lesen sie die antworten

#1 Markus Schaaf
14/01/2009 - 16:00 | Warnen spam
Edzard Egberts schrieb:

Thread [2] (Suspended: Signal 'SIGSEGV' received. Description:
Segmentation fault.)
[24] <symbol is not available> 0xbaadf00d
[23] _Unwind_SjLj_RaiseException() C:\MinGW\include\c++\3.4\iostream:77
0x005d14dc
[22] __cxa_throw() C:\MinGW\include\c++\3.4.5\iostream:77 0x005c43d5
[21] std::__throw_ios_failure() C:\MinGW\include\c++\3.4.5\iostream:77
0x005c7f84



Wahrscheinlich ein MinGW-Problem mit Exceptions. Mir erscheint Deine
Versionsnummer zu hoch für Produktiveinsatz. Lies mal in den Readmes und
Release-Notes!

Ähnliche fragen