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