hc
2023-11-06 15ade055295d13f95d49e3d99b09f3bbfb4a43e7
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!-- Copyright (C) 1988-2021 Free Software Foundation, Inc.
 
Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.3 or
any later version published by the Free Software Foundation; with the
Invariant Sections being "Free Software" and "Free Software Needs
Free Documentation", with the Front-Cover Texts being "A GNU Manual,"
and with the Back-Cover Texts as in (a) below.
 
(a) The FSF's Back-Cover Text is: "You are free to copy and modify
this GNU Manual.  Buying copies from GNU Press supports the FSF in
developing GNU and promoting software freedom." -->
<!-- Created by GNU Texinfo 5.1, http://www.gnu.org/software/texinfo/ -->
<head>
<title>Debugging with GDB: Functions In Python</title>
 
<meta name="description" content="Debugging with GDB: Functions In Python">
<meta name="keywords" content="Debugging with GDB: Functions In Python">
<meta name="resource-type" content="document">
<meta name="distribution" content="global">
<meta name="Generator" content="makeinfo">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link href="index.html#Top" rel="start" title="Top">
<link href="Concept-Index.html#Concept-Index" rel="index" title="Concept Index">
<link href="index.html#SEC_Contents" rel="contents" title="Table of Contents">
<link href="Python-API.html#Python-API" rel="up" title="Python API">
<link href="Progspaces-In-Python.html#Progspaces-In-Python" rel="next" title="Progspaces In Python">
<link href="Parameters-In-Python.html#Parameters-In-Python" rel="previous" title="Parameters In Python">
<style type="text/css">
<!--
a.summary-letter {text-decoration: none}
blockquote.smallquotation {font-size: smaller}
div.display {margin-left: 3.2em}
div.example {margin-left: 3.2em}
div.indentedblock {margin-left: 3.2em}
div.lisp {margin-left: 3.2em}
div.smalldisplay {margin-left: 3.2em}
div.smallexample {margin-left: 3.2em}
div.smallindentedblock {margin-left: 3.2em; font-size: smaller}
div.smalllisp {margin-left: 3.2em}
kbd {font-style:oblique}
pre.display {font-family: inherit}
pre.format {font-family: inherit}
pre.menu-comment {font-family: serif}
pre.menu-preformatted {font-family: serif}
pre.smalldisplay {font-family: inherit; font-size: smaller}
pre.smallexample {font-size: smaller}
pre.smallformat {font-family: inherit; font-size: smaller}
pre.smalllisp {font-size: smaller}
span.nocodebreak {white-space:nowrap}
span.nolinebreak {white-space:nowrap}
span.roman {font-family:serif; font-weight:normal}
span.sansserif {font-family:sans-serif; font-weight:normal}
ul.no-bullet {list-style: none}
-->
</style>
 
 
</head>
 
<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
<a name="Functions-In-Python"></a>
<div class="header">
<p>
Next: <a href="Progspaces-In-Python.html#Progspaces-In-Python" accesskey="n" rel="next">Progspaces In Python</a>, Previous: <a href="Parameters-In-Python.html#Parameters-In-Python" accesskey="p" rel="previous">Parameters In Python</a>, Up: <a href="Python-API.html#Python-API" accesskey="u" rel="up">Python API</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html#Concept-Index" title="Index" rel="index">Index</a>]</p>
</div>
<hr>
<a name="Writing-new-convenience-functions"></a>
<h4 class="subsubsection">23.2.2.22 Writing new convenience functions</h4>
 
<a name="index-writing-convenience-functions"></a>
<a name="index-convenience-functions-in-python"></a>
<a name="index-python-convenience-functions"></a>
<a name="index-gdb_002eFunction"></a>
<a name="index-Function"></a>
<p>You can implement new convenience functions (see <a href="Convenience-Vars.html#Convenience-Vars">Convenience Vars</a>)
in Python.  A convenience function is an instance of a subclass of the
class <code>gdb.Function</code>.
</p>
<dl>
<dt><a name="index-Function_002e_005f_005finit_005f_005f"></a>Function: <strong>Function.__init__</strong> <em>(name)</em></dt>
<dd><p>The initializer for <code>Function</code> registers the new function with
<small>GDB</small>.  The argument <var>name</var> is the name of the function,
a string.  The function will be visible to the user as a convenience
variable of type <code>internal function</code>, whose name is the same as
the given <var>name</var>.
</p>
<p>The documentation for the new function is taken from the documentation
string for the new class.
</p></dd></dl>
 
<dl>
<dt><a name="index-Function_002einvoke"></a>Function: <strong>Function.invoke</strong> <em>(<var>*args</var>)</em></dt>
<dd><p>When a convenience function is evaluated, its arguments are converted
to instances of <code>gdb.Value</code>, and then the function&rsquo;s
<code>invoke</code> method is called.  Note that <small>GDB</small> does not
predetermine the arity of convenience functions.  Instead, all
available arguments are passed to <code>invoke</code>, following the
standard Python calling convention.  In particular, a convenience
function can have default values for parameters without ill effect.
</p>
<p>The return value of this method is used as its value in the enclosing
expression.  If an ordinary Python value is returned, it is converted
to a <code>gdb.Value</code> following the usual rules.
</p></dd></dl>
 
<p>The following code snippet shows how a trivial convenience function can
be implemented in Python:
</p>
<div class="smallexample">
<pre class="smallexample">class Greet (gdb.Function):
  &quot;&quot;&quot;Return string to greet someone.
Takes a name as argument.&quot;&quot;&quot;
 
  def __init__ (self):
    super (Greet, self).__init__ (&quot;greet&quot;)
 
  def invoke (self, name):
    return &quot;Hello, %s!&quot; % name.string ()
 
Greet ()
</pre></div>
 
<p>The last line instantiates the class, and is necessary to trigger the
registration of the function with <small>GDB</small>.  Depending on how the
Python code is read into <small>GDB</small>, you may need to import the
<code>gdb</code> module explicitly.
</p>
<p>Now you can use the function in an expression:
</p>
<div class="smallexample">
<pre class="smallexample">(gdb) print $greet(&quot;Bob&quot;)
$1 = &quot;Hello, Bob!&quot;
</pre></div>
 
<hr>
<div class="header">
<p>
Next: <a href="Progspaces-In-Python.html#Progspaces-In-Python" accesskey="n" rel="next">Progspaces In Python</a>, Previous: <a href="Parameters-In-Python.html#Parameters-In-Python" accesskey="p" rel="previous">Parameters In Python</a>, Up: <a href="Python-API.html#Python-API" accesskey="u" rel="up">Python API</a> &nbsp; [<a href="index.html#SEC_Contents" title="Table of contents" rel="contents">Contents</a>][<a href="Concept-Index.html#Concept-Index" title="Index" rel="index">Index</a>]</p>
</div>
 
 
 
</body>
</html>