from __future__ import print_function import lldb import time from lldbsuite.test.lldbtest import * from lldbsuite.test.decorators import * from gdbclientutils import * 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())