@@ -60,6 +60,42 @@ def __init__(self, symbol, frame):
60
60
GdbSymbolResult (symbol , frame ))
61
61
62
62
63
+ def FindObjfileForName (name ):
64
+ for objfile in gdb .objfiles ():
65
+ if JsDbgBase .FormatModule (objfile .filename ) == name :
66
+ return objfile
67
+ return None
68
+
69
+
70
+ def FindGdbSymbol (module , symbol ):
71
+ objfile = FindObjfileForName (module )
72
+ if objfile is None :
73
+ return None
74
+ # GDB 8.4 and later let us look up symbols per-objfile; use that if
75
+ # possible. Also, only 8.4 and later let us look for symbols with static
76
+ # linkage. So in older versions we have to use gdb.lookup_symbol.
77
+ if hasattr (objfile , 'lookup_static_symbol' ):
78
+ # We try static first, because in practice most of the symbols we look
79
+ # up here are static (or in an anonymous namespace, which is equivalent)
80
+ sym = objfile .lookup_static_symbol (symbol )
81
+ if sym is None :
82
+ sym = objfile .lookup_global_symbol (symbol )
83
+ else :
84
+ (sym , _ ) = gdb .lookup_symbol (symbol )
85
+ return sym
86
+
87
+
88
+ def FindGdbType (module , type_name ):
89
+ # Types are also symbols, so we just look them up as symbols. This is
90
+ # what GDB does internally.
91
+ type_symbol = FindGdbSymbol (module , type_name )
92
+ if type_symbol is None :
93
+ return None
94
+ if type_symbol .addr_class != gdb .SYMBOL_LOC_TYPEDEF :
95
+ return None
96
+ return type_symbol .type
97
+
98
+
63
99
def DebuggerQuery (tag , command ):
64
100
# pi exec('print(\\'{0}~\\' + str({1}))')
65
101
try :
@@ -114,7 +150,10 @@ def ExecuteGdbCommand(cmd):
114
150
115
151
116
152
def GetAllFields (module , type , includeBaseTypes ):
117
- t = gdb .lookup_type (type )
153
+ t = FindGdbType (module , type )
154
+ if t is None :
155
+ return None
156
+
118
157
fields = t .fields ()
119
158
resultFields = []
120
159
for field in fields :
@@ -167,20 +206,24 @@ def GetBaseTypesFromGdbType(module, type, extra_bitoffset=0):
167
206
168
207
169
208
def GetBaseTypes (module , type_name ):
170
- try :
171
- t = gdb .lookup_type (type_name )
172
- except :
209
+ t = FindGdbType (module , type_name )
210
+ if t is None :
173
211
# Type is a base type?
174
- return [JsDbgTypes .BaseTypeResult (module , type_name , 0 )]
212
+ return [JsDbgTypes .SBaseTypeResult (module , type_name , 0 )]
175
213
176
214
return GetBaseTypesFromGdbType (module , t )
177
215
178
216
def IsTypeEnum (module , type ):
179
- t = gdb .lookup_type (type )
217
+ t = FindGdbType (module , type )
218
+ if t is None :
219
+ return False
180
220
return t .code == gdb .TYPE_CODE_ENUM
181
221
182
222
def LookupField (module , type , field ):
183
- t = gdb .lookup_type (type )
223
+ t = FindGdbType (module , type )
224
+ if t is None :
225
+ return None
226
+
184
227
fields = t .fields ()
185
228
while fields :
186
229
match = list (filter (lambda x : x .name == field , fields ))
@@ -200,21 +243,18 @@ def LookupField(module, type, field):
200
243
fields = [f for m in match for f in m .type .fields ()]
201
244
202
245
def LookupGlobalSymbol (module , symbol ):
203
- # We can't use lookup_global_symbol because that does not work for symbols
204
- # with local linkage, such as those in an anonymous namespace.
205
- # https://sourceware.org/bugzilla/show_bug.cgi?id=24474
206
- (sym , _ ) = gdb .lookup_symbol (symbol )
246
+ sym = FindGdbSymbol (module , symbol )
207
247
if sym is None :
208
248
return None
209
249
return GdbSymbolResult (sym )
210
250
211
251
212
252
def GetModuleForName (module ):
213
- for objfile in gdb . objfiles ():
214
- if JsDbgBase . FormatModule ( objfile . filename ) == module :
215
- # Python has no API to find the base address
216
- # https://sourceware.org/bugzilla/show_bug.cgi?id=24481
217
- return JsDbgTypes .SModule (module , 0 )
253
+ objfile = FindObjfileForName ( module )
254
+ if objfile :
255
+ # Python has no API to find the base address
256
+ # https://sourceware.org/bugzilla/show_bug.cgi?id=24481
257
+ return JsDbgTypes .SModule (module , 0 )
218
258
return None
219
259
220
260
@@ -252,12 +292,16 @@ def LookupTypeSize(module, typename):
252
292
if (typename .endswith ("*" )):
253
293
t = gdb .lookup_type ("void" )
254
294
return t .reference ().sizeof
255
- t = gdb .lookup_type (typename )
295
+ t = FindGdbType (module , typename )
296
+ if t is None :
297
+ return None
256
298
return t .sizeof
257
299
258
300
259
301
def LookupConstants (module , type , value ):
260
- type = gdb .lookup_type (type )
302
+ type = FindGdbType (module , type )
303
+ if type is None :
304
+ return None
261
305
if type .code != gdb .TYPE_CODE_ENUM :
262
306
return None
263
307
values = []
@@ -275,7 +319,9 @@ def LookupConstants(module, type, value):
275
319
276
320
def LookupConstant (module , typename , constantName ):
277
321
if typename :
278
- type = gdb .lookup_type (typename )
322
+ type = FindGdbType (module , typename )
323
+ if type is None :
324
+ return None
279
325
# Values in enum classes are stored as type::eFoo;
280
326
# regular enums as just eFoo.
281
327
matches = [f for f in type .fields () if f .name .endswith ("::" + constantName ) or f .name == constantName ]
0 commit comments