115 lines
4.1 KiB
Python
115 lines
4.1 KiB
Python
""" Testing symbol loading via JSON file. """
|
|
import lldb
|
|
from lldbsuite.test.decorators import *
|
|
from lldbsuite.test.lldbtest import *
|
|
from lldbsuite.test import lldbutil
|
|
|
|
import json
|
|
|
|
|
|
class TargetSymbolsFileJSON(TestBase):
|
|
def setUp(self):
|
|
TestBase.setUp(self)
|
|
self.source = "main.c"
|
|
|
|
@no_debug_info_test
|
|
@skipIfWindows # No 'strip'
|
|
def test_symbol_file_json_address(self):
|
|
"""Test that 'target symbols add' can load the symbols from a JSON file using file addresses."""
|
|
|
|
self.build()
|
|
stripped = self.getBuildArtifact("stripped.out")
|
|
unstripped = self.getBuildArtifact("a.out")
|
|
|
|
# Create a JSON symbol file from the unstripped target.
|
|
unstripped_target = self.dbg.CreateTarget(unstripped)
|
|
self.assertTrue(unstripped_target, VALID_TARGET)
|
|
|
|
unstripped_module = unstripped_target.GetModuleAtIndex(0)
|
|
main_symbol = unstripped_module.FindSymbol("main")
|
|
foo_symbol = unstripped_module.FindSymbol("foo")
|
|
|
|
data = {
|
|
"triple": unstripped_module.GetTriple(),
|
|
"uuid": unstripped_module.GetUUIDString(),
|
|
"symbols": list(),
|
|
}
|
|
data["symbols"].append(
|
|
{
|
|
"name": "main",
|
|
"type": "code",
|
|
"size": main_symbol.GetSize(),
|
|
"address": main_symbol.addr.GetFileAddress(),
|
|
}
|
|
)
|
|
data["symbols"].append(
|
|
{
|
|
"name": "foo",
|
|
"type": "code",
|
|
"size": foo_symbol.GetSize(),
|
|
"address": foo_symbol.addr.GetFileAddress(),
|
|
}
|
|
)
|
|
data["symbols"].append(
|
|
{
|
|
"name": "bar",
|
|
"type": "code",
|
|
"size": 0,
|
|
"value": 0xFF,
|
|
}
|
|
)
|
|
|
|
json_object = json.dumps(data, indent=4)
|
|
json_symbol_file = self.getBuildArtifact("a.json")
|
|
with open(json_symbol_file, "w") as outfile:
|
|
outfile.write(json_object)
|
|
|
|
# Create a stripped target.
|
|
stripped_target = self.dbg.CreateTarget(stripped)
|
|
self.assertTrue(stripped_target, VALID_TARGET)
|
|
|
|
# Ensure there's no symbol for main and foo.
|
|
stripped_module = stripped_target.GetModuleAtIndex(0)
|
|
self.assertFalse(stripped_module.FindSymbol("main").IsValid())
|
|
self.assertFalse(stripped_module.FindSymbol("foo").IsValid())
|
|
self.assertFalse(stripped_module.FindSymbol("bar").IsValid())
|
|
|
|
main_bp = stripped_target.BreakpointCreateByName("main", "stripped.out")
|
|
self.assertTrue(main_bp, VALID_BREAKPOINT)
|
|
self.assertEqual(main_bp.num_locations, 0)
|
|
|
|
# Load the JSON symbol file.
|
|
self.runCmd(
|
|
"target symbols add -s %s %s" % (stripped, self.getBuildArtifact("a.json"))
|
|
)
|
|
|
|
stripped_main_symbol = stripped_module.FindSymbol("main")
|
|
stripped_foo_symbol = stripped_module.FindSymbol("foo")
|
|
stripped_bar_symbol = stripped_module.FindSymbol("bar")
|
|
|
|
# Ensure main and foo are available now.
|
|
self.assertTrue(stripped_main_symbol.IsValid())
|
|
self.assertTrue(stripped_foo_symbol.IsValid())
|
|
self.assertTrue(stripped_bar_symbol.IsValid())
|
|
self.assertEqual(main_bp.num_locations, 1)
|
|
|
|
# Ensure the file address matches between the stripped and unstripped target.
|
|
self.assertEqual(
|
|
stripped_main_symbol.addr.GetFileAddress(),
|
|
main_symbol.addr.GetFileAddress(),
|
|
)
|
|
self.assertEqual(
|
|
stripped_main_symbol.addr.GetFileAddress(),
|
|
main_symbol.addr.GetFileAddress(),
|
|
)
|
|
|
|
# Ensure the size matches.
|
|
self.assertEqual(stripped_main_symbol.GetSize(), main_symbol.GetSize())
|
|
self.assertEqual(stripped_main_symbol.GetSize(), main_symbol.GetSize())
|
|
|
|
# Ensure the type matches.
|
|
self.assertEqual(stripped_main_symbol.GetType(), main_symbol.GetType())
|
|
self.assertEqual(stripped_main_symbol.GetType(), main_symbol.GetType())
|
|
|
|
# Ensure the bar symbol has a fixed value of 10.
|
|
self.assertEqual(stripped_bar_symbol.GetValue(), 0xFF)
|