TestValueAPI.py revision 5503d468e43aae7d047c9b98baf626fc5b6c352d
15503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen""" 25503d468e43aae7d047c9b98baf626fc5b6c352dJohnny ChenTest some SBValue APIs. 35503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen""" 45503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen 55503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chenimport os, time 65503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chenimport re 75503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chenimport unittest2 85503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chenimport lldb, lldbutil 95503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chenfrom lldbtest import * 105503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen 115503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chenclass ValueAPITestCase(TestBase): 125503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen 135503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen mydir = os.path.join("python_api", "value") 145503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen 155503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen @unittest2.skipUnless(sys.platform.startswith("darwin"), "requires Darwin") 165503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen @python_api_test 175503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen def test_with_dsym(self): 185503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen """Exercise some SBValue APIs.""" 195503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen d = {'EXE': self.exe_name} 205503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen self.buildDsym(dictionary=d) 215503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen self.setTearDownCleanup(dictionary=d) 225503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen self.value_api(self.exe_name) 235503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen 245503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen @python_api_test 255503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen def test_with_dwarf(self): 265503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen """Exercise some SBValue APIs.""" 275503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen d = {'EXE': self.exe_name} 285503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen self.buildDwarf(dictionary=d) 295503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen self.setTearDownCleanup(dictionary=d) 305503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen self.value_api(self.exe_name) 315503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen 325503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen def setUp(self): 335503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen # Call super's setUp(). 345503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen TestBase.setUp(self) 355503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen # We'll use the test method name as the exe_name. 365503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen self.exe_name = self.testMethodName 375503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen # Find the line number to of function 'c'. 385503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen self.line = line_number('main.c', '// Break at this line') 395503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen 405503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen def value_api(self, exe_name): 415503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen """Exercise some SBValue APIs.""" 425503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen exe = os.path.join(os.getcwd(), exe_name) 435503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen 445503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen # Create a target by the debugger. 455503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen target = self.dbg.CreateTarget(exe) 465503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen self.assertTrue(target, VALID_TARGET) 475503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen 485503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen # Create the breakpoint inside function 'main'. 495503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen breakpoint = target.BreakpointCreateByLocation('main.c', self.line) 505503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen self.assertTrue(breakpoint, VALID_BREAKPOINT) 515503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen 525503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen # Now launch the process, and do not stop at entry point. 535503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen process = target.LaunchSimple(None, None, os.getcwd()) 545503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen self.assertTrue(process, PROCESS_IS_VALID) 555503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen 565503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen # Get Frame #0. 575503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen self.assertTrue(process.GetState() == lldb.eStateStopped) 585503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen thread = lldbutil.get_stopped_thread(process, lldb.eStopReasonBreakpoint) 595503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen self.assertTrue(thread != None, "There should be a thread stopped due to breakpoint condition") 605503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen frame0 = thread.GetFrameAtIndex(0) 615503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen 625503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen # Get variable 'str_ptr'. 635503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen value = frame0.FindVariable('str_ptr') 645503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen self.assertTrue(value, VALID_VARIABLE) 655503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen self.DebugSBValue(value) 665503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen 675503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen # Get child at index 5 => 'Friday'. 685503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen child = value.GetChildAtIndex(5, lldb.eNoDynamicValues, True) 695503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen self.assertTrue(child, VALID_VARIABLE) 705503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen self.DebugSBValue(child) 715503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen 725503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen self.expect(child.GetSummary(), exe=False, 735503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen substrs = ['Friday']) 745503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen 755503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen # Now try to get at the same variable using GetValueForExpressionPath(). 765503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen # These two SBValue objects should have the same value. 775503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen val2 = value.GetValueForExpressionPath('[5]') 785503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen self.assertTrue(val2, VALID_VARIABLE) 795503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen self.DebugSBValue(val2) 805503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen self.assertTrue(child.GetValue() == val2.GetValue() and 815503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen child.GetSummary() == val2.GetSummary()) 825503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen 835503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chenif __name__ == '__main__': 845503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen import atexit 855503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen lldb.SBDebugger.Initialize() 865503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen atexit.register(lambda: lldb.SBDebugger.Terminate()) 875503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen unittest2.main() 88