TestValueAPI.py revision 21b1984e161b0cadee331d32bfd721eccfdf4b1f
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 1721b1984e161b0cadee331d32bfd721eccfdf4b1fJohnny Chen @dsym_test 185503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen def test_with_dsym(self): 195503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen """Exercise some SBValue APIs.""" 205503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen d = {'EXE': self.exe_name} 215503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen self.buildDsym(dictionary=d) 225503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen self.setTearDownCleanup(dictionary=d) 235503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen self.value_api(self.exe_name) 245503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen 255503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen @python_api_test 2621b1984e161b0cadee331d32bfd721eccfdf4b1fJohnny Chen @dwarf_test 275503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen def test_with_dwarf(self): 285503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen """Exercise some SBValue APIs.""" 295503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen d = {'EXE': self.exe_name} 305503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen self.buildDwarf(dictionary=d) 315503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen self.setTearDownCleanup(dictionary=d) 325503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen self.value_api(self.exe_name) 335503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen 345503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen def setUp(self): 355503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen # Call super's setUp(). 365503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen TestBase.setUp(self) 375503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen # We'll use the test method name as the exe_name. 385503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen self.exe_name = self.testMethodName 395503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen # Find the line number to of function 'c'. 405503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen self.line = line_number('main.c', '// Break at this line') 415503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen 425503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen def value_api(self, exe_name): 435503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen """Exercise some SBValue APIs.""" 445503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen exe = os.path.join(os.getcwd(), exe_name) 455503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen 465503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen # Create a target by the debugger. 475503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen target = self.dbg.CreateTarget(exe) 485503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen self.assertTrue(target, VALID_TARGET) 495503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen 505503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen # Create the breakpoint inside function 'main'. 515503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen breakpoint = target.BreakpointCreateByLocation('main.c', self.line) 525503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen self.assertTrue(breakpoint, VALID_BREAKPOINT) 535503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen 545503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen # Now launch the process, and do not stop at entry point. 555503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen process = target.LaunchSimple(None, None, os.getcwd()) 565503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen self.assertTrue(process, PROCESS_IS_VALID) 575503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen 585503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen # Get Frame #0. 595503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen self.assertTrue(process.GetState() == lldb.eStateStopped) 605503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen thread = lldbutil.get_stopped_thread(process, lldb.eStopReasonBreakpoint) 615503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen self.assertTrue(thread != None, "There should be a thread stopped due to breakpoint condition") 625503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen frame0 = thread.GetFrameAtIndex(0) 635503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen 6462ebe5aca6d93eecba7c9917440107f4b24a09cdJohnny Chen # Get global variable 'days_of_week'. 6562ebe5aca6d93eecba7c9917440107f4b24a09cdJohnny Chen list = target.FindGlobalVariables('days_of_week', 1) 6662ebe5aca6d93eecba7c9917440107f4b24a09cdJohnny Chen days_of_week = list.GetValueAtIndex(0) 6762ebe5aca6d93eecba7c9917440107f4b24a09cdJohnny Chen self.assertTrue(days_of_week, VALID_VARIABLE) 6862ebe5aca6d93eecba7c9917440107f4b24a09cdJohnny Chen self.assertTrue(days_of_week.GetNumChildren() == 7, VALID_VARIABLE) 6962ebe5aca6d93eecba7c9917440107f4b24a09cdJohnny Chen self.DebugSBValue(days_of_week) 7062ebe5aca6d93eecba7c9917440107f4b24a09cdJohnny Chen 71638ebcfea6328816ba5e9fd21e40cf5d3f060e2eJohnny Chen # Get global variable 'weekdays'. 72638ebcfea6328816ba5e9fd21e40cf5d3f060e2eJohnny Chen list = target.FindGlobalVariables('weekdays', 1) 73638ebcfea6328816ba5e9fd21e40cf5d3f060e2eJohnny Chen weekdays = list.GetValueAtIndex(0) 74638ebcfea6328816ba5e9fd21e40cf5d3f060e2eJohnny Chen self.assertTrue(weekdays, VALID_VARIABLE) 75638ebcfea6328816ba5e9fd21e40cf5d3f060e2eJohnny Chen self.assertTrue(weekdays.GetNumChildren() == 5, VALID_VARIABLE) 76638ebcfea6328816ba5e9fd21e40cf5d3f060e2eJohnny Chen self.DebugSBValue(weekdays) 77638ebcfea6328816ba5e9fd21e40cf5d3f060e2eJohnny Chen 78638ebcfea6328816ba5e9fd21e40cf5d3f060e2eJohnny Chen # Get global variable 'g_table'. 79638ebcfea6328816ba5e9fd21e40cf5d3f060e2eJohnny Chen list = target.FindGlobalVariables('g_table', 1) 80638ebcfea6328816ba5e9fd21e40cf5d3f060e2eJohnny Chen g_table = list.GetValueAtIndex(0) 81638ebcfea6328816ba5e9fd21e40cf5d3f060e2eJohnny Chen self.assertTrue(g_table, VALID_VARIABLE) 82638ebcfea6328816ba5e9fd21e40cf5d3f060e2eJohnny Chen self.assertTrue(g_table.GetNumChildren() == 2, VALID_VARIABLE) 83638ebcfea6328816ba5e9fd21e40cf5d3f060e2eJohnny Chen self.DebugSBValue(g_table) 84638ebcfea6328816ba5e9fd21e40cf5d3f060e2eJohnny Chen 85084fd8945b922818e069adfb72ac39936466e221Johnny Chen fmt = lldbutil.BasicFormatter() 86638ebcfea6328816ba5e9fd21e40cf5d3f060e2eJohnny Chen cvf = lldbutil.ChildVisitingFormatter(indent_child=2) 87638ebcfea6328816ba5e9fd21e40cf5d3f060e2eJohnny Chen rdf = lldbutil.RecursiveDecentFormatter(indent_child=2) 88084fd8945b922818e069adfb72ac39936466e221Johnny Chen if self.TraceOn(): 89084fd8945b922818e069adfb72ac39936466e221Johnny Chen print fmt.format(days_of_week) 90084fd8945b922818e069adfb72ac39936466e221Johnny Chen print cvf.format(days_of_week) 91638ebcfea6328816ba5e9fd21e40cf5d3f060e2eJohnny Chen print cvf.format(weekdays) 92638ebcfea6328816ba5e9fd21e40cf5d3f060e2eJohnny Chen print rdf.format(g_table) 93084fd8945b922818e069adfb72ac39936466e221Johnny Chen 94f24f1cd1584fd2af8f3dfa6919fe493b86b17729Johnny Chen # Get variable 'my_int_ptr'. 95f24f1cd1584fd2af8f3dfa6919fe493b86b17729Johnny Chen value = frame0.FindVariable('my_int_ptr') 96f24f1cd1584fd2af8f3dfa6919fe493b86b17729Johnny Chen self.assertTrue(value, VALID_VARIABLE) 97f24f1cd1584fd2af8f3dfa6919fe493b86b17729Johnny Chen self.DebugSBValue(value) 98f24f1cd1584fd2af8f3dfa6919fe493b86b17729Johnny Chen 99f24f1cd1584fd2af8f3dfa6919fe493b86b17729Johnny Chen # Get what 'my_int_ptr' points to. 100f24f1cd1584fd2af8f3dfa6919fe493b86b17729Johnny Chen pointed = value.GetChildAtIndex(0) 101f24f1cd1584fd2af8f3dfa6919fe493b86b17729Johnny Chen self.assertTrue(pointed, VALID_VARIABLE) 102f24f1cd1584fd2af8f3dfa6919fe493b86b17729Johnny Chen self.DebugSBValue(pointed) 103f24f1cd1584fd2af8f3dfa6919fe493b86b17729Johnny Chen 104ab881d86a527f17df84c200322b2e5c9bf64b0deJohnny Chen # While we are at it, verify that 'my_int_ptr' points to 'g_my_int'. 105ab881d86a527f17df84c200322b2e5c9bf64b0deJohnny Chen symbol = target.ResolveLoadAddress(int(pointed.GetLocation(), 0)).GetSymbol() 106ab881d86a527f17df84c200322b2e5c9bf64b0deJohnny Chen self.assertTrue(symbol) 107ab881d86a527f17df84c200322b2e5c9bf64b0deJohnny Chen self.expect(symbol.GetName(), exe=False, 108ab881d86a527f17df84c200322b2e5c9bf64b0deJohnny Chen startstr = 'g_my_int') 109ab881d86a527f17df84c200322b2e5c9bf64b0deJohnny Chen 1105503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen # Get variable 'str_ptr'. 1115503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen value = frame0.FindVariable('str_ptr') 1125503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen self.assertTrue(value, VALID_VARIABLE) 1135503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen self.DebugSBValue(value) 1145503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen 1154b067250787b3d1763a58fa142cc21cf995e942cJohnny Chen # SBValue::TypeIsPointerType() should return true. 1164b067250787b3d1763a58fa142cc21cf995e942cJohnny Chen self.assertTrue(value.TypeIsPointerType()) 1174b067250787b3d1763a58fa142cc21cf995e942cJohnny Chen 1184b067250787b3d1763a58fa142cc21cf995e942cJohnny Chen # Verify the SBValue::GetByteSize() API is working correctly. 1194b067250787b3d1763a58fa142cc21cf995e942cJohnny Chen arch = self.getArchitecture() 1204b067250787b3d1763a58fa142cc21cf995e942cJohnny Chen if arch == 'i386': 1214b067250787b3d1763a58fa142cc21cf995e942cJohnny Chen self.assertTrue(value.GetByteSize() == 4) 1224b067250787b3d1763a58fa142cc21cf995e942cJohnny Chen elif arch == 'x86_64': 1234b067250787b3d1763a58fa142cc21cf995e942cJohnny Chen self.assertTrue(value.GetByteSize() == 8) 1244b067250787b3d1763a58fa142cc21cf995e942cJohnny Chen 1255503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen # Get child at index 5 => 'Friday'. 1265503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen child = value.GetChildAtIndex(5, lldb.eNoDynamicValues, True) 1275503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen self.assertTrue(child, VALID_VARIABLE) 1285503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen self.DebugSBValue(child) 1295503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen 1305503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen self.expect(child.GetSummary(), exe=False, 1315503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen substrs = ['Friday']) 1325503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen 1335503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen # Now try to get at the same variable using GetValueForExpressionPath(). 1345503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen # These two SBValue objects should have the same value. 1355503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen val2 = value.GetValueForExpressionPath('[5]') 1365503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen self.assertTrue(val2, VALID_VARIABLE) 1375503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen self.DebugSBValue(val2) 1385503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen self.assertTrue(child.GetValue() == val2.GetValue() and 1395503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen child.GetSummary() == val2.GetSummary()) 1405503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen 1415503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chenif __name__ == '__main__': 1425503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen import atexit 1435503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen lldb.SBDebugger.Initialize() 1445503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen atexit.register(lambda: lldb.SBDebugger.Terminate()) 1455503d468e43aae7d047c9b98baf626fc5b6c352dJohnny Chen unittest2.main() 146