UNPKG

asmimproved-dbgmits

Version:

Provides the ability to control GDB and LLDB programmatically via GDB/MI.

192 lines 25.6 kB
// Copyright (c) 2015 Vadim Macagon // MIT License, see LICENSE file for full terms. "use strict"; require('source-map-support').install(); var chai = require('chai'); var parser = require('../lib/mi_output_parser'); var mi_output_1 = require('../lib/mi_output'); // aliases var expect = chai.expect; describe("MI Output Parser", function () { describe("Result Records", function () { it("parses 'done'", function () { var result = parser.parse('^done'); expect(result.recordType).to.equal(mi_output_1.RecordType.Done); }); it("parses 'done' from 'add breakpoint' command", function () { var id = '1'; var addr = '0x004009a3'; var func = 'main'; var filename = 'main.cpp'; var fullname = '/home/enlight/build/../hello-world/main.cpp'; var line = '5'; var result = parser.parse(("^done,bkpt={number=\"" + id + "\",type=\"breakpoint\",disp=\"keep\",enabled=\"y\",addr=\"" + addr + "\",") + ("func=\"" + func + "\",file=\"" + filename + "\",fullname=\"" + fullname + "\",") + ("line=\"" + line + "\",times=\"0\",original-location=\"" + func + "\"}")); expect(result.recordType).to.equal(mi_output_1.RecordType.Done); expect(result.data).to.have.property('bkpt'); var bkpt = result.data.bkpt; expect(bkpt).to.have.property('number', id); expect(bkpt).to.have.property('type', 'breakpoint'); expect(bkpt).to.have.property('disp', 'keep'); expect(bkpt).to.have.property('enabled', 'y'); expect(bkpt).to.have.property('addr', addr); expect(bkpt).to.have.property('func', func); expect(bkpt).to.have.property('file', filename); expect(bkpt).to.have.property('fullname', fullname); expect(bkpt).to.have.property('line', line); expect(bkpt).to.have.property('times', '0'); expect(bkpt).to.have.property('original-location', func); }); it("parses 'done' from 'insert-break' command for a multi-location breakpoint", function () { var breakpointId = '1'; var addr = '<MULTIPLE>'; var locationIds = ['1.1', '1.2', '1.3']; var filename = '../test/break_tests_target.cpp'; var fullname = '/media/sf_dbgmits/test/break_tests_target.cpp'; var locationLines = ['15', '20', '25']; var threadGroupId = 'i1'; var result = parser.parse(("^done,bkpt={number=\"" + breakpointId + "\",type=\"breakpoint\",disp=\"keep\",enabled=\"y\",") + ("addr=\"" + addr + "\",times=\"0\",original-location=\"funcC\"},") + ("{number=\"" + locationIds[0] + "\",enabled=\"y\",addr=\"0x0000000000400868\",func=\"funcC()\",") + ("file=\"" + filename + "\",fullname=\"" + fullname + "\",line=\"" + locationLines[0] + "\",") + ("thread-groups=[\"" + threadGroupId + "\"]},") + ("{number=\"" + locationIds[1] + "\",enabled=\"y\",addr=\"0x0000000000400872\",func=\"funcC(int)\",") + ("file=\"" + filename + "\",fullname=\"" + fullname + "\",line=\"" + locationLines[1] + "\",") + ("thread-groups=[\"" + threadGroupId + "\"]},") + ("{number=\"" + locationIds[2] + "\",enabled=\"y\",addr=\"0x0000000000400881\",func=\"funcC(int, bool)\",") + ("file=\"" + filename + "\",fullname=\"" + fullname + "\",line=\"" + locationLines[2] + "\",") + ("thread-groups=[\"" + threadGroupId + "\"]}")); expect(result.recordType).to.equal(mi_output_1.RecordType.Done); expect(result.data).to.have.property('bkpt').of.length(4); var bkpt = result.data.bkpt; expect(bkpt[0]).to.have.property('number', breakpointId); expect(bkpt[0]).to.have.property('addr', addr); for (var i = 1; i < bkpt.length; ++i) { expect(bkpt[i]).to.have.property('number', locationIds[i - 1]); expect(bkpt[i]).to.have.property('file', filename); expect(bkpt[i]).to.have.property('fullname', fullname); expect(bkpt[i]).to.have.property('line', locationLines[i - 1]); expect(bkpt[i]).to.have.property('thread-groups').of.length(1); expect(bkpt[i]['thread-groups']).to.contain(threadGroupId); } }); it("parses 'done' from 'get stack depth' command", function () { var frameLevel = '0'; var frameAddr = '0x000000000040080a'; var frameFunc = 'getNextInt'; var frameFile = '../test_target.cpp'; var frameFullname = '/test/test_target.cpp'; var frameLine = '6'; var result = parser.parse("^done,stack=[" + ("frame={level=\"" + frameLevel + "\",addr=\"" + frameAddr + "\",func=\"" + frameFunc + "\",file=\"" + frameFile + "\",") + ("fullname=\"" + frameFullname + "\",line=\"" + frameLine + "\"},") + "frame={level=\"1\",addr=\"0x0000000000400828\",func=\"printNextInt\",file=\"../test_target.cpp\"," + "fullname=\"/media/sf_dbgmits/test/test_target.cpp\",line=\"11\"}," + "frame={level=\"2\",addr=\"0x0000000000400860\",func=\"main\",file=\"../test_target.cpp\"," + "fullname=\"/media/sf_dbgmits/test/test_target.cpp\",line=\"19\"}]"); expect(result.recordType).to.equal(mi_output_1.RecordType.Done); expect(result.data).to.have.property('stack'); expect(result.data.stack).to.have.property('frame'); expect(result.data.stack.frame.length).to.equal(3); var frame = result.data.stack.frame[0]; expect(frame).to.have.property('level', frameLevel); expect(frame).to.have.property('addr', frameAddr); expect(frame).to.have.property('func', frameFunc); expect(frame).to.have.property('file'); expect(frame).to.have.property('fullname'); expect(frame).to.have.property('line', frameLine); }); it("parses 'done' from 'get locals' command", function () { var result = parser.parse('^done,locals=[name="A",name="B",name="C"]'); expect(result.recordType).to.equal(mi_output_1.RecordType.Done); expect(result.data).to.have.property('locals'); expect(result.data.locals).to.have.property('name'); expect(result.data.locals.name.length).to.equal(3); expect(result.data.locals.name[0]).to.equal('A'); expect(result.data.locals.name[1]).to.equal('B'); expect(result.data.locals.name[2]).to.equal('C'); }); it("parses 'done' from 'get arguments' command", function () { var result = parser.parse('^done,stack-args=[frame={level="0",args=[{name="d",value="300"},' + '{name="e",value="0x0000000000400ef4 \\"Test\\""},{name="f",value="0x00007fffffffed40"}]}]'); expect(result.recordType).to.equal(mi_output_1.RecordType.Done); expect(result.data).to.have.property('stack-args'); expect(result.data['stack-args']).to.have.property('frame'); }); it("parses 'running'", function () { var result = parser.parse('^running'); expect(result.recordType).to.equal(mi_output_1.RecordType.Running); }); it("parses 'connected'", function () { var result = parser.parse('^connected'); expect(result.recordType).to.equal(mi_output_1.RecordType.Connected); }); it("parses 'error'", function () { var msg = "Command 'target-select'. Error connecting to target 'somehost'."; var result = parser.parse('^error,msg="' + msg + '"'); expect(result.recordType).to.equal(mi_output_1.RecordType.Error); expect(result.data.msg).to.equal(msg); }); it("parses 'error' with code", function () { var msg = "Command 'target-select'. Error connecting to target 'somehost'."; var code = "undefined-command"; var result = parser.parse('^error,msg="' + msg + '",code="' + code + '"'); expect(result.recordType).to.equal(mi_output_1.RecordType.Error); expect(result.data.msg).to.equal(msg); expect(result.data.code).to.equal(code); }); it("parses 'exit'", function () { var result = parser.parse('^exit'); expect(result.recordType).to.equal(mi_output_1.RecordType.Exit); }); }); describe("Stream Records", function () { it("parses double-quoted text from console output stream", function () { var testStr = 'console output stream text'; var result = parser.parse('~"' + testStr + '"'); expect(result.recordType).to.equal(mi_output_1.RecordType.DebuggerConsoleOutput); expect(result.data).to.equal(testStr); }); it("parses double-quoted text from target output stream", function () { var testStr = 'target output stream text'; var result = parser.parse('@"' + testStr + '"'); expect(result.recordType).to.equal(mi_output_1.RecordType.TargetOutput); expect(result.data).to.equal(testStr); }); it("parses double-quoted text from debugger output stream", function () { var testStr = 'debugger output stream text'; var result = parser.parse('&"' + testStr + '"'); expect(result.recordType).to.equal(mi_output_1.RecordType.DebuggerLogOutput); expect(result.data).to.equal(testStr); }); }); describe("Async Records", function () { it("parses exec", function () { var asyncClass = 'stopped'; var testStr = "*" + asyncClass + ",reason=\"signal-received\",signal-name=\"SIGINT\",signal-meaning=\"Interrupt\""; var result = parser.parse(testStr); expect(result.recordType).to.equal(mi_output_1.RecordType.AsyncExec); expect(result.data.length).to.equal(2); expect(result.data[0]).to.equal(asyncClass); expect(result.data[1]).to.contain.keys(['reason', 'signal-name']); }); it("parses status", function () { var asyncClass = 'download'; var testStr = "+" + asyncClass; var result = parser.parse(testStr); expect(result.recordType).to.equal(mi_output_1.RecordType.AsyncStatus); expect(result.data.length).to.equal(2); }); it("parses notify", function () { var asyncClass = 'thread-group-started'; var testStr = "=" + asyncClass + ",id=\"i1\",pid=\"6550\""; var result = parser.parse(testStr); expect(result.recordType).to.equal(mi_output_1.RecordType.AsyncNotify); expect(result.data.length).to.equal(2); expect(result.data[0]).to.equal(asyncClass); expect(result.data[1]).to.contain.keys(['id', 'pid']); }); }); }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlfb3V0cHV0X3BhcnNlcl90ZXN0cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3Rlc3QvbWlfb3V0cHV0X3BhcnNlcl90ZXN0cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxtQ0FBbUM7QUFDbkMsZ0RBQWdEOztBQUVoRCxPQUFPLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztBQUV4QyxJQUFZLElBQUksV0FBTSxNQUFNLENBQUMsQ0FBQTtBQUM3QixJQUFZLE1BQU0sV0FBTSx5QkFBeUIsQ0FBQyxDQUFBO0FBQ2xELDBCQUEyQixrQkFBa0IsQ0FBQyxDQUFBO0FBRTlDLFVBQVU7QUFDVixJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0FBRXpCLFFBQVEsQ0FBQyxrQkFBa0IsRUFBRTtJQUMzQixRQUFRLENBQUMsZ0JBQWdCLEVBQUU7UUFDekIsRUFBRSxDQUFDLGVBQWUsRUFBRTtZQUNsQixJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ25DLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxzQkFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RELENBQUMsQ0FBQyxDQUFDO1FBRUgsRUFBRSxDQUFDLDZDQUE2QyxFQUFFO1lBQ2hELElBQUksRUFBRSxHQUFHLEdBQUcsQ0FBQztZQUNiLElBQUksSUFBSSxHQUFHLFlBQVksQ0FBQztZQUN4QixJQUFJLElBQUksR0FBRyxNQUFNLENBQUM7WUFDbEIsSUFBSSxRQUFRLEdBQUcsVUFBVSxDQUFDO1lBQzFCLElBQUksUUFBUSxHQUFHLDZDQUE2QyxDQUFDO1lBQzdELElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQztZQUNmLElBQUksTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQ3ZCLDJCQUF1QixFQUFFLGtFQUFxRCxJQUFJLFNBQUk7Z0JBQ3RGLGFBQVMsSUFBSSxrQkFBVyxRQUFRLHNCQUFlLFFBQVEsU0FBSTtnQkFDM0QsYUFBUyxJQUFJLDJDQUFrQyxJQUFJLFNBQUksQ0FDeEQsQ0FBQztZQUVGLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxzQkFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3BELE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFN0MsSUFBSSxJQUFJLEdBQVEsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7WUFDakMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsQ0FBQztZQUM1QyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQ3BELE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDOUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUM5QyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQzVDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDNUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNoRCxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3BELE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDNUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRSxHQUFHLENBQUMsQ0FBQztZQUM1QyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDM0QsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMsMkVBQTJFLEVBQUU7WUFDOUUsSUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDO1lBQ3pCLElBQU0sSUFBSSxHQUFHLFlBQVksQ0FBQztZQUMxQixJQUFNLFdBQVcsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDMUMsSUFBTSxRQUFRLEdBQUcsZ0NBQWdDLENBQUM7WUFDbEQsSUFBTSxRQUFRLEdBQUcsK0NBQStDLENBQUM7WUFDakUsSUFBTSxhQUFhLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ3pDLElBQU0sYUFBYSxHQUFHLElBQUksQ0FBQztZQUMzQixJQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUN6QiwyQkFBdUIsWUFBWSx5REFBOEM7Z0JBQ2pGLGFBQVMsSUFBSSxrREFBeUM7Z0JBQ3RELGdCQUFZLFdBQVcsQ0FBQyxDQUFDLENBQUMsb0VBQXlEO2dCQUNuRixhQUFTLFFBQVEsc0JBQWUsUUFBUSxrQkFBVyxhQUFhLENBQUMsQ0FBQyxDQUFDLFNBQUk7Z0JBQ3ZFLHVCQUFtQixhQUFhLFdBQU07Z0JBQ3RDLGdCQUFZLFdBQVcsQ0FBQyxDQUFDLENBQUMsdUVBQTREO2dCQUN0RixhQUFTLFFBQVEsc0JBQWUsUUFBUSxrQkFBVyxhQUFhLENBQUMsQ0FBQyxDQUFDLFNBQUk7Z0JBQ3ZFLHVCQUFtQixhQUFhLFdBQU07Z0JBQ3RDLGdCQUFZLFdBQVcsQ0FBQyxDQUFDLENBQUMsNkVBQWtFO2dCQUM1RixhQUFTLFFBQVEsc0JBQWUsUUFBUSxrQkFBVyxhQUFhLENBQUMsQ0FBQyxDQUFDLFNBQUk7Z0JBQ3ZFLHVCQUFtQixhQUFhLFVBQUssQ0FDdEMsQ0FBQztZQUVGLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxzQkFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3BELE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUUxRCxJQUFNLElBQUksR0FBUSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztZQUNuQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQ3pELE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFFL0MsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUM7Z0JBQ3JDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFD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QUFRLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDdkMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzNDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDcEQsQ0FBQyxDQUFDLENBQUM7UUFFSCxFQUFFLENBQUMseUNBQXlDLEVBQUU7WUFDNUMsSUFBSSxNQUFNLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO1lBRXZFLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxzQkFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3BELE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDL0MsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDcEQsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25ELE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pELE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2pELE1BQU0s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