Débogage de l’application ncurses avec gdb

J’essaie de déboguer mon application ncurses à l’aide de gdb. J’utilise la commande tty pour redirect les E / S du programme vers un autre terminal. La sortie fonctionne à merveille, mais je rencontre des problèmes d’entrée. J’utilise la fonction getch () pour récupérer des symboles dans mon application. Donc, par exemple, si je le fais dans ma session gdb:

tty /dev/pts/5 

Je reçois ma sortie dans un autre onglet de la fenêtre de mon terminal (gnome-terminal). Mes sessions gdb sont bloquées, en attente de saisie, mais lorsque j’appuie sur une touche de mon / dev / pts / 5, elle est imprimée, mais l’application elle-même ne l’excepte pas en tant que symbole de saisie. Lorsque je tourne sans gdb, tout fonctionne bien, j’utilise également noecho (), les symboles ne doivent donc pas être affichés. Donc quel est le problème? Est-il possible en quelque sorte de gérer les entrées depuis un terminal redirigé?

Vous pouvez attacher à votre processus le débogage à partir d’un autre terminal au lieu d’essayer d’exécuter l’application à partir de gdb .

Exécutez votre processus comme d’habitude. Lorsqu’il est bloqué pour une entrée utilisateur, trouvez son ID de processus, puis associez-le avec gdb partir d’une autre fenêtre:

 gdb -p  

Votre problème est dû au fait que le programme s’attend toujours à ce que ses entrées interactives proviennent de votre session gdb .

Il est peut-être un peu tard pour répondre, mais j’espère que cela vous aidera: il a fallu un certain temps pour comprendre comment déboguer des applications ncurses. Enfin, j’ai créé un moyen très confortable avec gdbserver et tmux .

De cette façon, les entrées / sorties de gdb et de l’application sont complètement séparées:

debug.sh (le script qui lance le débogage):

 #!/bin/bash tmux splitw -h -p 50 "gdbserver :12345 ./yourapplication" tmux selectp -t 0 gdb -x debug.gdb 

debug.gdb (fichier de script gdb one-liner pour plus de confort):

 target remote localhost:12345 

Donc, de cette façon, l’application démarre à droite, gdb à gauche en attente de continuer ou tout autre élément habituel de gdb 🙂

Une fois que vous quittez, tmux ferme automatiquement le gdbserver (donc le panneau de droite également) et c’est tout 🙂