Zu Behandeln, wie SIGABRT-signal?
Hier ist der code, auf dem ich meine Prozedur für SIGABRT
signal dann rufe ich abort()
aber hf nicht trigered, anstatt Programm wird abgebrochen, warum?
#include <iostream>
#include <csignal>
using namespace std;
void Triger(int x)
{
cout << "Function triger" << endl;
}
int main()
{
signal(SIGABRT, Triger);
abort();
cin.ignore();
return 0;
}
PROGRAMM-AUSGABE:
Funktioniert hier tadellos, nachdem ich
Windows 7 x64 mit MSVC++ 2010 (keine Notwendigkeit, Sie zu zählen cstdlib in visual studio)
Auch das Programm abgebrochen werden sollte, es sei denn, der signal-Handler hat eine
<cstdlib>
. Welche Plattform?Windows 7 x64 mit MSVC++ 2010 (keine Notwendigkeit, Sie zu zählen cstdlib in visual studio)
Auch das Programm abgebrochen werden sollte, es sei denn, der signal-Handler hat eine
longjmp
. Wenn Sie wollen, dass die Nachricht, die gedruckt werden, bevor, dass, möchten Sie vielleicht zu Spülen std::cout
(oder schreiben std::cerr
).InformationsquelleAutor codekiddy | 2012-01-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wie schon andere gesagt haben, Sie können nicht haben abort() zurück und ermöglichen die Ausführung normal fortgesetzt. Was Sie jedoch tun kann, ist zu schützen, ein Stück code, das nennen könnte Abbrechen, indem Sie eine Struktur ähnlich wie ein try catch. Die Ausführung des Codes wird abgebrochen, aber der rest des Programms fortgesetzt werden kann. Hier ist eine demo:
Dies ist nicht tragbar. E. g. busybox+musl (Alpine 3.8) segfaults auf einem zweiten Aufruf von abort(). Versuchen Sie zu vermeiden, abort() in der Produktion-code (z.B. mit compiler flag -DNDEBUG zu vermeiden, behauptet).
InformationsquelleAutor Antoine Mathys
Obwohl Sie ersetzen können handler für
SIGABRT
undabort()
wird die Aufmerksamkeit zum hf, der Abbruch wird nur gehemmt, wenn der signal-handler nicht zurück. Das relevante Zitat in C99 ist in 7.20.4.1 Absatz 2:Ihre signal-handler zurückgegeben und damit das Programm abgebrochen wird.
InformationsquelleAutor Dietmar Kühl
Erhalten Sie die Symptome, also die popup-debug-dialog, wenn Sie einen debug-build (mit windows und Visual Studio - Teste ich mit version 2012), da setzt es einen debug-break, in der debug-Implementierung von abort() ).
Bei der Auswahl "ignorieren" erhalten Sie die Meldung "Funktion triger"
Wenn Sie eine Freigabe erstellen, dann bekommt man nicht die debug-popup-Dialogfeld, und Sie erhalten die Meldung, wie erwartet
InformationsquelleAutor user2495422