xref: /llvm-project/lldb/test/API/functionalities/json/symbol-file/TestSymbolFileJSON.py (revision f40ed1f619046e98d08b092b1afb835ed5156f52)
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