GDB (xrefs)
caller_is.py
Go to the documentation of this file.
1 # Caller-is functions.
2 # Copyright (C) 2008-2015 Free Software Foundation, Inc.
3 
4 # This program is free software; you can redistribute it and/or modify
5 # it under the terms of the GNU General Public License as published by
6 # the Free Software Foundation; either version 3 of the License, or
7 # (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 
17 import gdb
18 import re
19 
20 class CallerIs(gdb.Function):
21  """Check the calling function's name.
22 
23 Usage:
24  $_caller_is(name [, number_of_frames])
25 
26 Arguments:
27 
28  name: The name of the function to search for.
29 
30  number_of_frames: How many stack frames to traverse back from the currently
31  selected frame to compare with. If the value is greater than the depth of
32  the stack from that point then the result is False.
33  The default is 1.
34 
35 Returns:
36  True if the function's name at the specified frame is equal to name.
37 """
38 
39  def __init__(self):
40  super(CallerIs, self).__init__("_caller_is")
41 
42  def invoke(self, name, nframes = 1):
43  if nframes < 0:
44  raise ValueError("nframes must be >= 0")
45  frame = gdb.selected_frame()
46  while nframes > 0:
47  frame = frame.older()
48  if frame is None:
49  return False
50  nframes = nframes - 1
51  return frame.name() == name.string()
52 
53 class CallerMatches(gdb.Function):
54  """Compare the calling function's name with a regexp.
55 
56 Usage:
57  $_caller_matches(regex [, number_of_frames])
58 
59 Arguments:
60 
61  regex: The regular expression to compare the function's name with.
62 
63  number_of_frames: How many stack frames to traverse back from the currently
64  selected frame to compare with. If the value is greater than the depth of
65  the stack from that point then the result is False.
66  The default is 1.
67 
68 Returns:
69  True if the function's name at the specified frame matches regex.
70 """
71 
72  def __init__(self):
73  super(CallerMatches, self).__init__("_caller_matches")
74 
75  def invoke(self, name, nframes = 1):
76  if nframes < 0:
77  raise ValueError("nframes must be >= 0")
78  frame = gdb.selected_frame()
79  while nframes > 0:
80  frame = frame.older()
81  if frame is None:
82  return False
83  nframes = nframes - 1
84  return re.match(name.string(), frame.name()) is not None
85 
86 class AnyCallerIs(gdb.Function):
87  """Check all calling function's names.
88 
89 Usage:
90  $_any_caller_is(name [, number_of_frames])
91 
92 Arguments:
93 
94  name: The name of the function to search for.
95 
96  number_of_frames: How many stack frames to traverse back from the currently
97  selected frame to compare with. If the value is greater than the depth of
98  the stack from that point then the result is False.
99  The default is 1.
100 
101 Returns:
102  True if any function's name is equal to name.
103 """
104 
105  def __init__(self):
106  super(AnyCallerIs, self).__init__("_any_caller_is")
107 
108  def invoke(self, name, nframes = 1):
109  if nframes < 0:
110  raise ValueError("nframes must be >= 0")
111  frame = gdb.selected_frame()
112  while nframes >= 0:
113  if frame.name() == name.string():
114  return True
115  frame = frame.older()
116  if frame is None:
117  return False
118  nframes = nframes - 1
119  return False
120 
121 class AnyCallerMatches(gdb.Function):
122  """Compare all calling function's names with a regexp.
123 
124 Usage:
125  $_any_caller_matches(regex [, number_of_frames])
126 
127 Arguments:
128 
129  regex: The regular expression to compare the function's name with.
130 
131  number_of_frames: How many stack frames to traverse back from the currently
132  selected frame to compare with. If the value is greater than the depth of
133  the stack from that point then the result is False.
134  The default is 1.
135 
136 Returns:
137  True if any function's name matches regex.
138 """
139 
140  def __init__(self):
141  super(AnyCallerMatches, self).__init__("_any_caller_matches")
142 
143  def invoke(self, name, nframes = 1):
144  if nframes < 0:
145  raise ValueError("nframes must be >= 0")
146  frame = gdb.selected_frame()
147  name_re = re.compile(name.string())
148  while nframes >= 0:
149  if name_re.match(frame.name()) is not None:
150  return True
151  frame = frame.older()
152  if frame is None:
153  return False
154  nframes = nframes - 1
155  return False
156 
157 CallerIs()
159 AnyCallerIs()