97 votes

Comment par programmation à cause d'un vidage de la mémoire en C/C++

Je voudrais forcer un vidage de la mémoire à un endroit précis dans mon application C++.

Je sais que je peux le faire en faisant quelque chose comme:

int * crash = NULL;
*crash = 1;

Mais je voudrais savoir si il y a une manière plus propre?

Je suis à l'utilisation de Linux par le chemin.

79voto

paxdiablo Points 341644

Levée de numéro de signal 6 (SIGABRT sous Linux) est une façon de le faire (mais gardez à l'esprit que SIGABRT n'est pas nécessaire d'être 6 dans tous les POSIX implémentations de sorte que vous pouvez utiliser l' SIGABRT de la valeur elle-même, si ce n'est rien d'autre que rapide n'dirty code de débogage).

#include <signal.h>
: : :
raise (SIGABRT);

Appelant abort() entraînera également un core dump, et vous pouvez même le faire sans de la fin de votre processus en appelant fork() suivie par abort() chez l'enfant uniquement - voir cette réponse pour plus de détails.

77voto

ephemient Points 87003

Il y A quelques années, Google a publié la coredumper de la bibliothèque.

Vue d'ensemble

Le coredumper bibliothèque peuvent être compilés dans des applications pour créer des core dumps de l'exécution du programme, sans s'arrêter. Il supporte à la fois unique et multi-thread core dumps, même si le noyau ne supporte pas le multi-thread fichiers de base.

Coredumper est distribué sous les termes de la Licence BSD.

Exemple

Ce n'est pas un exemple complet; il vous donne une idée de ce que l'coredumper API ressemble.

#include <google/coredumper.h>
...
WriteCoreDump('core.myprogram');
/* Keep going, we generated a core file,
 * but we didn't crash.
 */

Ce n'est pas ce que vous demandez, mais peut-être que c'est encore mieux :)

37voto

Suvesh Pratapa Points 3735

Comme indiqué dans le signal de page de manuel, tout signal avec l'action répertorié comme "de base" va forcer un vidage de la mémoire. Quelques exemples sont:

SIGQUIT       3       Core    Quit from keyboard
SIGILL        4       Core    Illegal Instruction
SIGABRT       6       Core    Abort signal from abort(3)
SIGFPE        8       Core    Floating point exception
SIGSEGV      11       Core    Invalid memory reference

Assurez-vous d'activer core dumps:

ulimit -c unlimited

31voto

Jonathan Leffler Points 299946
#include <stdlib.h>   // C
//#include <cstdlib>  // C++

void core_dump(void)
{
    abort();
}

11voto

smcameron Points 1864

abort();

Liées, parfois, vous souhaitez une trace sans une réelle core dump, et de permettre au programme de continuer à fonctionner: découvrez la glibc backtrace() et backtrace_symbols() fonctions: http://www.gnu.org/s/libc/manual/html_node/Backtraces.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X