116 lines · python
1""" Testing symbol loading via JSON file. """2import lldb3from lldbsuite.test.decorators import *4from lldbsuite.test.lldbtest import *5from lldbsuite.test import lldbutil6 7import json8 9 10class TargetSymbolsFileJSON(TestBase):11 def setUp(self):12 TestBase.setUp(self)13 self.source = "main.c"14 15 @no_debug_info_test16 @skipIfWindows # No 'strip'17 def test_symbol_file_json_address(self):18 """Test that 'target symbols add' can load the symbols from a JSON file using file addresses."""19 20 self.build()21 stripped = self.getBuildArtifact("stripped.out")22 unstripped = self.getBuildArtifact("a.out")23 24 # Create a JSON symbol file from the unstripped target.25 unstripped_target = self.dbg.CreateTarget(unstripped)26 self.assertTrue(unstripped_target, VALID_TARGET)27 28 unstripped_module = unstripped_target.GetModuleAtIndex(0)29 main_symbol = unstripped_module.FindSymbol("main")30 foo_symbol = unstripped_module.FindSymbol("foo")31 32 data = {33 "triple": unstripped_module.GetTriple(),34 "uuid": unstripped_module.GetUUIDString(),35 "symbols": list(),36 }37 data["symbols"].append(38 {39 "name": "main",40 "type": "code",41 "size": main_symbol.GetSize(),42 "address": main_symbol.addr.GetFileAddress(),43 }44 )45 data["symbols"].append(46 {47 "name": "foo",48 "type": "code",49 "size": foo_symbol.GetSize(),50 "address": foo_symbol.addr.GetFileAddress(),51 }52 )53 data["symbols"].append(54 {55 "name": "bar",56 "type": "code",57 "size": 0,58 "value": 0xFF,59 }60 )61 62 json_object = json.dumps(data, indent=4)63 json_symbol_file = self.getBuildArtifact("a.json")64 with open(json_symbol_file, "w") as outfile:65 outfile.write(json_object)66 67 # Create a stripped target.68 stripped_target = self.dbg.CreateTarget(stripped)69 self.assertTrue(stripped_target, VALID_TARGET)70 71 # Ensure there's no symbol for main and foo.72 stripped_module = stripped_target.GetModuleAtIndex(0)73 self.assertFalse(stripped_module.FindSymbol("main").IsValid())74 self.assertFalse(stripped_module.FindSymbol("foo").IsValid())75 self.assertFalse(stripped_module.FindSymbol("bar").IsValid())76 77 main_bp = stripped_target.BreakpointCreateByName("main", "stripped.out")78 self.assertTrue(main_bp, VALID_BREAKPOINT)79 self.assertEqual(main_bp.num_locations, 0)80 81 # Load the JSON symbol file.82 self.runCmd(83 "target symbols add -s %s %s" % (stripped, self.getBuildArtifact("a.json"))84 )85 86 stripped_main_symbol = stripped_module.FindSymbol("main")87 stripped_foo_symbol = stripped_module.FindSymbol("foo")88 stripped_bar_symbol = stripped_module.FindSymbol("bar")89 90 # Ensure main and foo are available now.91 self.assertTrue(stripped_main_symbol.IsValid())92 self.assertTrue(stripped_foo_symbol.IsValid())93 self.assertTrue(stripped_bar_symbol.IsValid())94 self.assertEqual(main_bp.num_locations, 1)95 96 # Ensure the file address matches between the stripped and unstripped target.97 self.assertEqual(98 stripped_main_symbol.addr.GetFileAddress(),99 main_symbol.addr.GetFileAddress(),100 )101 self.assertEqual(102 stripped_main_symbol.addr.GetFileAddress(),103 main_symbol.addr.GetFileAddress(),104 )105 106 # Ensure the size matches.107 self.assertEqual(stripped_main_symbol.GetSize(), main_symbol.GetSize())108 self.assertEqual(stripped_main_symbol.GetSize(), main_symbol.GetSize())109 110 # Ensure the type matches.111 self.assertEqual(stripped_main_symbol.GetType(), main_symbol.GetType())112 self.assertEqual(stripped_main_symbol.GetType(), main_symbol.GetType())113 114 # Ensure the bar symbol has a fixed value of 10.115 self.assertEqual(stripped_bar_symbol.GetValue(), 0xFF)116