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