| <html> |
| <head> |
| </head> |
| <body> |
| <pre> |
| 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 Process |
| |
| For convienience, to java.lang.Process is provided. |
| |
| MISession.getSessionProcess(); |
| |
| This Process talks directly to gdb and is smart enough to wrap any command |
| in CLICommand etc .. |
| |
| MISession.getMIInferior() |
| |
| MIInferior implements Process for the Inferiror. |
| |
| ***** |
| MI <==> CDI Adapters |
| |
| To do. |
| </pre> |
| </body> |
| </html> |