J'ai une application de test en C ++ Démarrage de plusieurs threads dans son L'un des threads fait quelque chose qui provoque une SEGFAULT et un COREDUMP est généré (Ulimit -C Unlimited a été définie précédemment). P>
Je ouvre le noyau avec La backtrage de ce thread solitaire semble correct, pas de choses étranges dedans. p>
Le système d'exploitation est Red Hat Enterprise 5.3, GDB-6.8. P> Main () Code>, puis dort dans Main () Code> Forever. P>
gdb code> et voir avec le thread Appliquer tous les filets BT code> ou info code> que je n'ai qu'un seul fil (commencé dans Main () Code>), qui est impossible car au moins le thread de Main () CODE> doit être fonctionnant aussi bien. P>
5 Réponses :
Êtes-vous vraiment sûr que c'est impossible? Peut-être que le problème est exactement lié au fait que le fil principal est sorti sans attendre les autres threads. P>
Après avoir démarré les threads, il fait pour (;;) SLEEP (1); code> donc je suis sûr que le fil principal ne quitte pas
Essayez d'exécuter votre application sous Valgrind. Maby Cela aidera à comprendre la cause de la crash. P>
Oui, Helgrind fournit des résultats et des remerciements pour la suggestion, mais ma question est différente.
Si vous n'avez pas SIGHANDLER pour SIGEGV avec Alt Stack, qui est un cas particulier, utilisez simplement la strace. P>
(strace homme) p>
(nous avons besoin de drapeau -f car le thread est toujours une portée globale de Linux. E.g. ~ Procs qui fonctionnent dans la même mémoire) P>
Voici l'exemple de sortie qui montre un fil qui s'est échappé avant le crash.
J'ai souligné la partie intéressante ... p>
clone ( p>
= pile_fils 0x7fc1fc319ff0, drapeaux = CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND | CLONE_THREAD | CLONE_SYSVSEM | CLONE_SETTLS | CLONE_PARENT_SETTID | CLONE_CHILD_CLEARTID, parent_tidptr = 0x7fc1fc31a9e0, tls = 0x7fc1fc31a710, child_tidptr = 0x7fc1fc31a9e0) = 28757 p>
[PID 28756] RT_SIGPROCMMASK (SIG_BLOCK, [CHLD], P>
[PID 28757] SET_ROBUST_LIST (0x7FC1FC31A9F0, 0x18 P>
[PID 28756] <... RT_SIGPROCMMASS a repris> [], 8) = 0 P>
[pid 28757] <... set_robust_list a repris>) = 0 p>
[PID 28756] RT_SIGRACTION (SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0 P>
[PID 28757] MADVise (0x7FC1FB91A000, 10465280, MADV_DontNeed P>
[PID 28756] RT_SIGPROCMMASK (SIG_SETMASK, [], P>
[PID 28757] <... MADVise a repris>) = 0 p>
[PID 28756] <... RT_SIGPROCMMASS a repris> NULL, 8) = 0 P>
[PID 28757] _EXIT (0) =? P>
nanosleep ({1, 0}, 0x7fffce29c4b0) = 0 p>
RT_SIGPROCMMASK (SIG_UNBLOCK, [ABRT], NULL, 8) = 0 P>
TGKILL (28756, 28756, SIGABRT) = 0
--- Sigabrt (avorté) @ 0 (0) --- P>
+++ tué par Sigabrt (noyau largué) +++ p>
avorté (noyau largué) p>
Faites maintenant un grep dans la sortie et voyez que les nombres de VS attachés détachés.
Si vous avez des threads en direct à la sortie (crash), je créerais une entrée de bugzilla (première recherche BugZilla OFC). P> strace -f myprogram code> p>
Processus 28757 attaché h2>
Processus 28757 détaché h2>
Ce sont des informations utiles et je l'ai essayée, mais malheureusement, le problème est une condition de race rare et cela ne se plantait pas avec la strace.
La raison pour laquelle vous ne voyez qu'un seul thread est que GDB n'est pas capable de distinguer les threads "par lui-même", il s'appuie sur une bibliothèque externe, le libthread_db , fourni par la bibliothèque de threads.
Cette bibliothèque doit être activée au début de la session de débogage afin de surveiller les activités de fil (naissance, décès, ...) et communique toutes les informations relatives au thread à GDB pendant l'exécution. P>
Vous devriez être capable de lire p> lorsque vous essayez de déboguer tout fichier em> compilé avec -LPTthread code>, mais gdb ne Essayez même d'activer libthread_db code> lorsque vous déboguez une vidée de noyau. p> p>
Je n'ai pas pu trouver un moyen d'activer libthread_db lors de l'analyse du fichier principal. J'ai remarqué sur d'autres OS (Debian) que GDB est capable de montrer des informations principales correctes sans [Débogage de fil à l'aide de Libthread_DB activé] code>
Il s'est avéré être Bug de noyau sous défaut Red Hat Enterprise 5.3, fixé dans la version de chapeau rouge ultérieure (5.4) - 1.110.1. RHSA-2009: 1193: Mise à jour importante de la sécurité et du correctif de bogues sur les systèmes 32 bits, les vidanges de base de certaines applications multithreadées n'incluent pas toutes les informations sur le thread. (BZ # 505322) P>
blockQuote>
https://bugzilla.redhat.com/show_bug.cgi?id=505322 < / a> p> Kernel-2.6.18-164.EL5 CODE> P>
Ce problème a-t-il commencé en 5.3 ou aussi dans les versions précédentes? Il semble assez grave de ne pas passer inaperçu, mais je ne peux pas le comprendre du bugzilla
@Aviv Je ne peux pas le comprendre non plus. Je pense qu'il n'y avait pas de tel problème dans les versions précédentes, mais c'était il y a longtemps et je ne peux pas dire avec certitude