1""" Testing symbol loading via JSON file. """ 2import lldb 3from lldbsuite.test.decorators import * 4from lldbsuite.test.lldbtest import * 5from lldbsuite.test import lldbutil 6 7import json 8 9 10class TargetSymbolsFileJSON(TestBase): 11 def setUp(self): 12 TestBase.setUp(self) 13 self.source = "main.c" 14 15 @no_debug_info_test 16 @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