File: Using-gdb.html

package info (click to toggle)
gsl-ref-html 2.3-1
  • links: PTS
  • area: non-free
  • in suites: bullseye, buster, sid
  • size: 6,876 kB
  • ctags: 4,574
  • sloc: makefile: 35
file content (180 lines) | stat: -rw-r--r-- 7,829 bytes parent folder | download
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
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<!-- Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016 The GSL Team.

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 "GNU General Public License" and "Free Software
Needs Free Documentation", the Front-Cover text being "A GNU Manual",
and with the Back-Cover Text being (a) (see below). A copy of the
license is included in the section entitled "GNU Free Documentation
License".

(a) The Back-Cover Text is: "You have the freedom to copy and modify this
GNU Manual." -->
<!-- Created by GNU Texinfo 5.1, http://www.gnu.org/software/texinfo/ -->
<head>
<title>GNU Scientific Library &ndash; Reference Manual: Using gdb</title>

<meta name="description" content="GNU Scientific Library &ndash; Reference Manual: Using gdb">
<meta name="keywords" content="GNU Scientific Library &ndash; Reference Manual: Using gdb">
<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="Function-Index.html#Function-Index" rel="index" title="Function Index">
<link href="Debugging-Numerical-Programs.html#Debugging-Numerical-Programs" rel="up" title="Debugging Numerical Programs">
<link href="Examining-floating-point-registers.html#Examining-floating-point-registers" rel="next" title="Examining floating point registers">
<link href="Debugging-Numerical-Programs.html#Debugging-Numerical-Programs" rel="previous" title="Debugging Numerical Programs">
<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="Using-gdb"></a>
<div class="header">
<p>
Next: <a href="Examining-floating-point-registers.html#Examining-floating-point-registers" accesskey="n" rel="next">Examining floating point registers</a>, Up: <a href="Debugging-Numerical-Programs.html#Debugging-Numerical-Programs" accesskey="u" rel="up">Debugging Numerical Programs</a> &nbsp; [<a href="Function-Index.html#Function-Index" title="Index" rel="index">Index</a>]</p>
</div>
<hr>
<a name="Using-gdb-1"></a>
<h3 class="section">A.1 Using gdb</h3>
<a name="index-gdb"></a>
<a name="index-debugging-numerical-programs"></a>
<a name="index-breakpoints"></a>
<p>Any errors reported by the library are passed to the function
<code>gsl_error</code>.  By running your programs under gdb and setting a
breakpoint in this function you can automatically catch any library
errors.  You can add a breakpoint for every session by putting
</p>
<div class="example">
<pre class="example">break gsl_error
</pre></div>

<p>into your <samp>.gdbinit</samp> file in the directory where your program is
started.  
</p>
<p>If the breakpoint catches an error then you can use a backtrace
(<code>bt</code>) to see the call-tree, and the arguments which possibly
caused the error.  By moving up into the calling function you can
investigate the values of variables at that point.  Here is an example
from the program <code>fft/test_trap</code>, which contains the following
line,
</p>
<div class="smallexample">
<pre class="smallexample">status = gsl_fft_complex_wavetable_alloc (0, &amp;complex_wavetable);
</pre></div>

<p>The function <code>gsl_fft_complex_wavetable_alloc</code> takes the length of
an FFT as its first argument.  When this line is executed an error will
be generated because the length of an FFT is not allowed to be zero.
</p>
<p>To debug this problem we start <code>gdb</code>, using the file
<samp>.gdbinit</samp> to define a breakpoint in <code>gsl_error</code>,
</p>
<div class="smallexample">
<pre class="smallexample">$ gdb test_trap

GDB is free software and you are welcome to distribute copies
of it under certain conditions; type &quot;show copying&quot; to see
the conditions.  There is absolutely no warranty for GDB;
type &quot;show warranty&quot; for details.  GDB 4.16 (i586-debian-linux), 
Copyright 1996 Free Software Foundation, Inc.

Breakpoint 1 at 0x8050b1e: file error.c, line 14.
</pre></div>

<p>When we run the program this breakpoint catches the error and shows the
reason for it. 
</p>
<div class="smallexample">
<pre class="smallexample">(gdb) run
Starting program: test_trap 

Breakpoint 1, gsl_error (reason=0x8052b0d 
    &quot;length n must be positive integer&quot;, 
    file=0x8052b04 &quot;c_init.c&quot;, line=108, gsl_errno=1) 
    at error.c:14
14        if (gsl_error_handler) 
</pre></div>

<p>The first argument of <code>gsl_error</code> is always a string describing the
error.  Now we can look at the backtrace to see what caused the problem,
</p>
<div class="smallexample">
<pre class="smallexample">(gdb) bt
#0  gsl_error (reason=0x8052b0d 
    &quot;length n must be positive integer&quot;, 
    file=0x8052b04 &quot;c_init.c&quot;, line=108, gsl_errno=1)
    at error.c:14
#1  0x8049376 in gsl_fft_complex_wavetable_alloc (n=0,
    wavetable=0xbffff778) at c_init.c:108
#2  0x8048a00 in main (argc=1, argv=0xbffff9bc) 
    at test_trap.c:94
#3  0x80488be in ___crt_dummy__ ()
</pre></div>

<p>We can see that the error was generated in the function
<code>gsl_fft_complex_wavetable_alloc</code> when it was called with an
argument of <var>n=0</var>.  The original call came from line 94 in the
file <samp>test_trap.c</samp>.
</p>
<p>By moving up to the level of the original call we can find the line that
caused the error,
</p>
<div class="smallexample">
<pre class="smallexample">(gdb) up
#1  0x8049376 in gsl_fft_complex_wavetable_alloc (n=0,
    wavetable=0xbffff778) at c_init.c:108
108   GSL_ERROR (&quot;length n must be positive integer&quot;, GSL_EDOM);
(gdb) up
#2  0x8048a00 in main (argc=1, argv=0xbffff9bc) 
    at test_trap.c:94
94    status = gsl_fft_complex_wavetable_alloc (0,
        &amp;complex_wavetable);
</pre></div>

<p>Thus we have found the line that caused the problem.  From this point we
could also print out the values of other variables such as
<code>complex_wavetable</code>.
</p>
<hr>
<div class="header">
<p>
Next: <a href="Examining-floating-point-registers.html#Examining-floating-point-registers" accesskey="n" rel="next">Examining floating point registers</a>, Up: <a href="Debugging-Numerical-Programs.html#Debugging-Numerical-Programs" accesskey="u" rel="up">Debugging Numerical Programs</a> &nbsp; [<a href="Function-Index.html#Function-Index" title="Index" rel="index">Index</a>]</p>
</div>



</body>
</html>