""" 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, )