| """ | |
| Test that dynamic values update their child count correctly | |
| """ | |
| import lldb | |
| from lldbsuite.test.decorators import * | |
| from lldbsuite.test.lldbtest import * | |
| from lldbsuite.test import lldbutil | |
| class DynamicValueChildCountTestCase(TestBase): | |
| def setUp(self): | |
| # Call super's setUp(). | |
| TestBase.setUp(self) | |
| # Find the line number to break for main.c. | |
| self.main_third_call_line = line_number( | |
| "pass-to-base.cpp", "// Break here and check b has 0 children" | |
| ) | |
| self.main_fourth_call_line = line_number( | |
| "pass-to-base.cpp", "// Break here and check b still has 0 children" | |
| ) | |
| self.main_fifth_call_line = line_number( | |
| "pass-to-base.cpp", "// Break here and check b has one child now" | |
| ) | |
| self.main_sixth_call_line = line_number( | |
| "pass-to-base.cpp", "// Break here and check b has 0 children again" | |
| ) | |
| @add_test_categories(["pyapi"]) | |
| @expectedFailureAll(oslist=["windows"], bugnumber="llvm.org/pr24663") | |
| def test_get_dynamic_vals(self): | |
| """Test fetching C++ dynamic values from pointers & references.""" | |
| """Get argument vals for the call stack when stopped on a breakpoint.""" | |
| self.build() | |
| exe = self.getBuildArtifact("a.out") | |
| # Create a target from the debugger. | |
| target = self.dbg.CreateTarget(exe) | |
| self.assertTrue(target, VALID_TARGET) | |
| # Set up our breakpoints: | |
| third_call_bpt = target.BreakpointCreateByLocation( | |
| "pass-to-base.cpp", self.main_third_call_line | |
| ) | |
| self.assertTrue(third_call_bpt, VALID_BREAKPOINT) | |
| fourth_call_bpt = target.BreakpointCreateByLocation( | |
| "pass-to-base.cpp", self.main_fourth_call_line | |
| ) | |
| self.assertTrue(fourth_call_bpt, VALID_BREAKPOINT) | |
| fifth_call_bpt = target.BreakpointCreateByLocation( | |
| "pass-to-base.cpp", self.main_fifth_call_line | |
| ) | |
| self.assertTrue(fifth_call_bpt, VALID_BREAKPOINT) | |
| sixth_call_bpt = target.BreakpointCreateByLocation( | |
| "pass-to-base.cpp", self.main_sixth_call_line | |
| ) | |
| self.assertTrue(sixth_call_bpt, VALID_BREAKPOINT) | |
| # Now launch the process, and do not stop at the entry point. | |
| process = target.LaunchSimple(None, None, self.get_process_working_directory()) | |
| self.assertState(process.GetState(), lldb.eStateStopped, PROCESS_STOPPED) | |
| b = self.frame().FindVariable("b").GetDynamicValue(lldb.eDynamicCanRunTarget) | |
| self.assertEqual(b.GetNumChildren(), 0, "b has 0 children") | |
| self.runCmd("continue") | |
| self.assertEqual(b.GetNumChildren(), 0, "b still has 0 children") | |
| self.runCmd("continue") | |
| self.assertNotEqual(b.GetNumChildren(), 0, "b now has 1 child") | |
| self.runCmd("continue") | |
| self.assertEqual(b.GetNumChildren(), 0, "b didn't go back to 0 children") |