| """ |
| Test SBTarget.GetStatistics() reporting for dwo files. |
| """ |
| |
| import json |
| import os |
| |
| from lldbsuite.test import lldbtest, lldbutil |
| from lldbsuite.test.decorators import * |
| from lldbsuite.test_event.build_exception import BuildError |
| |
| |
| SKELETON_DEBUGINFO_SIZE = 602 |
| MAIN_DWO_DEBUGINFO_SIZE = 385 |
| FOO_DWO_DEBUGINFO_SIZE = 380 |
| |
| |
| class TestDebugInfoSize(lldbtest.TestBase): |
| # Concurrency is the primary test factor here, not debug info variants. |
| NO_DEBUG_INFO_TESTCASE = True |
| |
| def get_output_from_yaml(self): |
| exe = self.getBuildArtifact("a.out") |
| main_dwo = self.getBuildArtifact("a.out-main.dwo") |
| foo_dwo = self.getBuildArtifact("a.out-foo.dwo") |
| |
| src_dir = self.getSourceDir() |
| exe_yaml_path = os.path.join(src_dir, "a.out.yaml") |
| self.yaml2obj(exe_yaml_path, exe) |
| |
| main_dwo_yaml_path = os.path.join(src_dir, "a.out-main.dwo.yaml") |
| self.yaml2obj(main_dwo_yaml_path, main_dwo) |
| |
| foo_dwo_yaml_path = os.path.join(src_dir, "a.out-foo.dwo.yaml") |
| self.yaml2obj(foo_dwo_yaml_path, foo_dwo) |
| return (exe, main_dwo, foo_dwo) |
| |
| @add_test_categories(["dwo"]) |
| def test_dwo(self): |
| (exe, main_dwo, foo_dwo) = self.get_output_from_yaml() |
| |
| # Make sure dwo files exist |
| self.assertTrue(os.path.exists(main_dwo), f'Make sure "{main_dwo}" file exists') |
| self.assertTrue(os.path.exists(foo_dwo), f'Make sure "{foo_dwo}" file exists') |
| |
| target = self.dbg.CreateTarget(exe) |
| self.assertTrue(target, lldbtest.VALID_TARGET) |
| |
| stats = target.GetStatistics() |
| stream = lldb.SBStream() |
| res = stats.GetAsJSON(stream) |
| debug_stats = json.loads(stream.GetData()) |
| self.assertIn( |
| "totalDebugInfoByteSize", |
| debug_stats, |
| 'Make sure the "totalDebugInfoByteSize" key is in target.GetStatistics()', |
| ) |
| self.assertEqual( |
| debug_stats["totalDebugInfoByteSize"], |
| SKELETON_DEBUGINFO_SIZE + MAIN_DWO_DEBUGINFO_SIZE + FOO_DWO_DEBUGINFO_SIZE, |
| ) |
| |
| @add_test_categories(["dwo"]) |
| def test_only_load_skeleton_debuginfo(self): |
| (exe, main_dwo, foo_dwo) = self.get_output_from_yaml() |
| |
| # REMOVE one of the dwo files |
| os.unlink(main_dwo) |
| os.unlink(foo_dwo) |
| |
| target = self.dbg.CreateTarget(exe) |
| self.assertTrue(target, lldbtest.VALID_TARGET) |
| |
| stats = target.GetStatistics() |
| stream = lldb.SBStream() |
| res = stats.GetAsJSON(stream) |
| debug_stats = json.loads(stream.GetData()) |
| self.assertIn( |
| "totalDebugInfoByteSize", |
| debug_stats, |
| 'Make sure the "totalDebugInfoByteSize" key is in target.GetStatistics()', |
| ) |
| self.assertEqual(debug_stats["totalDebugInfoByteSize"], SKELETON_DEBUGINFO_SIZE) |
| |
| @add_test_categories(["dwo"]) |
| def test_load_partial_dwos(self): |
| (exe, main_dwo, foo_dwo) = self.get_output_from_yaml() |
| |
| # REMOVE one of the dwo files |
| os.unlink(main_dwo) |
| |
| target = self.dbg.CreateTarget(exe) |
| self.assertTrue(target, lldbtest.VALID_TARGET) |
| |
| stats = target.GetStatistics() |
| stream = lldb.SBStream() |
| res = stats.GetAsJSON(stream) |
| debug_stats = json.loads(stream.GetData()) |
| self.assertIn( |
| "totalDebugInfoByteSize", |
| debug_stats, |
| 'Make sure the "totalDebugInfoByteSize" key is in target.GetStatistics()', |
| ) |
| self.assertEqual( |
| debug_stats["totalDebugInfoByteSize"], |
| SKELETON_DEBUGINFO_SIZE + FOO_DWO_DEBUGINFO_SIZE, |
| ) |
| |
| @add_test_categories(["dwo"]) |
| def test_dwos_loaded_symbols_on_demand(self): |
| (exe, main_dwo, foo_dwo) = self.get_output_from_yaml() |
| |
| # Make sure dwo files exist |
| self.assertTrue(os.path.exists(main_dwo), f'Make sure "{main_dwo}" file exists') |
| self.assertTrue(os.path.exists(foo_dwo), f'Make sure "{foo_dwo}" file exists') |
| |
| # Load symbols on-demand |
| self.runCmd("settings set symbols.load-on-demand true") |
| |
| target = self.dbg.CreateTarget(exe) |
| self.assertTrue(target, lldbtest.VALID_TARGET) |
| |
| # By default dwo files will not be loaded |
| stats = target.GetStatistics() |
| stream = lldb.SBStream() |
| res = stats.GetAsJSON(stream) |
| debug_stats = json.loads(stream.GetData()) |
| self.assertIn( |
| "totalDebugInfoByteSize", |
| debug_stats, |
| 'Make sure the "totalDebugInfoByteSize" key is in target.GetStatistics()', |
| ) |
| self.assertEqual(debug_stats["totalDebugInfoByteSize"], SKELETON_DEBUGINFO_SIZE) |
| |
| # Force loading all the dwo files |
| stats_options = lldb.SBStatisticsOptions() |
| stats_options.SetReportAllAvailableDebugInfo(True) |
| stats = target.GetStatistics(stats_options) |
| stream = lldb.SBStream() |
| stats.GetAsJSON(stream) |
| debug_stats = json.loads(stream.GetData()) |
| self.assertEqual( |
| debug_stats["totalDebugInfoByteSize"], |
| SKELETON_DEBUGINFO_SIZE + MAIN_DWO_DEBUGINFO_SIZE + FOO_DWO_DEBUGINFO_SIZE, |
| ) |