Procédure de programmation pour provoquer 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 la voie.
- Un "nettoyeur" façon de vidage de la mémoire? .... bon 😉
- C'est mignon. Mieux encore, utiliser un booléen (enum en c?)... si(crash = TRUE) { / OH SHI... */ }
- BTW, cette méthode ne fonctionne pas dans tous les systèmes Unix. HPUX, pour un seul, vous permet de lire et d'écrire NULL en toute impunité (heureusement, c'est configurable).
- Je viens d'apprendre comme 3 ou 4 grandes nouvelles choses. Merci.
- c'est plus d'une raison de trouver un moyen générique 😉 Merci
Vous devez vous connecter pour publier un commentaire.
Rassemblements 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 à 6 dans tous les POSIX implémentations de sorte que vous pouvez utiliser leSIGABRT
valeur en soi, si ce n'est rien d'autre que rapide n'dirty code de débogage).Appel
abort()
également provoquer un core, et vous pouvez même le faire sans de la fin de votre processus en appelantfork()
suivie parabort()
à l'enfant uniquement - voir cette réponse pour plus de détails.ulimit -c unlimited
de Suvesh Pratapa réponse, aidé mon beaucoup pour cette réponse.Il y A quelques années, Google a publié la coredumper bibliothèque.
Ce n'est pas ce que vous demandez, mais peut-être que c'est encore mieux 🙂
Comme indiqué dans le signal de la page de manuel, tout signal avec l'action répertorié comme "de base" va forcer un vidage de la mémoire. Quelques exemples sont:
Assurez-vous d'activer core dumps:
ulimit -c unlimited
aidé.abort()
directement?abort();
Liés, 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
Une autre façon de générer un core dump:
Il suffit de créer une nouvelle instance de bash et de le tuer avec signal spécifiée. Le
$$
est le PID dula coquille. Sinon, vous sont en train de tuer votre bash et sera déconnecté, terminal fermé ou déconnecté.
bash -c 'kill -SIGSEGV $$'
.Vous pouvez utiliser kill(2) pour envoyer le signal.
Donc,
Parfois, il peut être approprié de faire qch comme ceci:
Un problème avec cette approche est que seul un thread sera coredumped.
utiliser cette approche où vous voulez 🙂