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