| import lldb |
| from lldbsuite.test.decorators import * |
| from lldbsuite.test.lldbtest import * |
| from lldbsuite.test import lldbutil |
| |
| |
| class LibCxxStdFunctionRecognizerTestCase(TestBase): |
| NO_DEBUG_INFO_TESTCASE = True |
| |
| @add_test_categories(["libc++"]) |
| def test_frame_recognizer(self): |
| """Test that implementation details of `std::invoke` are hidden""" |
| self.build() |
| (target, process, thread, bkpt) = lldbutil.run_to_source_breakpoint( |
| self, "break here", lldb.SBFileSpec("main.cpp") |
| ) |
| |
| stop_cnt = 0 |
| while process.GetState() != lldb.eStateExited: |
| stop_cnt += 1 |
| self.assertTrue( |
| any( |
| f in thread.GetFrameAtIndex(0).GetFunctionName() |
| for f in ["consume_number", "add", "Callable"] |
| ) |
| ) |
| # Skip all hidden frames |
| frame_id = 1 |
| while ( |
| frame_id < thread.GetNumFrames() |
| and thread.GetFrameAtIndex(frame_id).IsHidden() |
| ): |
| frame_id = frame_id + 1 |
| # Expect `std::invoke` to be the direct parent |
| self.assertIn( |
| "::invoke", thread.GetFrameAtIndex(frame_id).GetFunctionName() |
| ) |
| # And right above that, there should be the `main` frame |
| self.assertIn( |
| "main", thread.GetFrameAtIndex(frame_id + 1).GetFunctionName() |
| ) |
| process.Continue() |
| |
| self.assertEqual(stop_cnt, 4) |