2012-10-22 6 views
1

J'ai besoin de suivre les changements apportés à un ensemble de variables dans une application donnée du début à la fin du programme. J'ai pensé à utiliser gdb.Automatisation de gdb - Tuyauterie stdin et stdout pour gdb

Comment planifié à haut niveau, lancez gdb, définissez des points de contrôle pour toutes mes variables (ils sont tous globaux pour le moment), et exécutez la commande "run", et une fois qu'il y a des changements, gdb l'enregistrera et arrêtez à cet endroit et j'exécuterais "continuer". Faites-le continuellement jusqu'à ce que l'application se termine. Par conséquent, je devrais avoir des journaux détaillés à toutes les variables requises.

Pour automatiser ce processus, j'ai écrit un code java où j'ouvre gdb en tant que sous-processus et j'essaie d'interagir avec lui en utilisant handle pour sous-traiter stdin et stdout. Je crée un sous-processus en Java en utilisant la classe processbuilder, et j'écris stdin et stdout du sous-processus créé. Mais cela ne semble pas fonctionner comme je le pensais. Fondamentalement à la lecture de stdout, je peux voir que gdb démarre et charge l'application cible requise, mais pour une raison quelconque, je suis incapable d'interagir avec GDB en écrivant à son stdin.

Voici mon code de test je l'ai écrit pour automatiser gdb

import java.io.BufferedReader; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.io.OutputStream; 
import java.util.ArrayList; 


public class GDBTest { 
    private InputStream outStr = null; 
    private OutputStream inpStr = null; 
    private boolean state = false; 

    public static void main(String[] args) { 
     GDBTest gdb = new GDBTest(); 
     gdb.test(null); 
    } 

    public void test(String[] args) { 
     ArrayList<String> cmd = new ArrayList<String>(); 
     cmd.add("gdb"); 
     cmd.add("testApp"); 
     ProcessBuilder pb = new ProcessBuilder(cmd); 
     try { 
      Process p = pb.start(); 
      inpStr = p.getOutputStream(); /* Handle to the stdin of process */ 
      outStr = p.getInputStream(); /* Handle to the stdout of process */ 
      BufferedReader br = new BufferedReader(new InputStreamReader(outStr)); 

      while(true) { 
       System.out.println(br.readLine()); 
       state = br.ready(); 
       if(state == false) { 
        break; 
       } 
      } 

      inpStr.write("watch c88\n".getBytes()); 
      while(br.ready()) { 
       System.out.println(br.readLine()); 
      } 

      inpStr.write("run\n".getBytes()); 
      while(br.ready()) { 
       System.out.println(br.readLine()); 
      } 

     } catch (Exception e) { 
      System.out.println(e); 
     } 
    } 
} 

Je ne sais pas ce qui est mal avec ça! Quelqu'un peut-il s'il vous plaît suggérer comment automatiser GDB de cette façon.

Merci,

MicroKernel

Répondre

0

Oh figured it out, je manquais inpStr.flush() ... Il fixe tout!