101263c6cSJonas Devlieghere""" 201263c6cSJonas DevlieghereTest lldb-dap setBreakpoints request 301263c6cSJonas Devlieghere""" 401263c6cSJonas Devlieghere 501263c6cSJonas Devlieghereimport dap_server 601263c6cSJonas Devliegherefrom lldbsuite.test.decorators import * 701263c6cSJonas Devliegherefrom lldbsuite.test.lldbtest import * 801263c6cSJonas Devliegherefrom lldbsuite.test import lldbutil 901263c6cSJonas Devlieghereimport lldbdap_testcase 1001263c6cSJonas Devlieghereimport re 1101263c6cSJonas Devlieghere 1201263c6cSJonas Devlieghere 1301263c6cSJonas Devlieghereclass TestDAP_module(lldbdap_testcase.DAPTestCaseBase): 1401263c6cSJonas Devlieghere def run_test(self, symbol_basename, expect_debug_info_size): 1501263c6cSJonas Devlieghere program_basename = "a.out.stripped" 1601263c6cSJonas Devlieghere program = self.getBuildArtifact(program_basename) 1701263c6cSJonas Devlieghere self.build_and_launch(program) 1801263c6cSJonas Devlieghere functions = ["foo"] 1901263c6cSJonas Devlieghere breakpoint_ids = self.set_function_breakpoints(functions) 20*80fcecb1SJonas Devlieghere self.assertEqual(len(breakpoint_ids), len(functions), "expect one breakpoint") 2101263c6cSJonas Devlieghere self.continue_to_breakpoints(breakpoint_ids) 2201263c6cSJonas Devlieghere active_modules = self.dap_server.get_modules() 2301263c6cSJonas Devlieghere program_module = active_modules[program_basename] 2401263c6cSJonas Devlieghere self.assertIn( 2501263c6cSJonas Devlieghere program_basename, 2601263c6cSJonas Devlieghere active_modules, 2701263c6cSJonas Devlieghere "%s module is in active modules" % (program_basename), 2801263c6cSJonas Devlieghere ) 2901263c6cSJonas Devlieghere self.assertIn("name", program_module, "make sure name is in module") 3001263c6cSJonas Devlieghere self.assertEqual(program_basename, program_module["name"]) 3101263c6cSJonas Devlieghere self.assertIn("path", program_module, "make sure path is in module") 3201263c6cSJonas Devlieghere self.assertEqual(program, program_module["path"]) 3301263c6cSJonas Devlieghere self.assertNotIn( 3401263c6cSJonas Devlieghere "symbolFilePath", 3501263c6cSJonas Devlieghere program_module, 3601263c6cSJonas Devlieghere "Make sure a.out.stripped has no debug info", 3701263c6cSJonas Devlieghere ) 3801263c6cSJonas Devlieghere symbols_path = self.getBuildArtifact(symbol_basename) 3901263c6cSJonas Devlieghere self.dap_server.request_evaluate( 4001263c6cSJonas Devlieghere "`%s" % ('target symbols add -s "%s" "%s"' % (program, symbols_path)), 4101263c6cSJonas Devlieghere context="repl", 4201263c6cSJonas Devlieghere ) 4301263c6cSJonas Devlieghere 4401263c6cSJonas Devlieghere def checkSymbolsLoadedWithSize(): 4501263c6cSJonas Devlieghere active_modules = self.dap_server.get_modules() 4601263c6cSJonas Devlieghere program_module = active_modules[program_basename] 4701263c6cSJonas Devlieghere self.assertIn("symbolFilePath", program_module) 4801263c6cSJonas Devlieghere self.assertIn(symbols_path, program_module["symbolFilePath"]) 4901263c6cSJonas Devlieghere symbol_regex = re.compile(r"[0-9]+(\.[0-9]*)?[KMG]?B") 5001263c6cSJonas Devlieghere return symbol_regex.match(program_module["symbolStatus"]) 5101263c6cSJonas Devlieghere 5201263c6cSJonas Devlieghere if expect_debug_info_size: 5301263c6cSJonas Devlieghere self.waitUntil(checkSymbolsLoadedWithSize) 5401263c6cSJonas Devlieghere active_modules = self.dap_server.get_modules() 5501263c6cSJonas Devlieghere program_module = active_modules[program_basename] 5601263c6cSJonas Devlieghere self.assertEqual(program_basename, program_module["name"]) 5701263c6cSJonas Devlieghere self.assertEqual(program, program_module["path"]) 5801263c6cSJonas Devlieghere self.assertIn("addressRange", program_module) 5901263c6cSJonas Devlieghere 6001263c6cSJonas Devlieghere @skipIfWindows 6101263c6cSJonas Devlieghere def test_modules(self): 6201263c6cSJonas Devlieghere """ 6301263c6cSJonas Devlieghere Mac or linux. 6401263c6cSJonas Devlieghere 6501263c6cSJonas Devlieghere On mac, if we load a.out as our symbol file, we will use DWARF with .o files and we will 6601263c6cSJonas Devlieghere have debug symbols, but we won't see any debug info size because all of the DWARF 6701263c6cSJonas Devlieghere sections are in .o files. 6801263c6cSJonas Devlieghere 6901263c6cSJonas Devlieghere On other platforms, we expect a.out to have debug info, so we will expect a size. 7001263c6cSJonas Devlieghere """ 7101263c6cSJonas Devlieghere return self.run_test( 7201263c6cSJonas Devlieghere "a.out", expect_debug_info_size=platform.system() != "Darwin" 7301263c6cSJonas Devlieghere ) 7401263c6cSJonas Devlieghere 7501263c6cSJonas Devlieghere @skipUnlessDarwin 7601263c6cSJonas Devlieghere def test_modules_dsym(self): 7701263c6cSJonas Devlieghere """ 7801263c6cSJonas Devlieghere Darwin only test with dSYM file. 7901263c6cSJonas Devlieghere 8001263c6cSJonas Devlieghere On mac, if we load a.out.dSYM as our symbol file, we will have debug symbols and we 8101263c6cSJonas Devlieghere will have DWARF sections added to the module, so we will expect a size. 8201263c6cSJonas Devlieghere """ 8301263c6cSJonas Devlieghere return self.run_test("a.out.dSYM", expect_debug_info_size=True) 8401263c6cSJonas Devlieghere 8501263c6cSJonas Devlieghere @skipIfWindows 8601263c6cSJonas Devlieghere def test_compile_units(self): 8701263c6cSJonas Devlieghere program = self.getBuildArtifact("a.out") 8801263c6cSJonas Devlieghere self.build_and_launch(program) 8901263c6cSJonas Devlieghere source = "main.cpp" 9001263c6cSJonas Devlieghere main_source_path = self.getSourcePath(source) 9101263c6cSJonas Devlieghere breakpoint1_line = line_number(source, "// breakpoint 1") 9201263c6cSJonas Devlieghere lines = [breakpoint1_line] 9301263c6cSJonas Devlieghere breakpoint_ids = self.set_source_breakpoints(source, lines) 9401263c6cSJonas Devlieghere self.continue_to_breakpoints(breakpoint_ids) 9501263c6cSJonas Devlieghere moduleId = self.dap_server.get_modules()["a.out"]["id"] 9601263c6cSJonas Devlieghere response = self.dap_server.request_compileUnits(moduleId) 9701263c6cSJonas Devlieghere self.assertTrue(response["body"]) 9801263c6cSJonas Devlieghere cu_paths = [cu["compileUnitPath"] for cu in response["body"]["compileUnits"]] 9901263c6cSJonas Devlieghere self.assertIn(main_source_path, cu_paths, "Real path to main.cpp matches") 100