2008-12-03 4 views
1

J'ai créé un client TCP qui se connecte à un serveur d'écoute. Nous avons implémété TCP garder en vie aussi. Parfois, le client se bloque et le noyau est vidé. Vous trouverez ci-dessous les traces de vidage du noyau.core dump à _dl_sysinfo_int80()

Le problème est dans la version de noyau Linux mise à jour 4, noyau 2.6.9-42.0.10.

nous avions deux décharges principales.

(gdb) where 
#0 0x005e77a2 in _dl_sysinfo_int80() from /ddisk/d303/dumps/mhx239131/ld- 
linux.so.2 
#1 0x006c8bd1 in connect() from /ddisk/d303/dumps/mhx239131/libc.so.6 
#2 0x08057863 in connect_to_host() 
#3 0x08052f38 in open_ldap_connection() 
#4 0x0805690a in new_connection() 
#5 0x08052cc9 in ldap_open() 
#6 0x080522cf in checkHosts() 
#7 0x08049b36 in pollLDEs() 
#8 0x0804d1cd in doOnChange() 
#9 0x0804a642 in main() 

(gdb) where 
#0 0x005e77a2 in _dl_sysinfo_int80() from /ddisk/d303/dumps/mhx239131/ld- 
linux.so.2 
#1 0x0068ab60 in __nanosleep_nocancel ( 
from /ddisk/d303/dumps/mhx239131/libc.so.6 
#2 0x080520a2 in Sleep() 
#3 0x08049ac1 in pollLDEs() 
#4 0x0804d1cd in doOnChange() 
#5 0x0804a642 in main() 

Nous avons essayé de reproduire le problème dans notre environnement, mais nous n'avons pas pu.

Qu'est-ce qui causerait le fichier core?

S'il vous plaît aidez-moi à éviter une telle situation.

Merci, Naga

Répondre

1

_dl_sysinfo_int80 est juste une fonction qui fait un appel système dans le noyau. Le vidage du noyau se produit donc sur un appel système (probablement celui utilisé par connect dans le premier exemple et nanosleep dans le second exemple), probablement parce que vous passez des pointeurs invalides.

Les pointeurs invalides peuvent être parce que le code qui appelle ces fonctions étant rompu ou parce que quelque part ailleurs dans le programme est cassé et corrompre la mémoire du programme.

Jetez un oeil à deux images ci-dessus (frame #2) dans le core dump pour les deux exemples et vérifiez les paramètres qui sont passés. Malheureusement, il semble que vous n'avez pas compilé avec les informations de débogage, ce qui rend plus difficile de les voir.

En outre, je suggère d'essayer valgrind et voir si elle trouve quelque chose.

0

Votre programme a presque fait pas coredump dans l'un des endroits ci-dessus. Le plus souvent, vous avez plusieurs threads dans votre processus (et un autre thread a causé le vidage du noyau), ou quelque chose d'externe a provoqué la mort de votre processus (par exemple 'kill -SIGABRT <pid>').

Si vous avez plusieurs threads, GDB 'info threads' et 'thread apply all where' sont susceptibles de fournir d'autres indices.