import lldb import time from lldbsuite.test.lldbtest import * from lldbsuite.test.decorators import * from lldbsuite.test.gdbclientutils import * from lldbsuite.test.lldbgdbclient import GDBRemoteTestBase class TestRegDefinitionInParts(GDBRemoteTestBase): @skipIfXmlSupportMissing @skipIfRemote def test(self): """ Test that lldb correctly fetches the target definition file in multiple chunks if the remote server only provides the content in small parts, and the small parts it provides is smaller than the maximum packet size that it declared at the start of the debug session. qemu does this. """ class MyResponder(MockGDBServerResponder): def qXferRead(self, obj, annex, offset, length): if annex == "target.xml": return ( """ i386:x86-64 """, False, ) if annex == "i386-64bit-core.xml" and offset == 0: return ( """ """, False, ) return None, False def readRegister(self, regnum): return "" def readRegisters(self): return "0600000000000000c0b7c00080fffffff021c60080ffffff1a00000000000000020000000000000078b7c00080ffffff203f8ca090ffffff103f8ca090ffffff3025990a80ffffff809698000000000070009f0a80ffffff020000000000000000eae10080ffffff00000000000000001822d74f1a00000078b7c00080ffffff0e12410080ffff004602000011111111222222223333333300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000007f0300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000801f0000" def haltReason(self): return "T02thread:dead;threads:dead;" def qfThreadInfo(self): return "mdead" def qC(self): return "" def qSupported(self, client_supported): return "PacketSize=1000;qXfer:features:read+" def QThreadSuffixSupported(self): return "OK" def QListThreadsInStopReply(self): return "OK" self.server.responder = MyResponder() if self.TraceOn(): self.runCmd("log enable gdb-remote packets") time.sleep(10) self.addTearDownHook(lambda: self.runCmd("log disable gdb-remote packets")) target = self.dbg.CreateTargetWithFileAndArch(None, None) process = self.connect(target) if self.TraceOn(): interp = self.dbg.GetCommandInterpreter() result = lldb.SBCommandReturnObject() interp.HandleCommand("target list", result) print(result.GetOutput()) rip_valobj = process.GetThreadAtIndex(0).GetFrameAtIndex(0).FindRegister("rip") self.assertEqual(rip_valobj.GetValueAsUnsigned(), 0x00FFFF800041120E) ss_valobj = process.GetThreadAtIndex(0).GetFrameAtIndex(0).FindRegister("ss") self.assertEqual(ss_valobj.GetValueAsUnsigned(), 0x22222222) if self.TraceOn(): print("rip is 0x%x" % rip_valobj.GetValueAsUnsigned()) print("ss is 0x%x" % ss_valobj.GetValueAsUnsigned())