2009-12-07 6 views
0

Je travaille sur une coquille de base en C. Dans ma mise en œuvre de pipes, je compte les commandes sur la ligne et itérativement fork() un nouveau processus.Signal 11 segfault lors de l'appel système wait()?

A la fin de chaque itération je wait() sur l'enfant avant de passer à la commande suivante. Ce fonctionnait très bien dans le code précédent, mais en quelque sorte, je me suis cassé le:

Program terminated with signal 11, Segmentation fault. 
#0 0xfef28730 in _waitpid() from /usr/lib/libc.so.1 

(gdb) backtrace 
#0 0xfef28730 in _waitpid() from /usr/lib/libc.so.1 
#1 0xfef28770 in _wait() from /usr/lib/libc.so.1 
#2 0xfef696d1 in wait() from /usr/lib/libc.so.1 
#3 0x08051428 in main() 

Je comprends que wait() récoltera simplement le processus zombie si l'enfant a déjà terminé.

Pourquoi et dans quel cas wait() provoquer une erreur de segmentation? Comment puis-je déboguer ce genre de chose?

+0

S'agit-il d'une application à un seul filetage? –

Répondre

1

Vous passez probablement un pointeur non valide pour l'argument d'état d'attente (2).

Quant à la façon de déboguer ce genre de chose, ma première étape serait d'installer les symboles de débogage pour votre bibliothèque C. Ensuite, regardez le pointeur sur lequel il est en défaut et tracez-le dans la pile (si possible).

1

Regardez les arguments que vous appelez wait() avec, et regardez également la mémoire d'écraser les problèmes. Exécutez votre programme à travers Valgrind pour obtenir de l'aide en détectant de nombreux écrasements très facilement.