`statistics dump` command relies on `SymbolFile::GetDebugInfoSize()` to get total debug info size. The current implementation is missing debug info for split dwarf scenarios which requires getting debug info from separate dwo/dwp files. This patch fixes this issue for split dwarf by parsing debug info from dwp/dwo. New yaml tests are added. --------- Co-authored-by: jeffreytan81 <jeffreytan@fb.com>
136 lines
4.6 KiB
Python
136 lines
4.6 KiB
Python
"""
|
|
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)
|
|
|
|
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,
|
|
)
|