2017-02-07 1 views
0

J'utilise gdb pour déboguer le programme suivant dans Ubuntu 16.04.Comment entrer du clavier lors du débogage en utilisant le mode distant de gdb?

#include<iostream> 
using namespace std; 
int main() { 
    int n; 
    cin>>n; 
    cout<<n<<endl; 
    return 0; 
} 

Lorsque je le débogue localement, je peux entrer des données en utilisant le clavier. Cependant, lorsque je débogue en utilisant le serveur gdb, je suis bloqué lorsque j'essaie d'entrer des données en utilisant stdin. Est-ce que quelqu'un sait comment résoudre ce problème?

+0

Vous pouvez exécuter votre programme, recherchez l'ID de processus (par exemple, xxxx) pour le programme. Ouvrez gdb avec "$ gdb -pid xxxx" ou si gdb est ouvert "(gdb) attachez xxxx". Vous devrez peut-être d'abord sudo gdb. Cela fonctionne mieux si vous utilisez un écran ou un tmux, etc. – InfinitelyManic

Répondre

2

Malheureusement, gdbserver ne vous aidera pas dans ce cas (pour l'instant). Il démarre simplement le programme en utilisant gdbserver 's tty, qui est sur la machine distante. C'est dommage car le protocole distant GDB has extensions to manage this, mais gdbserver ne l'implémente pas (jusqu'à présent).

Vous devez donc gérer vous-même votre programme. La solution la plus complète utilise socat pour créer un "ATS distant" pour vous et votre programme.

Sur la machine distante:

$ socat TCP-LISTEN:12345 EXEC:'<your program>',ptmx 

L'option ptmx permet d'utiliser un PTY comme mécanisme de communication inter-processus au lieu d'un socketpair. Il vous donnera un contrôle plus précis sur la mise en mémoire tampon à l'aide de paramètres tty, directement intégré dans l'interface de ligne de commande socat (voir man socat). Dans ce cas par défaut, il tamponne simplement jusqu'à ce qu'un caractère de nouvelle ligne soit écrit par <your program>.

De l'autre côté, exécutez:

$ socat - TCP:localhost:12345 

Et maintenant, vous avez votre ATS à distance, en plus GDB de.
Cela suppose que vous pouvez exécuter socat sur votre cible et que vous pouvez vous y connecter via un réseau TCP.

Si vous ne pouvez pas, vous pouvez également utiliser une ligne série libre, stty vos paramètres et exécuter votre programme contre l'utilisation du shell redirections:

$ stty -F /dev/ttyUSB0 raw 9600 
$ exec command <> /dev/ttyUSB0 >&0 2>&1 

Comme expliqué dans this answer.

Quoi qu'il en soit, vous devriez certainement envelopper votre solution et gdbserver a une option --wrapper vous permettant de programmer la façon dont le programme est exécuté en utilisant --multi.

Notez que l'utilisation de solutions multi-inférieures pour exécuter à distance socat et se connecter automatiquement au programme fourchu, celui que vous voulez déboguer, est trop bogué pour être expliqué et utilisé.