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