Merge branch 'master' of gnunet.org:gnunet
[oweals/gnunet.git] / contrib / gdb-iterate-dll.py
1 from gdb import *
2
3
4 def search_dll(head, field, match, pfield):
5     """
6     Search in a DLL by iterates over it.
7
8     head: name of the symbol denoting the head of the DLL
9     field: the field that should be search for match
10     match: the mathing value for field
11     pfield: the field whose value is to be printed for matched elements; None to
12       print all fields of the matched elemented
13     """
14
15     (symbol, _) = lookup_symbol(head)
16     if symbol is None:
17         print("Can't find symbol: " + head)
18         return
19     symbol_val = symbol.value()
20     while symbol_val:
21         symbol_val_def = symbol_val.dereference()
22         field_val = symbol_val_def[field]
23         if field_val.type.code == gdb.TYPE_CODE_INT:
24             val = int(field_val)
25             res = (match == val)
26         elif (field_val.type.code == gdb.TYPE_CODE_STRING) or (field_val.type.code == gdb.TYPE_CODE_ARRAY):
27             val = str(field_val)
28             res = (match == val)
29         elif (field_val.type.code == gdb.TYPE_CODE_TYPEDEF):
30             val = str(field_val)
31             res = match in val
32         else:
33             continue
34
35         if res:
36             if pfield is None:
37                 print(symbol_val_def)
38             else:
39                 print(symbol_val_def[pfield])
40         symbol_val = symbol_val_def["next"]