| """ Check that unavailable registers are reported when reading register sets.""" |
| |
| from textwrap import dedent |
| import lldb |
| from lldbsuite.test.lldbtest import * |
| from lldbsuite.test.decorators import * |
| from lldbsuite.test.gdbclientutils import * |
| from lldbsuite.test.lldbgdbclient import GDBRemoteTestBase |
| |
| |
| class MyResponder(MockGDBServerResponder): |
| def readRegisters(self): |
| return "E01" |
| |
| def readRegister(self, regnum): |
| if regnum in [0, 1, 2]: |
| return "E01" |
| return "5555555555555555" |
| |
| def qHostInfo(self): |
| # The triple is hex encoded ASCII "x86_64-linux-gnu". |
| return "triple:7838365F36342D6C696E75782D676E75;" |
| |
| |
| class TestRegistersUnavailable(GDBRemoteTestBase): |
| @skipIfRemote |
| # So that we have multiple register sets. |
| @skipIfLLVMTargetMissing("X86") |
| def test_unavailable_registers(self): |
| self.server.responder = MyResponder() |
| target = self.dbg.CreateTarget("") |
| |
| if self.TraceOn(): |
| self.runCmd("log enable gdb-remote packets process") |
| self.addTearDownHook( |
| lambda: self.runCmd("log disable gdb-remote packets process") |
| ) |
| |
| process = self.connect(target) |
| lldbutil.expect_state_changes( |
| self, self.dbg.GetListener(), process, [lldb.eStateStopped] |
| ) |
| |
| # We are using a long regex pattern here to check that the indentation |
| # is correct when you have multiple register sets and they all have |
| # some missing registers. |
| self.expect( |
| "register read --all", |
| patterns=[ |
| "(?sm)^general purpose registers:\n" |
| "^\s+rdx = 0x5555555555555555\n" |
| ".*" |
| "^3 registers were unavailable.\n" |
| "\n" |
| "^supplementary registers:\n" |
| "^\s+edx = 0x55555555\n" |
| ".*" |
| "^12 registers were unavailable." |
| ], |
| ) |