1""" 2Test lldb-vscode setBreakpoints request 3""" 4 5from __future__ import print_function 6 7import unittest2 8import vscode 9from lldbsuite.test.decorators import * 10from lldbsuite.test.lldbtest import * 11from lldbsuite.test import lldbutil 12import lldbvscode_testcase 13import re 14 15class TestVSCode_module(lldbvscode_testcase.VSCodeTestCaseBase): 16 17 def run_test(self, symbol_basename, expect_debug_info_size): 18 program_basename = "a.out.stripped" 19 program = self.getBuildArtifact(program_basename) 20 self.build_and_launch(program) 21 functions = ['foo'] 22 breakpoint_ids = self.set_function_breakpoints(functions) 23 self.assertEquals(len(breakpoint_ids), len(functions), 'expect one breakpoint') 24 self.continue_to_breakpoints(breakpoint_ids) 25 active_modules = self.vscode.get_modules() 26 program_module = active_modules[program_basename] 27 self.assertIn(program_basename, active_modules, '%s module is in active modules' % (program_basename)) 28 self.assertIn('name', program_module, 'make sure name is in module') 29 self.assertEqual(program_basename, program_module['name']) 30 self.assertIn('path', program_module, 'make sure path is in module') 31 self.assertEqual(program, program_module['path']) 32 self.assertNotIn('symbolFilePath', program_module, 'Make sure a.out.stripped has no debug info') 33 symbols_path = self.getBuildArtifact(symbol_basename) 34 self.vscode.request_evaluate('`%s' % ('target symbols add -s "%s" "%s"' % (program, symbols_path))) 35 36 def checkSymbolsLoadedWithSize(): 37 active_modules = self.vscode.get_modules() 38 program_module = active_modules[program_basename] 39 self.assertIn('symbolFilePath', program_module) 40 self.assertIn(symbols_path, program_module['symbolFilePath']) 41 symbol_regex = re.compile(r"[0-9]+(\.[0-9]*)?[KMG]?B") 42 return symbol_regex.match(program_module['symbolStatus']) 43 44 if expect_debug_info_size: 45 self.waitUntil(checkSymbolsLoadedWithSize) 46 active_modules = self.vscode.get_modules() 47 program_module = active_modules[program_basename] 48 self.assertEqual(program_basename, program_module['name']) 49 self.assertEqual(program, program_module['path']) 50 self.assertIn('addressRange', program_module) 51 52 @skipIfWindows 53 @skipIfRemote 54 def test_modules(self): 55 ''' 56 Mac or linux. 57 58 On mac, if we load a.out as our symbol file, we will use DWARF with .o files and we will 59 have debug symbols, but we won't see any debug info size because all of the DWARF 60 sections are in .o files. 61 62 On other platforms, we expect a.out to have debug info, so we will expect a size. 63 ''' 64 return self.run_test("a.out", expect_debug_info_size=platform.system() != 'Darwin') 65 66 @skipUnlessDarwin 67 @skipIfRemote 68 def test_modules_dsym(self): 69 ''' 70 Darwin only test with dSYM file. 71 72 On mac, if we load a.out.dSYM as our symbol file, we will have debug symbols and we 73 will have DWARF sections added to the module, so we will expect a size. 74 ''' 75 return self.run_test("a.out.dSYM", expect_debug_info_size=True) 76 77 @skipIfWindows 78 @skipIfRemote 79 @expectedFailureAll(oslist=["freebsd"], bugnumber="llvm.org/pr49418") 80 def test_compile_units(self): 81 program = self.getBuildArtifact("a.out") 82 self.build_and_launch(program) 83 source = "main.cpp" 84 main_source_path = self.getSourcePath(source) 85 breakpoint1_line = line_number(source, '// breakpoint 1') 86 lines = [breakpoint1_line] 87 breakpoint_ids = self.set_source_breakpoints(source, lines) 88 self.continue_to_breakpoints(breakpoint_ids) 89 moduleId = self.vscode.get_modules()['a.out']['id'] 90 response = self.vscode.request_compileUnits(moduleId) 91 self.assertTrue(response['body']) 92 self.assertEqual(len(response['body']['compileUnits']), 1, 93 'Only one source file should exist') 94 self.assertEqual(response['body']['compileUnits'][0]['compileUnitPath'], main_source_path, 95 'Real path to main.cpp matches') 96