Je voudrais forcer un vidage de mémoire à un emplacement spécifique dans mon application C ++.
Je sais que je peux le faire en faisant quelque chose comme:
int * crash = NULL;
*crash = 1;
Mais j'aimerais savoir s'il existe un moyen plus propre?
J'utilise Linux au fait.
Réponses:
L'augmentation du signal numéro 6 (
SIGABRT
sous Linux) est une façon de le faire (mais gardez à l'esprit que SIGABRT n'est pas obligé d'être 6 dans toutes les implémentations POSIX, vous pouvez donc utiliser laSIGABRT
valeur elle-même si c'est autre chose que quick'n 'code de débogage sale).L'appel
abort()
provoquera également un vidage de mémoire, et vous pouvez même le faire sans terminer votre processus en appelantfork()
suivi deabort()
dans l'enfant uniquement - voir cette réponse pour plus de détails.la source
ulimit -c unlimited
réponse de Suvesh Pratapa m'a beaucoup aidé pour cette réponse.Il y a quelques années, Google a publié la bibliothèque coredumper .
Ce n'est pas ce que vous demandiez, mais c'est peut-être encore mieux :)
la source
Comme indiqué dans la page de manuel signal , tout signal avec l'action répertoriée comme «core» forcera un vidage de mémoire. Quelques exemples sont:
Assurez-vous que vous activez les vidages de mémoire:
la source
ulimit -c unlimited
aidé.setrlimit(RLIMIT_CORE, &core_limits);
disponible via#include <sys/resource.h>
. Vous créez une structure de typerlimit
, puis définissez les membresrlim_cur
etrlim_max
.la source
abort()
directement?Invoquer
En relation, parfois vous voudriez une trace arrière sans un vidage de mémoire réel, et autorisez le programme à continuer à fonctionner: consultez les fonctions glibc backtrace () et backtrace_symbols (): http://www.gnu.org/s/libc/ manuel / html_node / Backtraces.html
la source
Une autre façon de générer un vidage de mémoire:
Créez simplement une nouvelle instance du bash et tuez-la avec le signal spécifié. Le
$$
est le PID du shell. Sinon, vous tuez votre bash actuel et serez déconnecté, le terminal fermé ou déconnecté.la source
bash -c 'kill -SIGSEGV $$'
.Vous pouvez utiliser kill (2) pour envoyer un signal.
Alors,
la source
Parfois, il peut être approprié de faire quelque chose comme ceci:
Un problème avec cette approche simple est qu'un seul thread sera coredumpé.
la source
utilisez cette approche où vous voulez :)
la source
la source