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