| import lldb |
| from lldbsuite.support import seven |
| from lldbsuite.test.lldbtest import * |
| from lldbsuite.test.decorators import * |
| from lldbsuite.test.gdbclientutils import * |
| from lldbsuite.test.lldbgdbclient import GDBRemoteTestBase |
| |
| |
| class TestReadMemory(GDBRemoteTestBase): |
| def test_x_with_prefix(self): |
| class MyResponder(MockGDBServerResponder): |
| def qSupported(self, client_features): |
| # binary-upload+ indicates we use the gdb style of x packets |
| return super().qSupported(client_features) + ";binary-upload+" |
| |
| def x(self, addr, length): |
| return "bfoobar" if addr == 0x1000 else "E01" |
| |
| self.server.responder = MyResponder() |
| target = self.dbg.CreateTargetWithFileAndTargetTriple("", "x86_64-pc-linux") |
| process = self.connect(target) |
| |
| error = lldb.SBError() |
| self.assertEqual(b"foobar", process.ReadMemory(0x1000, 10, error)) |
| |
| def test_x_bare(self): |
| class MyResponder(MockGDBServerResponder): |
| def x(self, addr, length): |
| # The OK response indicates we use the old lldb style. |
| if addr == 0 and length == 0: |
| return "OK" |
| return "foobar" if addr == 0x1000 else "E01" |
| |
| self.server.responder = MyResponder() |
| target = self.dbg.CreateTargetWithFileAndTargetTriple("", "x86_64-pc-linux") |
| process = self.connect(target) |
| |
| error = lldb.SBError() |
| self.assertEqual(b"foobar", process.ReadMemory(0x1000, 10, error)) |
| |
| def test_m_fallback(self): |
| class MyResponder(MockGDBServerResponder): |
| def x(self, addr, length): |
| # If `x` is unsupported, we should fall back to `m`. |
| return "" |
| |
| def readMemory(self, addr, length): |
| return seven.hexlify("foobar") if addr == 0x1000 else "E01" |
| |
| self.server.responder = MyResponder() |
| target = self.dbg.CreateTargetWithFileAndTargetTriple("", "x86_64-pc-linux") |
| process = self.connect(target) |
| |
| error = lldb.SBError() |
| self.assertEqual(b"foobar", process.ReadMemory(0x1000, 10, error)) |