7
7
8
8
from lldbsuite .test import lldbtest , lldbutil
9
9
from lldbsuite .test .decorators import *
10
+ from lldbsuite .test_event .build_exception import BuildError
10
11
11
12
12
13
class TestDumpDWO (lldbtest .TestBase ):
@@ -23,14 +24,17 @@ def get_dwos_from_json_output(self):
23
24
result [symfile_entry ["symfile" ]] = dwo_dict
24
25
return result
25
26
26
- @skipIfRemote
27
- @skipIfDarwin
28
- @skipIfWindows
27
+ def build_and_skip_if_error (self ):
28
+ try :
29
+ self .build ()
30
+ except BuildError as e :
31
+ self .skipTest (f"Skipping test due to build exception: { e } " )
32
+
29
33
def test_dwos_loaded_json_output (self ):
30
- self .build ()
34
+ self .build_and_skip_if_error ()
31
35
exe = self .getBuildArtifact ("a.out" )
32
- main_dwo = self .getBuildArtifact ("main.dwo" )
33
- foo_dwo = self .getBuildArtifact ("foo.dwo" )
36
+ main_dwo = self .getBuildArtifact ("a.out- main.dwo" )
37
+ foo_dwo = self .getBuildArtifact ("a.out- foo.dwo" )
34
38
35
39
# Make sure dwo files exist
36
40
self .assertTrue (os .path .exists (main_dwo ), f'Make sure "{ main_dwo } " file exists' )
@@ -43,17 +47,14 @@ def test_dwos_loaded_json_output(self):
43
47
44
48
# Check the output
45
49
output = self .get_dwos_from_json_output ()
46
- self .assertTrue (output [exe ]["main.dwo" ]["loaded" ])
47
- self .assertTrue (output [exe ]["foo.dwo" ]["loaded" ])
50
+ self .assertTrue (output [exe ]["a.out- main.dwo" ]["loaded" ])
51
+ self .assertTrue (output [exe ]["a.out- foo.dwo" ]["loaded" ])
48
52
49
- @skipIfRemote
50
- @skipIfDarwin
51
- @skipIfWindows
52
53
def test_dwos_not_loaded_json_output (self ):
53
- self .build ()
54
+ self .build_and_skip_if_error ()
54
55
exe = self .getBuildArtifact ("a.out" )
55
- main_dwo = self .getBuildArtifact ("main.dwo" )
56
- foo_dwo = self .getBuildArtifact ("foo.dwo" )
56
+ main_dwo = self .getBuildArtifact ("a.out- main.dwo" )
57
+ foo_dwo = self .getBuildArtifact ("a.out- foo.dwo" )
57
58
58
59
# REMOVE one of the dwo files
59
60
os .unlink (main_dwo )
@@ -65,26 +66,23 @@ def test_dwos_not_loaded_json_output(self):
65
66
66
67
# Check the output
67
68
output = self .get_dwos_from_json_output ()
68
- self .assertFalse (output [exe ]["main.dwo" ]["loaded" ])
69
- self .assertIn ("error" , output [exe ]["main.dwo" ])
70
- self .assertTrue (output [exe ]["foo.dwo" ]["loaded" ])
71
- self .assertNotIn ("error" , output [exe ]["foo.dwo" ])
69
+ self .assertFalse (output [exe ]["a.out- main.dwo" ]["loaded" ])
70
+ self .assertIn ("error" , output [exe ]["a.out- main.dwo" ])
71
+ self .assertTrue (output [exe ]["a.out- foo.dwo" ]["loaded" ])
72
+ self .assertNotIn ("error" , output [exe ]["a.out- foo.dwo" ])
72
73
73
74
# Check with --errors-only
74
75
self .runCmd ("target modules dump separate-debug-info --json --errors-only" )
75
76
output = self .get_dwos_from_json_output ()
76
- self .assertFalse (output [exe ]["main.dwo" ]["loaded" ])
77
- self .assertIn ("error" , output [exe ]["main.dwo" ])
78
- self .assertNotIn ("foo.dwo" , output [exe ])
77
+ self .assertFalse (output [exe ]["a.out- main.dwo" ]["loaded" ])
78
+ self .assertIn ("error" , output [exe ]["a.out- main.dwo" ])
79
+ self .assertNotIn ("a.out- foo.dwo" , output [exe ])
79
80
80
- @skipIfRemote
81
- @skipIfDarwin
82
- @skipIfWindows
83
81
def test_dwos_loaded_table_output (self ):
84
- self .build ()
82
+ self .build_and_skip_if_error ()
85
83
exe = self .getBuildArtifact ("a.out" )
86
- main_dwo = self .getBuildArtifact ("main.dwo" )
87
- foo_dwo = self .getBuildArtifact ("foo.dwo" )
84
+ main_dwo = self .getBuildArtifact ("a.out- main.dwo" )
85
+ foo_dwo = self .getBuildArtifact ("a.out- foo.dwo" )
88
86
89
87
# Make sure dwo files exist
90
88
self .assertTrue (os .path .exists (main_dwo ), f'Make sure "{ main_dwo } " file exists' )
@@ -104,14 +102,11 @@ def test_dwos_loaded_table_output(self):
104
102
],
105
103
)
106
104
107
- @skipIfRemote
108
- @skipIfDarwin
109
- @skipIfWindows
110
105
def test_dwos_not_loaded_table_output (self ):
111
- self .build ()
106
+ self .build_and_skip_if_error ()
112
107
exe = self .getBuildArtifact ("a.out" )
113
- main_dwo = self .getBuildArtifact ("main.dwo" )
114
- foo_dwo = self .getBuildArtifact ("foo.dwo" )
108
+ main_dwo = self .getBuildArtifact ("a.out- main.dwo" )
109
+ foo_dwo = self .getBuildArtifact ("a.out- foo.dwo" )
115
110
116
111
# REMOVE the dwo files
117
112
os .unlink (main_dwo )
@@ -130,3 +125,26 @@ def test_dwos_not_loaded_table_output(self):
130
125
"0x[a-zA-Z0-9]{16}\s+E\s+.*foo\.dwo" ,
131
126
],
132
127
)
128
+
129
+ def test_dwos_loaded_symbols_on_demand (self ):
130
+ self .build_and_skip_if_error ()
131
+ exe = self .getBuildArtifact ("a.out" )
132
+ main_dwo = self .getBuildArtifact ("a.out-main.dwo" )
133
+ foo_dwo = self .getBuildArtifact ("a.out-foo.dwo" )
134
+
135
+ # Make sure dwo files exist
136
+ self .assertTrue (os .path .exists (main_dwo ), f'Make sure "{ main_dwo } " file exists' )
137
+ self .assertTrue (os .path .exists (foo_dwo ), f'Make sure "{ foo_dwo } " file exists' )
138
+
139
+ # Load symbols on-demand
140
+ self .runCmd ("settings set symbols.load-on-demand true" )
141
+
142
+ target = self .dbg .CreateTarget (exe )
143
+ self .assertTrue (target , lldbtest .VALID_TARGET )
144
+
145
+ self .runCmd ("target modules dump separate-debug-info --json" )
146
+
147
+ # Check the output
148
+ output = self .get_dwos_from_json_output ()
149
+ self .assertTrue (output [exe ]["a.out-main.dwo" ]["loaded" ])
150
+ self .assertTrue (output [exe ]["a.out-foo.dwo" ]["loaded" ])
0 commit comments