This file is indexed.

/usr/share/doc/gnat-gps/html/Customizing-the-Debugger.html is in gnat-gps-doc 5.0-16.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  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
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!-- Copyright (C) 2002-2010 AdaCore.

This document is free; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This document is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License along
with this program; if not, see http://www.gnu.org/licenses/.

A copy of the license is included in the section entitled
"GNU General Public License". -->
<!-- Created by GNU Texinfo 5.1, http://www.gnu.org/software/texinfo/ -->
<head>
<title>Using the GNAT Programming Studio: Customizing the Debugger</title>

<meta name="description" content="Using the GNAT Programming Studio: Customizing the Debugger">
<meta name="keywords" content="Using the GNAT Programming Studio: Customizing the Debugger">
<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="Index-table.html#Index-table" rel="index" title="Index table">
<link href="Debugging.html#Debugging" rel="up" title="Debugging">
<link href="Version-Control-System.html#Version-Control-System" rel="next" title="Version Control System">
<link href="The-Debugger-Console.html#The-Debugger-Console" rel="previous" title="The Debugger Console">
<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}
pre.smallexample {background-color:rgb(240,240,240);
                     font-family: courier new,courier,fixed;
                     font-size: 14px;
                     margin: 0px 40px 0px 40px;
                     border-width: 1px 2px 2px 1px;
                     border-top-style: dotted;
                     border-left-style: dotted;
                     border-right-style: solid;
                     border-bottom-style: solid;
                     border-color: black;}
   code             {color:black;
                     font-family: courier new,courier,fixed;
                     font-size: 14px;}
   body             {font-family: arial,helvetica,sans-serif;
                     font-size: 16px;
                     max-width: 800px;
                     text-align: justify}
   samp             {font-family: courier new,courier,fixed;
                     font-size: 14px}
                    

-->
</style>


</head>

<body lang="en" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
<a name="Customizing-the-Debugger"></a>
<div class="header">
<p>
Previous: <a href="The-Debugger-Console.html#The-Debugger-Console" accesskey="p" rel="previous">The Debugger Console</a>, Up: <a href="Debugging.html#Debugging" accesskey="u" rel="up">Debugging</a> &nbsp; [<a href="Index-table.html#Index-table" title="Index" rel="index">Index</a>]</p>
</div>
<hr>
<a name="Customizing-the-Debugger-1"></a>
<h3 class="section">11.9 Customizing the Debugger</h3>
<a name="index-debugger-4"></a>

<p>GPS is a high-level interface to several debugger backends, in particular gdb.
Each back end has its own strengths, but you can enhance the command line
interface to these backends through GPS, using Python.
</p>
<p>This section will provide a small such example. The idea is to provide the
notion of &quot;alias&quot; in the debugger console. For example, this can be used so
that you type &quot;foo&quot;, and this really executes a longer command, like displaying
the value of a variable with a long name.
</p>
<p><code>gdb</code> already provides this feature through the <code>define</code> keywords,
but we will in fact rewrite that feature in terms of python.
</p>
<p>GPS provides an extensive Python API to interface with each of the running
debugger. In particular, it provides the function &quot;send&quot;, which can be used
to send a command to the debugger, and get its output, and the function
&quot;set_output&quot;, which can be used when you implement your own functions.
</p>
<p>It also provides, through <code>hook</code>, the capability to monitor the state of
the debugger back-end. In particular, one such hook,
<code>debugger_command_action_hook</code> is called when the user has typed a
command in the debugger console, and before the command is executed. This can
be used to add your own commands. The example below uses this hook.
</p>
<p>Here is the code:
</p>
<div class="smallexample">
<pre class="smallexample">import GPS

aliases={}

def set_alias (name, command):
   &quot;&quot;&quot;Set a new debugger alias. Typing this alias in a debugger window
      will then execute command&quot;&quot;&quot;
   global aliases
   aliases[name] = command

def execute_alias (debugger, name):
   return debugger.send (aliases[name], output=False)

def debugger_commands (hook, debugger, command):
   global aliases
   words = command.split()
   if words[0] == &quot;alias&quot;:
      set_alias (words[1], &quot; &quot;.join (words [2:]))
      return True
   elif aliases.has_key (words [0]):
      debugger.set_output (execute_alias (debugger, words[0]))
      return True
   else:
      return False

GPS.Hook (&quot;debugger_command_action_hook&quot;).add (debugger_commands)
</pre></div>

<p>The list of aliases is stored in the global variable <code>aliases</code>, which
is modified by <code>set_alias</code>. Whenever the user executes an alias, the
real command send to the debugger is sent through <code>execute_alias</code>.
</p>
<p>The real part of the work is done by <code>debugger_commands</code>. If the user
is executing the <code>alias</code> command, it defines a new alias. Otherwise, if
he typed the name of an alias, we really want to execute that alias. Else,
we let the debugger back-end handle that command.
</p>
<p>After you have copied this example in the <samp>$HOME/.gps/plug-ins</samp> directory,
you can start a debugger as usual in GPS, and type the following in its
console:
</p>
<div class="smallexample">
<pre class="smallexample">   (gdb) alias foo print a_long_long_name
   (gdb) foo
</pre></div>

<p>The first command defines the alias, the second line executes it.
</p>
<p>This alias can also be used within the <code>graph display</code> command, so that
the value of the variable is in fact displayed in the data window automatically,
for instance:
</p>
<div class="smallexample">
<pre class="smallexample">   (gdb) graph display `foo`
</pre></div>

<p>Other examples can be programmed. You could write complex python functions,
which would for instance query the value of several variables, and pretty
print the result. This complex python function can then be called from the
debugger console, or automatically every time the debugger stops through the
<code>graph display</code> command.
</p>
<hr>
<div class="header">
<p>
Previous: <a href="The-Debugger-Console.html#The-Debugger-Console" accesskey="p" rel="previous">The Debugger Console</a>, Up: <a href="Debugging.html#Debugging" accesskey="u" rel="up">Debugging</a> &nbsp; [<a href="Index-table.html#Index-table" title="Index" rel="index">Index</a>]</p>
</div>



</body>
</html>