Pourquoi gdb se bloquer?

J’ai une application que je débogue et j’essaie de comprendre comment fonctionne gdb et pourquoi je ne suis pas capable parfois de passer à travers l’application. Le problème que j’éprouve est que gdb va se bloquer et que le processus auquel il est attaché entrera dans un état défunt lorsque je parcourrai le programme. Une fois que gdb se bloque et que je dois le tuer pour libérer le terminal (ctrl-C ne fonctionne pas, je dois le faire depuis une autre fenêtre de terminal en obtenant l’identifiant du processus pour cette session gdb et en utilisant kill -9).

Je suppose que gdb est suspendu car il attend que l’application s’arrête à la prochaine instruction et que l’application termine l’exécution sans que gdb ne l’identifie. Mais c’est juste une spéculation de ma part du comportement que j’ai observé jusqu’ici. Donc, ma question est de savoir si quelqu’un a déjà vu ce type de comportement et / ou pourrait suggérer quelle pourrait en être la cause. Je pense que cela pourrait m’aider à améliorer ma stratégie de débogage.

Au cas où cela compte, j’utilise g ++ 4.4.3, gdb 7.1, fonctionnant sur Ubuntu 10.04 x86_64.

Je dirais que le processus de débogage ne restrait pas inactif si c’était la cause du blocage. Chaque fois que GDB a terminé une étape, il doit mettre à jour les expressions à imprimer. Il peut s’agir de pointeurs suivants et, dans certains cas, il peut y échouer (bien que je ne rappelle pas un réel “blocage”). Il essaie également généralement de mettre à jour votre trace de stack. Si la trace de la stack a été corrompue et n’est plus cohérente, elle pourrait être piégée dans une boucle sans fin. La connexion de gdb à un strace pour voir quel type d’activité se déroule pendant le blocage peut être un bon moyen de mieux comprendre le problème.

(Par exemple, accéder à des sources via un assembly NFS / SSHFS qui ne fonctionne plus est l’une des raisons les plus fréquentes pour lesquelles gdb se bloque, ici: P)

J’ai eu un problème similaire et l’ai résolu en envoyant un signal CONT au processus en cours de débogage.