GDB / MI détectant la cible en attente d’entrée

J’écris un wrapper GDB pour mon projet Java. Existe-t-il un moyen d’identifier le moment où l’application cible dans la BDG attend les données de l’utilisateur?

En gros, vous devez redirect les E / S standard vers des pseudo-terminaux sous des systèmes POSIX. Je décrirai comment faire ci-dessous.

Ecrivez un programme “lanceur” indépendant et séparé qui:

  • Reçoit un descripteur de fichier via un socket de domaine Unix .
  • Redirige stdin, stdout et stderr vers le descripteur de fichier reçu ci-dessus via la séquence standard fork (), dup2 (), execl () .

Dans votre programme de contrôle Java:

  1. Ouvrez une paire de pseudo-terminaux (voir aussi l’exemple pty_fork.c lié à ci-dessus)
  2. Démarrez le programme de lancement. Enregistrement de son identifiant de processus dans LAUNCHER_PID. Le programme de lancement se bloquerait finalement dans recvmsg () en attendant de recevoir le nouveau descripteur de fichier.
  3. Exécuter “set-suivez-fork-mode child” dans GDB
  4. Associer la GDB à LAUNDHER_PID
  5. Envoyez la fin du pty esclave au programme de lancement . Le programme de lancement reviendrait alors de recvmsg () vers la séquence fock (), dup2 (), execl ().

Vous pouvez ensuite détecter que le programme en cours de débogage attend l’entrée de l’utilisateur, par exemple en convertissant l’extrémité principale du descripteur de fichier pty en canal NIO, en le réglant en mode non bloquant et en surveillant l’écriture principale avec un sélecteur .

Vous aurez besoin d’un chemin de code distinct pour prendre en charge Microsoft Windows.