Was ist der einfachste Weg, um ein C ++ Programm zum Absturz zu bringen?
Ich versuche zu machen, ein Python-Programm, das die Schnittstelle mit einem anderen crashy-Prozess (aus der Hand). Leider ist das Programm, das ich die Verknüpfung mit nicht einmal Absturz zuverlässig! Also ich möchte eine schnelle C++ - Programm, das abstürzt, auf Zweck, aber ich weiß wirklich nicht die beste und kürzeste Weg, dies zu tun, wer weiß, was zwischen meiner:
int main() {
crashyCodeGoesHere();
}
mein C++ Programm-Absturz zuverlässig
Kommentar zu dem Problem
Sie können die Verwendung von inline-assembly zu versuchen, führen Sie privleged Anweisungen:
asm { cli; };
@aitchnyu ich denke, es ist ein Unterschied in der Verwendbarkeit der Antworten zu jeder Frage. (FYI: ich habe nicht abgestimmt alles, was für beide Fragen)
jeder Kommentar, warf Ausnahme, während man schon propogates?? plz chk unten meine Antwort anc Kommentar
Redis verwendet die folgenden
*((char*)-1) = "x";
- code zu induzieren Absturz um debug-Lesen Sie mehr in meinem Antwort Ich fand diese Frage der Suche nach einem Testfall für ein crash-reporting-system. Ich musste Kraft einen Absturz während der normalen Laufzeit zum aufrufen der crash reporter und stack-dump senden. Danke!
InformationsquelleAutor der Frage jonathan topf | 2011-12-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
abort()
Funktion ist wahrscheinlich Ihre beste Wette. Es ist Teil der C-standard-Bibliothek, und ist definiert als "was abnormal program termination" (e.g, ist ein schwerwiegender Fehler oder Absturz).InformationsquelleAutor der Antwort duskwuff
Versuchen:
Gefunden in:
InformationsquelleAutor der Antwort Martin York
Division durch null Absturz der Anwendung:
InformationsquelleAutor der Antwort Roee Gavirel
InformationsquelleAutor der Antwort Keith Nicholas
Gut, sind wir auf stacküberlauf, oder nicht?
(Garantiert nicht, dass der Absturz durch irgendwelche standards, aber weder sind alle der vorgeschlagenen Antworten einschließlich der akzeptiert, da
SIGABRT
könnte gefangen worden sowieso. In der Praxis wird dies zum Absturz überall.)InformationsquelleAutor der Antwort sam hocevar
Nur die Antwort... 🙂
InformationsquelleAutor der Antwort Macke
assert(false);
ist ziemlich gut.Gemäß ISO/IEC 9899:1999 ist es garantiert zu Abstürzen, wenn NDEBUG nicht definiert ist:
InformationsquelleAutor der Antwort Dan F
Seit einem Absturz ist ein symptom der Berufung auf ein Undefiniertes Verhalten, und da das aufrufen undefinierten Verhalten führen kann alles, auch ein Absturz, ich glaube, Sie wollen nicht, um wirklich zum Absturz Ihres Programms, sondern nur noch der Tropfen in einen debugger. Die meisten tragbaren Weise zu tun, ist wohl
abort()
.Während
raise(SIGABRT)
hat die gleiche Wirkung, ist es sicherlich mehr zu schreiben. Beide Möglichkeiten können jedoch aufgefangen werden durch die Installation eines signal-handlers fürSIGABRT
. Also je nach situation, möchten Sie vielleicht/heben zu müssen ein anderes signal.SIGFPE
,SIGILL
,SIGINT
,SIGTERM
oderSIGSEGV
könnte der Weg zu gehen, aber Sie alle können abgefangen werden.Wann können Sie unportabel, Ihre Entscheidungen könnte breiter sein, wie mit
SIGBUS
auf linux.InformationsquelleAutor der Antwort PlasmaHH
Nur flash ist, hatte ich abort () - Funktion:
Bricht der Prozess mit einer anormalen Beendigung des Programms.Es generiert die SIGABRT-signal, die in der Standardeinstellung bewirkt, dass das Programm zu beenden, die Rückkehr einer erfolglosen Beendigung Fehler-code, um die host-Umgebung.Das Programm ist beendet , ohne die Destruktoren für Objekte automatische oder statische Speicher Dauer und ohne Aufruf alle atexit( das heißt durch exit (), bevor das Programm beendet) - Funktion. Es kehrt nie zurück an den Aufrufer.
InformationsquelleAutor der Antwort samridhi
Die Antwort ist plattformspezifisch und hängt von Ihren Zielen. Aber hier ist der Mozilla-Javascript-crash-Funktion, die ich denke, zeigt eine Menge Herausforderungen, die zu dieser Arbeit:
InformationsquelleAutor der Antwort Paul Biggar
Was ist mit stack overflow, die von einem Toten Schleife rekursive Aufruf der Methode?
Sehen Original-Beispiel auf der Microsoft KB
InformationsquelleAutor der Antwort sll
C++ ist, kann man abgestürzt ist deterministisch, indem er 2 Ausnahmen parallel! Der standard sagt, nie werfen exception aus einem Destruktor ODER verwenden Sie niemals eine andere Funktion in einem Destruktor, die möglicherweise Ausnahme auslösen.
haben wir eine-Funktion, so können verlassen der Destruktor etc etc.
Einem Beispiel aus ISO/IEC 14882 §15.1-7. Sollte ein Absturz nach C++ standard. Ideone-Beispiel finden Sie hier.
ISO/IEC 14882 §15.1/9 erwähnt werfen, ohne try-Blocks, wodurch die implizite Aufruf von abort:
Gehören unter anderem :
werfen von Destruktor: ISO/IEC 14882 §15.2/3
InformationsquelleAutor der Antwort Abhinav
Dies führt zu einem segmentation fault.
InformationsquelleAutor der Antwort wrren
Dein compiler wahrscheinlich warnen Sie über diese, aber es kompiliert einfach gut unter GCC 4.4.3
Dies wird wahrscheinlich Ursache ein SIGFPE (floating point exception), das ist vielleicht nicht so wahrscheinlich in einer realen Anwendung wie SIGSEGV (Speicher-segmentation violation) als die anderen Antworten führen, aber es ist immer noch ein Absturz. Meiner Meinung nach ist dies viel besser lesbar.
Einen anderen Weg, wenn wir gehen, um zu betrügen und verwenden Sie
signal.h
ist:Dies ist garantiert zu töten, der Unterprozess, auf den Kontrast mit SIGSEGV.
InformationsquelleAutor der Antwort AlexWebr
Dies ist eine weitere garantierte version von abort präsentiert über Antworten.Es kümmert sich um die situation, wenn sigabrt blockiert ist.Sie können sogar verwenden, jedes signal statt abzubrechen, hat die Standard-Aktion der Absturz des Programms.
InformationsquelleAutor der Antwort bashrc
Dieser eine fehlt:
InformationsquelleAutor der Antwort mvds
Dieser stürzt auf meinem Linux-system, weil string-Literale sind gespeichert in read only memory:
Durch die Art und Weise, g++ weigert sich zu kompilieren. Compiler werden immer intelligenter und klüger 🙂
InformationsquelleAutor der Antwort fredoverflow
Sollte dieser Absturz auch. Unter Windows stürzt es ab mit der AccessViolation und es sollte das gleiche tun auf allen OS-es-denke ich mal.
InformationsquelleAutor der Antwort laci37
InformationsquelleAutor der Antwort Aniket Inge
Obwohl diese Frage bereits über eine akzeptierte Antwort...
Oder...
void main(){throw 1;}
InformationsquelleAutor der Antwort noɥʇʎԀʎzɐɹƆ
Dies ist das snippet zur Verfügung gestellt von Google Breakpad.
InformationsquelleAutor der Antwort Cory Trese
Oder anderen Weise, da wir auf die band wagon.
Einem schönen Stück der unendlichen Rekursion. Garantiert blow your stack.
Druckt:
InformationsquelleAutor der Antwort Matt
Schreiben in ein nur-lese-Speicher verursacht einen segmentation fault, es sei denn, Ihr system nicht unterstützen, nur-lese-Speicher Blöcke.
Habe ich es getestet mit MingGW 5.3.0 auf Windows 7 und GCC auf Linux Mint. Ich nehme an, dass andere Compiler und Systeme geben einen ähnlichen Effekt.
InformationsquelleAutor der Antwort NO_NAME
Einer, der noch nicht angesprochen wurde:
Diese zu behandeln, wird der null-Zeiger als Funktions-pointer und dann nennen Sie es. Genauso wie bei den meisten Methoden ist dies nicht garantiert, um das Programm zum Absturz bringen, aber die Chancen, das OS, dass diese unkontrolliert und das Programm jemals zurückkehren, sind vernachlässigbar.
InformationsquelleAutor der Antwort Anton Golov
sehr kurz, stürzt es ab!
InformationsquelleAutor der Antwort Nybble
Hoffe, das stürzt ab. Cheers.
InformationsquelleAutor der Antwort senthil
InformationsquelleAutor der Antwort sc_cs
Eine stilvolle Art und Weise, dies zu tun, ist eine rein virtuelle Funktion Aufruf:
Kompiliert mit gcc, diese Drucke:
InformationsquelleAutor der Antwort Martin Broadhurst
Befreien einen nicht initialisierten Zeiger ist Undefiniertes Verhalten. Auf vielen Plattformen/Compilern
freeThis
wird ein zufälliger Wert (was auch immer an, dass der Speicher vor Ort). Mit der Freigabe fragt das system, um kostenlos den Speicher an die Adresse, die in der Regel verursachen einen Speicherzugriffsfehler und das Programm Abstürzen.InformationsquelleAutor der Antwort Z Rev