| 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)) |