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) 61166b89f089d6bec5bb9dd40470a4dc951ffc9daaGreg Clayton self.assertTrue(thread.IsValid(), "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