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 this the pipe connected to gdb). MISession MIPlugin.createSession(InputStream, OutputStream); During initialisation of the session(MISession) two threads are created(TxThread, RxThread). MI Commands created via the CommandFactory are added to the TxQueue, the TxThread will then wake up generate a token(ID) for the command and send it 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 would parse the response constructing an MIOutput then search 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, clients interested in those notifications should register to MISession. * MI Parsing There is a generic MI parser (MIParser) constructing an Abstract Syntax Tree. For example, a ResultRecord response after a break-insert, the parser will generate this AST: -break-insert main ^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 = 0 - 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.