Ich möchte einen Core-Dump an einer bestimmten Stelle in meiner C ++ - Anwendung erzwingen.
Ich weiß, dass ich es tun kann, indem ich so etwas mache wie:
int * crash = NULL;
*crash = 1;
Aber ich würde gerne wissen, ob es einen saubereren Weg gibt?
Ich benutze übrigens Linux.
Antworten:
Die Anhebung der Signalnummer 6 (
SIGABRT
in Linux) ist eine Möglichkeit , es zu tun (obwohl bedenken Sie, dass SIGABRT ist nicht erforderlich in allen POSIX - Implementierungen sein 6 , so dass Sie die verwenden möchtenSIGABRT
Wert selbst wenn dies etwas anderes als Quick'n ist 'Dirty Debug Code).Das Aufrufen
abort()
führt auch zu einem Core-Dump, und Sie können dies sogar tun, ohne den Prozess zu beenden, indem Sie nur das untergeordnete Element aufrufen,fork()
gefolgt von dieser Antwort . Weitere Informationen findenabort()
Sie in dieser Antwort .quelle
ulimit -c unlimited
Antwort von Suvesh Pratapa hat mir bei dieser Antwort sehr geholfen.Vor einigen Jahren hat Google die Coredumper- Bibliothek veröffentlicht.
Es ist nicht das, wonach du gefragt hast, aber vielleicht ist es sogar noch besser :)
quelle
Wie in der Signal-Manpage aufgeführt , erzwingt jedes Signal mit der als "Kern" aufgeführten Aktion einen Kern-Dump. Einige Beispiele sind:
Stellen Sie sicher, dass Sie Core Dumps aktivieren:
quelle
ulimit -c unlimited
geholfen.setrlimit(RLIMIT_CORE, &core_limits);
verfügbar über verwenden#include <sys/resource.h>
. Sie erstellen eine Struktur vom Typrlimit
und legen dann die Mitgliederrlim_cur
und festrlim_max
.quelle
abort()
direkt anrufen ?Aufrufen
In diesem Zusammenhang möchten Sie manchmal einen Back-Trace ohne eigentlichen Core-Dump und das Programm weiter ausführen lassen: Überprüfen Sie die Funktionen glibc backtrace () und backtrace_symbols (): http://www.gnu.org/s/libc/ manual / html_node / Backtraces.html
quelle
Eine andere Möglichkeit, einen Core Dump zu generieren:
Erstellen Sie einfach eine neue Instanz der Bash und beenden Sie sie mit dem angegebenen Signal. Das
$$
ist die PID der Shell. Andernfalls beenden Sie Ihre aktuelle Bash und werden abgemeldet, das Terminal geschlossen oder getrennt.quelle
bash -c 'kill -SIGSEGV $$'
.Sie können kill (2) verwenden , um ein Signal zu senden.
So,
quelle
Manchmal kann es angebracht sein, so etwas zu tun:
Ein Problem bei diesem einfachen Ansatz besteht darin, dass nur ein Thread entleert wird.
quelle
Verwenden Sie diesen Ansatz, wo immer Sie wollen :)
quelle
quelle