Note this is an interim the document and subject to changes. **** This MI implementation is base on GDB/MI 5.2.1. * Command/Response channels To create an MISession an InputStream and OutputStream are needed(assuming it is the pipe connected to gdb). MISession misession = new MISession(InputStream, OutputStream); During initialisation of the session(MISession) two threads are created TxThread, RxThread and associative list queues TxQueue and RxQueue: - The RxThread thread is block on readig the output of the pipe(gdb) for any responses. - The TxThread thread is block waiting for command. MI Commands are created via the CommandFactory and are added to the TxQueue, the TxThread will then wake up generate a token(ID) for the command and send it to the pipe(gdb), after transmission the command is then move to the RxQueue waiting for the result(MIResultRecord). Any responses will wake the RxThread, the thread will parse the response constructing an MIOutput, then it searches the RxQueue for any commands with the same token waking any thread waiting for a synchronous response(MIResultRecord). Any out-of-band responses(MIOOBRecord) are dispatch to MISession observers, clients interested in notifications should register to the MISession. * MI Parsing There is a generic MI parser (MIParser) constructing an syntax tree of the output. For example, a ResultRecord response after a "-break-insert", the parser will generate this tree: 10-break-insert main 10^done,bkpt={number="1",type="breakpoint",disp="keep",enabled="y", addr="0x08048468",func="main",file="hello.c",line="4",times="0"} - MIOutput - MIOOBRecord[0] - MIResutRecord - token = 10 - ResultClass = "done" - MIResult[1] - MIResult[0] - variable = "bkpt" - value = MITuple - MIResult[9] - MiResult[0] - variable = "number" - MIConst = "1" - MiResult[1] - variable = "type" - MIConst = "breakpoint" - MiResult[2] - variable = "disp" - MIConst = "keep" - MiResult[3] - variable = "enabled" - MIConst = "y" - MiResult[4] - variable = "addr" - MIConst = "0x08048468" - MiResult[5] - variable = "func" - MIConst = "main" - MiResult[6] - variable = "file" - MIConst = "hello.c" - MiResult[7] - variable = "line" - MIConst = "4" - MiResult[8] - variable = "times" - MIConst = "0" MICommands will do there own parsing: session = MISession(in, out); MIBreakInsert cmd = new MIBreakInsert("main"); session.postCommand(cmd); // sent to gdb. MIBreakInsertInfo info = cmd.getBreakInsertInfo(); // Parsing of the Result Record. **** MI <==> CDI Adapters To do.