Core dump sous Linux
Je veux créer un core dump chaque fois que mon processus se bloque. Actuellement, je suis la suite de cette approche:
- Construire un spécial "debug" version du programme à l'aide de "g" de gcc/g++.
- Exécuter "ulimit -c unlimited"
- Maintenant, nous obtenons le vidage de la mémoire à chaque fois que le programme se bloque.
Mais je veux minimiser le nombre d'étapes, de sorte que:
- Core dump devraient toujours obtenir la création. Même si c'est de la "libération" de construire. L'utilisateur ne doit pas être demandé pour exécuter la commande "
ulimit -c unlimited
" manuellement. - Que vidage de la mémoire de la trace doit être en mesure de donner le fichier, la fonction, le numéro de ligne de l'appel. C'est la trace de pile dans une forme lisible par l'homme.
- Je ne veux pas construire le programme en debug avec l'option "-g". Ou, au moins, il ne devrait pas contenir d'autres informations de débogage qui n'est pas nécessaire de produire le lisible par l'homme trace de la pile. Parce que ce serait une version validée du programme.
J'ai donc deux questions:
- Comment créer un core dump dans la "libération" de la construction d'un programme?
- Toujours. Sans manuellement l'exécution de la "
ulimit -c unlimited
"
source d'informationauteur Sabya
Vous devez vous connecter pour publier un commentaire.
La solution habituelle est de construire avec -g et de dépouiller les informations de débogage avant de relâcher le fichier. Recherchez le "strip" de commande.
Vous gardez le fichier avec les informations de débogage et de l'utiliser pour déboguer des core dumps vous obtenir des clients.
Si vous souhaitez imprimer l'lisible par l'homme trace sur l'ordinateur de l'utilisateur dont vous aurez besoin pour distribuer des binaires avec (certains) des informations de débogage.
Recherchez la backtrace()' dans la glibc.
Noter que les vidages mémoire sera créé (si l'espace est réglé de manière appropriée), même si votre binaire ne contiennent pas les informations de débogage.
La meilleure façon de s'assurer de la création d'un core dump est probablement pour l'exécution de votre code binaire à partir d'un script qui définit ulimit avant d'exécuter le binaire.
setrlimit
.trace
et liées à des appels système. Vous aurez ensuite à traduire les adresses de fonction dans les noms de fonction en cours d'exécutionaddr2line
(ou la duplication de ses fonctionnalités).-g
vous pouvez toujours obtenir un backtrace (sauf que inline fonctions n'apparaissent pas).Vous pouvez essayer google-coredumper:
Un outil pratique pour la création de GDB lisible les coredumps à partir des applications multithread -- alors que le programme est en cours d'exécution. Le coredumper bibliothèque peuvent être compilés dans des applications pour créer des core dumps de l'exécution du programme, sans y mettre fin.
http://sourceforge.net/projects/goog-coredumper/
Mis à jour
En fait, je pense que je devrais dire à propos d'une possible différence entre les versions debug et release que je n'ai pas mentionné dans mon message. Versions peut être construit avec la NDEBUG définir afin de se débarrasser de tous les
assert()
dans le programme. Les versions de débogage, au contraire, doit être construit sans la définition NDEBUG commeassert()
aide à trouver des bugs.Toutefois, si vous n'utilisez pas
assert()
il n'y aura pas de différence.Un utilisateur peut définir ulimit -c unlimited dans son profil.
Trace d'un programme compilé avec certains d'optimisation, souvent, ne donnent pas de numéro de ligne qui est utile.
Vous pouvez créer une version avec les informations de débogage et de mettre dans vos archives. Puis la bande et de fournir les dépouillé binaires à vos clients. Si un client vous donne un fichier de base puis il suffit d'utiliser la version avec les informations de débogage et le fichier de base du client.
How to create a core dump in the "release" build of a program?
Ce n'est pas de votre responsabilité, c'est de la responsabilité de l'OS.Vous aurez du mal à obtenir un emploi décent stacktrace en forme humaine si le code est un mode de diffusion/hautement optimisé version. Utilisez le commutateur-g ou oublier de faire une stacktrace totalement...vous ne pouvez pas avoir les deux!! Qui ramène à ce point - on dirait que vous êtes en anticipant le code pour bloquer même dans un environnement de production???
Pourquoi ne pas corriger le code et de s'assurer qu'il fonctionne d'abord
...odeurs de code .... sniff sniffEdit: Ok, j'ai peut-être trouver un peu sévère dans mon commentaire ci-dessus, je n'ai pas l'intention d'être dur là...pour le bénéfice des lecteurs, j'ai inclus un lien vers une autre question posté ici, et que réponse que j'ai donné, utilise des signaux pour créer un stack-trace et de les rediriger vers un fichier. Il sera d'une aide à l'OP de la question et de lui aider dans le dépannage...