| """ |
| Test lldb-vscode setBreakpoints request |
| """ |
| |
| |
| import vscode |
| from lldbsuite.test.decorators import * |
| from lldbsuite.test.lldbtest import * |
| from lldbsuite.test import lldbutil |
| import lldbvscode_testcase |
| import os |
| |
| |
| class TestVSCode_stackTrace(lldbvscode_testcase.VSCodeTestCaseBase): |
| name_key_path = ["name"] |
| source_key_path = ["source", "path"] |
| line_key_path = ["line"] |
| |
| def verify_stackFrames(self, start_idx, stackFrames): |
| frame_idx = start_idx |
| for stackFrame in stackFrames: |
| # Don't care about frame above main |
| if frame_idx > 20: |
| return |
| self.verify_stackFrame(frame_idx, stackFrame) |
| frame_idx += 1 |
| |
| def verify_stackFrame(self, frame_idx, stackFrame): |
| frame_name = self.get_dict_value(stackFrame, self.name_key_path) |
| frame_source = self.get_dict_value(stackFrame, self.source_key_path) |
| frame_line = self.get_dict_value(stackFrame, self.line_key_path) |
| if frame_idx == 0: |
| expected_line = self.recurse_end |
| expected_name = "recurse" |
| elif frame_idx < 20: |
| expected_line = self.recurse_call |
| expected_name = "recurse" |
| else: |
| expected_line = self.recurse_invocation |
| expected_name = "main" |
| self.assertEquals( |
| frame_name, |
| expected_name, |
| 'frame #%i name "%s" == "%s"' % (frame_idx, frame_name, expected_name), |
| ) |
| self.assertEquals( |
| frame_source, |
| self.source_path, |
| 'frame #%i source "%s" == "%s"' |
| % (frame_idx, frame_source, self.source_path), |
| ) |
| self.assertEquals( |
| frame_line, |
| expected_line, |
| "frame #%i line %i == %i" % (frame_idx, frame_line, expected_line), |
| ) |
| |
| @skipIfWindows |
| @skipIfRemote |
| def test_stackTrace(self): |
| """ |
| Tests the 'stackTrace' packet and all its variants. |
| """ |
| program = self.getBuildArtifact("a.out") |
| self.build_and_launch(program) |
| source = "main.c" |
| self.source_path = os.path.join(os.getcwd(), source) |
| self.recurse_end = line_number(source, "recurse end") |
| self.recurse_call = line_number(source, "recurse call") |
| self.recurse_invocation = line_number(source, "recurse invocation") |
| |
| lines = [self.recurse_end] |
| |
| # Set breakpoint at a point of deepest recuusion |
| breakpoint_ids = self.set_source_breakpoints(source, lines) |
| self.assertEquals( |
| len(breakpoint_ids), len(lines), "expect correct number of breakpoints" |
| ) |
| |
| self.continue_to_breakpoints(breakpoint_ids) |
| startFrame = 0 |
| # Verify we get all stack frames with no arguments |
| (stackFrames, totalFrames) = self.get_stackFrames_and_totalFramesCount() |
| frameCount = len(stackFrames) |
| self.assertTrue( |
| frameCount >= 20, "verify we get at least 20 frames for all frames" |
| ) |
| self.assertEquals( |
| totalFrames, frameCount, "verify we get correct value for totalFrames count" |
| ) |
| self.verify_stackFrames(startFrame, stackFrames) |
| |
| # Verify all stack frames by specifying startFrame = 0 and levels not |
| # specified |
| stackFrames = self.get_stackFrames(startFrame=startFrame) |
| self.assertEquals( |
| frameCount, |
| len(stackFrames), |
| ("verify same number of frames with startFrame=%i") % (startFrame), |
| ) |
| self.verify_stackFrames(startFrame, stackFrames) |
| |
| # Verify all stack frames by specifying startFrame = 0 and levels = 0 |
| levels = 0 |
| stackFrames = self.get_stackFrames(startFrame=startFrame, levels=levels) |
| self.assertEquals( |
| frameCount, |
| len(stackFrames), |
| ("verify same number of frames with startFrame=%i and" " levels=%i") |
| % (startFrame, levels), |
| ) |
| self.verify_stackFrames(startFrame, stackFrames) |
| |
| # Get only the first stack frame by sepcifying startFrame = 0 and |
| # levels = 1 |
| levels = 1 |
| stackFrames = self.get_stackFrames(startFrame=startFrame, levels=levels) |
| self.assertEquals( |
| levels, |
| len(stackFrames), |
| ("verify one frame with startFrame=%i and" " levels=%i") |
| % (startFrame, levels), |
| ) |
| self.verify_stackFrames(startFrame, stackFrames) |
| |
| # Get only the first 3 stack frames by sepcifying startFrame = 0 and |
| # levels = 3 |
| levels = 3 |
| stackFrames = self.get_stackFrames(startFrame=startFrame, levels=levels) |
| self.assertEquals( |
| levels, |
| len(stackFrames), |
| ("verify %i frames with startFrame=%i and" " levels=%i") |
| % (levels, startFrame, levels), |
| ) |
| self.verify_stackFrames(startFrame, stackFrames) |
| |
| # Get only the first 15 stack frames by sepcifying startFrame = 5 and |
| # levels = 16 |
| startFrame = 5 |
| levels = 16 |
| stackFrames = self.get_stackFrames(startFrame=startFrame, levels=levels) |
| self.assertEquals( |
| levels, |
| len(stackFrames), |
| ("verify %i frames with startFrame=%i and" " levels=%i") |
| % (levels, startFrame, levels), |
| ) |
| self.verify_stackFrames(startFrame, stackFrames) |
| |
| # Verify we cap things correctly when we ask for too many frames |
| startFrame = 5 |
| levels = 1000 |
| (stackFrames, totalFrames) = self.get_stackFrames_and_totalFramesCount( |
| startFrame=startFrame, levels=levels |
| ) |
| self.assertEquals( |
| len(stackFrames), |
| frameCount - startFrame, |
| ("verify less than 1000 frames with startFrame=%i and" " levels=%i") |
| % (startFrame, levels), |
| ) |
| self.assertEquals( |
| totalFrames, |
| frameCount, |
| "verify we get correct value for totalFrames count " |
| "when requested frames not from 0 index", |
| ) |
| self.verify_stackFrames(startFrame, stackFrames) |
| |
| # Verify level=0 works with non-zerp start frame |
| startFrame = 5 |
| levels = 0 |
| stackFrames = self.get_stackFrames(startFrame=startFrame, levels=levels) |
| self.assertEquals( |
| len(stackFrames), |
| frameCount - startFrame, |
| ("verify less than 1000 frames with startFrame=%i and" " levels=%i") |
| % (startFrame, levels), |
| ) |
| self.verify_stackFrames(startFrame, stackFrames) |
| |
| # Verify we get not frames when startFrame is too high |
| startFrame = 1000 |
| levels = 1 |
| stackFrames = self.get_stackFrames(startFrame=startFrame, levels=levels) |
| self.assertEquals( |
| 0, len(stackFrames), "verify zero frames with startFrame out of bounds" |
| ) |