_T = require('lua_lldb_test').create_test('TestComprehensive') function _T:Test0_CreateTarget() self.target = self:create_target() assertTrue(self.target:IsValid()) end function _T:Test1_Breakpoint() self.main_bp = self.target:BreakpointCreateByName('main', 'a.out') self.loop_bp = self.target:BreakpointCreateByLocation('main.c', 28) assertTrue(self.main_bp:IsValid() and self.main_bp:GetNumLocations() == 1) assertTrue(self.loop_bp:IsValid() and self.loop_bp:GetNumLocations() == 1) end function _T:Test2_Launch() local error = lldb.SBError() self.args = { 'arg' } self.process = self.target:Launch( self.debugger:GetListener(), self.args, nil, nil, self.output, nil, nil, 0, false, error ) assertTrue(error:Success()) assertTrue(self.process:IsValid()) end function _T:Test3_BreakpointFindVariables() -- checking "argc" value local thread = get_stopped_thread(self.process, lldb.eStopReasonBreakpoint) assertNotNil(thread) assertTrue(thread:IsValid()) local frame = thread:GetFrameAtIndex(0) assertTrue(frame:IsValid()) local error = lldb.SBError() local var_argc = frame:FindVariable('argc') assertTrue(var_argc:IsValid()) local var_argc_value = var_argc:GetValueAsSigned(error, 0) assertTrue(error:Success()) assertEqual(var_argc_value, 2) -- checking "inited" value local continue = self.process:Continue() assertTrue(continue:Success()) thread = get_stopped_thread(self.process, lldb.eStopReasonBreakpoint) assertNotNil(thread) assertTrue(thread:IsValid()) frame = thread:GetFrameAtIndex(0) assertTrue(frame:IsValid()) error = lldb.SBError() local var_inited = frame:FindVariable('inited') assertTrue(var_inited:IsValid()) self.var_inited = var_inited local var_inited_value = var_inited:GetValueAsUnsigned(error, 0) assertTrue(error:Success()) assertEqual(var_inited_value, 0xDEADBEEF) end function _T:Test3_RawData() local error = lldb.SBError() local address = self.var_inited:GetAddress() assertTrue(address:IsValid()) local size = self.var_inited:GetByteSize() local raw_data = self.process:ReadMemory(address:GetOffset(), size, error) assertTrue(error:Success()) local data_le = lldb.SBData.CreateDataFromUInt32Array(lldb.eByteOrderLittle, 1, {0xDEADBEEF}) local data_be = lldb.SBData.CreateDataFromUInt32Array(lldb.eByteOrderBig, 1, {0xDEADBEEF}) assertTrue(data_le:GetUnsignedInt32(error, 0) == 0xDEADBEEF or data_be:GetUnsignedInt32(error, 0) == 0xDEADBEEF) assertTrue(raw_data == "\xEF\xBE\xAD\xDE" or raw_data == "\xDE\xAD\xBE\xEF") end function _T:Test4_ProcessExit() self.loop_bp:SetAutoContinue(true) local continue = self.process:Continue() assertTrue(continue:Success()) assertTrue(self.process:GetExitStatus() == 0) end function _T:Test5_FileOutput() local f = io.open(self.output, 'r') assertEqual( read_file_non_empty_lines(f), { self.exe, table.unpack(self.args), 'I am a function.', 'sum = 5050' } ) f:close() end os.exit(_T:run())