xref: /llvm-project/lldb/test/API/tools/lldb-dap/module/TestDAP_module.py (revision fa6377119c0624773cb698935692d46843e9f6ec)
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