159 lines · python
1"""2Test 'target modules dump separate-debug-info' for oso files.3"""4 5import json6import os7 8from lldbsuite.test import lldbtest, lldbutil9from lldbsuite.test.decorators import *10 11 12class TestDumpOso(lldbtest.TestBase):13 NO_DEBUG_INFO_TESTCASE = True14 15 def get_osos_from_json_output(self):16 """Returns a dictionary of `symfile` -> {`OSO_PATH` -> oso_info object}."""17 result = {}18 output = json.loads(self.res.GetOutput())19 for symfile_entry in output:20 oso_dict = {}21 for oso_entry in symfile_entry["separate-debug-info-files"]:22 oso_dict[oso_entry["oso_path"]] = oso_entry23 result[symfile_entry["symfile"]] = oso_dict24 return result25 26 @skipIfRemote27 @skipUnlessDarwin28 def test_shows_oso_loaded_json_output(self):29 self.build(debug_info="dwarf")30 exe = self.getBuildArtifact("a.out")31 main_o = self.getBuildArtifact("main.o")32 foo_o = self.getBuildArtifact("foo.o")33 34 # Make sure o files exist35 self.assertTrue(os.path.exists(main_o), f'Make sure "{main_o}" file exists')36 self.assertTrue(os.path.exists(foo_o), f'Make sure "{foo_o}" file exists')37 38 target = self.dbg.CreateTarget(exe)39 self.assertTrue(target, lldbtest.VALID_TARGET)40 41 self.runCmd("target modules dump separate-debug-info --json")42 43 # Check the output44 osos = self.get_osos_from_json_output()45 self.assertTrue(osos[exe][main_o]["loaded"])46 self.assertTrue(osos[exe][foo_o]["loaded"])47 48 @skipIfRemote49 @skipUnlessDarwin50 def test_shows_oso_not_loaded_json_output(self):51 self.build(debug_info="dwarf")52 exe = self.getBuildArtifact("a.out")53 main_o = self.getBuildArtifact("main.o")54 foo_o = self.getBuildArtifact("foo.o")55 56 # REMOVE the o files57 os.unlink(main_o)58 59 target = self.dbg.CreateTarget(exe)60 self.assertTrue(target, lldbtest.VALID_TARGET)61 62 self.runCmd("target modules dump separate-debug-info --json")63 64 # Check the output65 osos = self.get_osos_from_json_output()66 self.assertFalse(osos[exe][main_o]["loaded"])67 self.assertIn("error", osos[exe][main_o])68 self.assertTrue(osos[exe][foo_o]["loaded"])69 self.assertNotIn("error", osos[exe][foo_o])70 71 # Check with --errors-only72 self.runCmd("target modules dump separate-debug-info --json --errors-only")73 output = self.get_osos_from_json_output()74 self.assertFalse(output[exe][main_o]["loaded"])75 self.assertIn("error", output[exe][main_o])76 self.assertNotIn(foo_o, output[exe])77 78 @skipIfRemote79 @skipUnlessDarwin80 def test_shows_oso_loaded_table_output(self):81 self.build(debug_info="dwarf")82 exe = self.getBuildArtifact("a.out")83 main_o = self.getBuildArtifact("main.o")84 foo_o = self.getBuildArtifact("foo.o")85 86 # Make sure o files exist87 self.assertTrue(os.path.exists(main_o), f'Make sure "{main_o}" file exists')88 self.assertTrue(os.path.exists(foo_o), f'Make sure "{foo_o}" file exists')89 90 target = self.dbg.CreateTarget(exe)91 self.assertTrue(target, lldbtest.VALID_TARGET)92 93 self.expect(94 "target modules dump separate-debug-info",95 patterns=[96 r"Symbol file: .*?a\.out",97 'Type: "oso"',98 r"Mod Time\s+Err\s+Oso Path",99 r"0x[a-zA-Z0-9]{16}\s+.*main\.o",100 r"0x[a-zA-Z0-9]{16}\s+.*foo\.o",101 ],102 )103 104 @skipIfRemote105 @skipUnlessDarwin106 def test_shows_oso_not_loaded_table_output(self):107 self.build(debug_info="dwarf")108 exe = self.getBuildArtifact("a.out")109 main_o = self.getBuildArtifact("main.o")110 foo_o = self.getBuildArtifact("foo.o")111 112 # REMOVE the o files113 os.unlink(main_o)114 os.unlink(foo_o)115 116 target = self.dbg.CreateTarget(exe)117 self.assertTrue(target, lldbtest.VALID_TARGET)118 119 self.expect(120 "target modules dump separate-debug-info",121 patterns=[122 r"Symbol file: .*?a\.out",123 'Type: "oso"',124 r"Mod Time\s+Err\s+Oso Path",125 r"0x[a-zA-Z0-9]{16}\s+E\s+.*main\.o",126 r"0x[a-zA-Z0-9]{16}\s+E\s+.*foo\.o",127 ],128 )129 130 @skipIfRemote131 @skipUnlessDarwin132 def test_osos_loaded_symbols_on_demand(self):133 self.build(debug_info="dwarf")134 exe = self.getBuildArtifact("a.out")135 main_o = self.getBuildArtifact("main.o")136 foo_o = self.getBuildArtifact("foo.o")137 138 # Make sure o files exist139 self.assertTrue(os.path.exists(main_o), f'Make sure "{main_o}" file exists')140 self.assertTrue(os.path.exists(foo_o), f'Make sure "{foo_o}" file exists')141 142 target = self.dbg.CreateTarget(exe)143 self.assertTrue(target, lldbtest.VALID_TARGET)144 145 self.runCmd("target modules dump separate-debug-info --json")146 147 # Load symbols on-demand148 self.runCmd("settings set symbols.load-on-demand true")149 150 target = self.dbg.CreateTarget(exe)151 self.assertTrue(target, lldbtest.VALID_TARGET)152 153 self.runCmd("target modules dump separate-debug-info --json")154 155 # Check the output156 osos = self.get_osos_from_json_output()157 self.assertTrue(osos[exe][main_o]["loaded"])158 self.assertTrue(osos[exe][foo_o]["loaded"])159