la définition d'un point d'arrêt de sortie gdb ne fonctionne pas?
J'ai mis des points d'arrêt à la sortie et _exit et mon programme (multithread application, en cours d'exécution sur linux 2.6.16.46-0.12 sles10), est en quelque sorte toujours en cours de fermeture d'une façon que je ne peut pas localiser
(gdb) c ... [Nouveau Thread 47513671297344 (LWP 15279)] [Nouveau Thread 47513667103040 (LWP 15280)] [Nouveau Thread 47513662908736 (LWP 15281)] Programme terminé avec le code 0177. (gdb)
la sortie des fonctions de résider dans la libc donc il n'y a pas de différé charge partagée de la bibliothèque de questions. Quelqu'un sait de certains autres mystérieux de déclenchement de sortie, qui ne peuvent pas être pris?
EDIT: le problème est maintenant seulement académiques. J'ai essayé binaire de recherche, de débogage, de la sauvegarde d'un sous-ensemble de mes modifications (le problème a disparu). Après j'ai appliqué de nouveau dans l'ordre, je n'arrive plus à reproduire le problème, même avec des choses restauré à son état d'origine.
EDIT2: j'ai trouvé une raison de ce genre d'erreur à récemment, ce qui peut avoir été la source d'origine de ce problème. Pour des raisons historiques, notre produit utilise le mal de l'éditeur de liens drapeau -Bsymbolic. Parmi les effets secondaires de cette est que, quand un symbole est pas défini, mais appelé, la GLIBC runtime éditeur de liens bombe exactement de cette manière, et vous le voyez dans le débogueur comme un processus sorti avec 0177. Lorsque le moteur d'exécution de l'éditeur de liens abandonne cette façon, je suppose qu'il fait le syscall à _exit directement (plutôt que d'utiliser la bibliothèque d'exécution C exit() ou _exit()). Ce serait cohérent avec le fait que j'ai été incapable de rattraper cela avec la sortie des points d'arrêt dans le débogueur.
source d'informationauteur Peeter Joot
Vous devez vous connecter pour publier un commentaire.
Il y a deux raisons les plus courantes pour
_exit
point d'arrêt pour "miss" --GDB
n'ai pas mis le point d'arrêt dans la bonne place, le programme effectue (un équivalent moral de l')syscall(SYS_exit, ...)
Ce n'
info break
etdisassemble _exit
dire?Vous pourriez être en mesure de convaincre
GDB
définir le point d'arrêt correctement avecbreak *&_exit
. Sinon,GDB-7.0
prend en chargecatch syscall
. Quelque chose comme cela devrait fonctionner (en supposant queLinux/x86_64
; à noter que surix86
les numéros seront différents) indépendamment de la façon dont le programme des sorties:Mise à jour:
Votre commentaire indique que _exit point d'arrêt est défini correctement, il est probable que votre processus juste ne pas exécuter
_exit
.Qui laisse
syscall(SYS_exit, ...)
et une autre possibilité (qui me manquait avant): tous les threads d'exécutionpthread_exit
. Vous pouvez définir un point d'arrêt surpthread_exit
ainsi (et exécuterinfo thread
chaque fois que vous le frappez-le dernier thread pour fairepthread_exit
va provoquer la fin du processus).Edit:
Également intéressant de noter que vous pouvez utiliser mnémonique noms, plutôt que de syscall numéros. Vous pouvez également ajouter simultanément plusieurs appels à la capture de la liste comme suit:
Réglage du point d'arrêt sur _exit était une bonne idée.
Vous pouvez également essayer de lier statiquement, juste pour prendre une pile de potentiel gdb complications de la table.
0177 est louche, comme le état d'attente
wait(2)
retourne pour enfant arrêtémais gdb est l'impression de la statut de sortiequi est une chose différente, de sorte que c'est probablement une vraie sortie argument.Il pourrait être que vous avez quelques paresseux références non résolues dans certains de bibliothèque partagée chargé dans le processus. J'ai exactement la même situation que "quelqu'un quelque part" sorti de processus et qui semblait être résolues de référence.
Vérifier vos processus avec "ldd -r" option.
Ressemble ld.ou qu'est-paresseux résolution de certains symboles en uniforme de la fonction de sortie (ce qui devrait être abandonner à mon humble avis).
Ma situation:
Maintenant la sortie est apparu lorsque j'ai invoqué certaines scénario utilisée fonction non définie. Il est toujours sorti avec exitcode=127 et gdb signalé 0177.