263 lines
14 KiB
HTML
263 lines
14 KiB
HTML
<html lang="en">
|
|
<head>
|
|
<title>Signals - Debugging with GDB</title>
|
|
<meta http-equiv="Content-Type" content="text/html">
|
|
<meta name="description" content="Debugging with GDB">
|
|
<meta name="generator" content="makeinfo 4.13">
|
|
<link title="Top" rel="start" href="index.html#Top">
|
|
<link rel="up" href="Stopping.html#Stopping" title="Stopping">
|
|
<link rel="prev" href="Skipping-Over-Functions-and-Files.html#Skipping-Over-Functions-and-Files" title="Skipping Over Functions and Files">
|
|
<link rel="next" href="Thread-Stops.html#Thread-Stops" title="Thread Stops">
|
|
<link href="http://www.gnu.org/software/texinfo/" rel="generator-home" title="Texinfo Homepage">
|
|
<!--
|
|
Copyright (C) 1988-2019 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.''
|
|
-->
|
|
<meta http-equiv="Content-Style-Type" content="text/css">
|
|
<style type="text/css"><!--
|
|
pre.display { font-family:inherit }
|
|
pre.format { font-family:inherit }
|
|
pre.smalldisplay { font-family:inherit; font-size:smaller }
|
|
pre.smallformat { font-family:inherit; font-size:smaller }
|
|
pre.smallexample { font-size:smaller }
|
|
pre.smalllisp { font-size:smaller }
|
|
span.sc { font-variant:small-caps }
|
|
span.roman { font-family:serif; font-weight:normal; }
|
|
span.sansserif { font-family:sans-serif; font-weight:normal; }
|
|
--></style>
|
|
</head>
|
|
<body>
|
|
<div class="node">
|
|
<a name="Signals"></a>
|
|
<p>
|
|
Next: <a rel="next" accesskey="n" href="Thread-Stops.html#Thread-Stops">Thread Stops</a>,
|
|
Previous: <a rel="previous" accesskey="p" href="Skipping-Over-Functions-and-Files.html#Skipping-Over-Functions-and-Files">Skipping Over Functions and Files</a>,
|
|
Up: <a rel="up" accesskey="u" href="Stopping.html#Stopping">Stopping</a>
|
|
<hr>
|
|
</div>
|
|
|
|
<h3 class="section">5.4 Signals</h3>
|
|
|
|
<p><a name="index-signals-388"></a>
|
|
A signal is an asynchronous event that can happen in a program. The
|
|
operating system defines the possible kinds of signals, and gives each
|
|
kind a name and a number. For example, in Unix <code>SIGINT</code> is the
|
|
signal a program gets when you type an interrupt character (often <kbd>Ctrl-c</kbd>);
|
|
<code>SIGSEGV</code> is the signal a program gets from referencing a place in
|
|
memory far away from all the areas in use; <code>SIGALRM</code> occurs when
|
|
the alarm clock timer goes off (which happens only if your program has
|
|
requested an alarm).
|
|
|
|
<p><a name="index-fatal-signals-389"></a>Some signals, including <code>SIGALRM</code>, are a normal part of the
|
|
functioning of your program. Others, such as <code>SIGSEGV</code>, indicate
|
|
errors; these signals are <dfn>fatal</dfn> (they kill your program immediately) if the
|
|
program has not specified in advance some other way to handle the signal.
|
|
<code>SIGINT</code> does not indicate an error in your program, but it is normally
|
|
fatal so it can carry out the purpose of the interrupt: to kill the program.
|
|
|
|
<p><span class="sc">gdb</span> has the ability to detect any occurrence of a signal in your
|
|
program. You can tell <span class="sc">gdb</span> in advance what to do for each kind of
|
|
signal.
|
|
|
|
<p><a name="index-handling-signals-390"></a>Normally, <span class="sc">gdb</span> is set up to let the non-erroneous signals like
|
|
<code>SIGALRM</code> be silently passed to your program
|
|
(so as not to interfere with their role in the program's functioning)
|
|
but to stop your program immediately whenever an error signal happens.
|
|
You can change these settings with the <code>handle</code> command.
|
|
|
|
|
|
<a name="index-info-signals-391"></a>
|
|
<a name="index-info-handle-392"></a>
|
|
<dl><dt><code>info signals</code><dt><code>info handle</code><dd>Print a table of all the kinds of signals and how <span class="sc">gdb</span> has been told to
|
|
handle each one. You can use this to see the signal numbers of all
|
|
the defined types of signals.
|
|
|
|
<br><dt><code>info signals </code><var>sig</var><dd>Similar, but print information only about the specified signal number.
|
|
|
|
<p><code>info handle</code> is an alias for <code>info signals</code>.
|
|
|
|
<br><dt><code>catch signal </code><span class="roman">[</span><var>signal</var><code>... </code><span class="roman">|</span><code> ‘</code><samp><span class="samp">all</span></samp><code>’</code><span class="roman">]</span><dd>Set a catchpoint for the indicated signals. See <a href="Set-Catchpoints.html#Set-Catchpoints">Set Catchpoints</a>,
|
|
for details about this command.
|
|
|
|
<p><a name="index-handle-393"></a><br><dt><code>handle </code><var>signal</var> <span class="roman">[</span><var>keywords</var><code>...</code><span class="roman">]</span><dd>Change the way <span class="sc">gdb</span> handles signal <var>signal</var>. The <var>signal</var>
|
|
can be the number of a signal or its name (with or without the
|
|
‘<samp><span class="samp">SIG</span></samp>’ at the beginning); a list of signal numbers of the form
|
|
‘<samp><var>low</var><span class="samp">-</span><var>high</var></samp>’; or the word ‘<samp><span class="samp">all</span></samp>’, meaning all the
|
|
known signals. Optional arguments <var>keywords</var>, described below,
|
|
say what change to make.
|
|
</dl>
|
|
|
|
<!-- @group -->
|
|
<p>The keywords allowed by the <code>handle</code> command can be abbreviated.
|
|
Their full names are:
|
|
|
|
<dl>
|
|
<dt><code>nostop</code><dd><span class="sc">gdb</span> should not stop your program when this signal happens. It may
|
|
still print a message telling you that the signal has come in.
|
|
|
|
<br><dt><code>stop</code><dd><span class="sc">gdb</span> should stop your program when this signal happens. This implies
|
|
the <code>print</code> keyword as well.
|
|
|
|
<br><dt><code>print</code><dd><span class="sc">gdb</span> should print a message when this signal happens.
|
|
|
|
<br><dt><code>noprint</code><dd><span class="sc">gdb</span> should not mention the occurrence of the signal at all. This
|
|
implies the <code>nostop</code> keyword as well.
|
|
|
|
<br><dt><code>pass</code><dt><code>noignore</code><dd><span class="sc">gdb</span> should allow your program to see this signal; your program
|
|
can handle the signal, or else it may terminate if the signal is fatal
|
|
and not handled. <code>pass</code> and <code>noignore</code> are synonyms.
|
|
|
|
<br><dt><code>nopass</code><dt><code>ignore</code><dd><span class="sc">gdb</span> should not allow your program to see this signal.
|
|
<code>nopass</code> and <code>ignore</code> are synonyms.
|
|
</dl>
|
|
<!-- @end group -->
|
|
|
|
<p>When a signal stops your program, the signal is not visible to the
|
|
program until you
|
|
continue. Your program sees the signal then, if <code>pass</code> is in
|
|
effect for the signal in question <em>at that time</em>. In other words,
|
|
after <span class="sc">gdb</span> reports a signal, you can use the <code>handle</code>
|
|
command with <code>pass</code> or <code>nopass</code> to control whether your
|
|
program sees that signal when you continue.
|
|
|
|
<p>The default is set to <code>nostop</code>, <code>noprint</code>, <code>pass</code> for
|
|
non-erroneous signals such as <code>SIGALRM</code>, <code>SIGWINCH</code> and
|
|
<code>SIGCHLD</code>, and to <code>stop</code>, <code>print</code>, <code>pass</code> for the
|
|
erroneous signals.
|
|
|
|
<p>You can also use the <code>signal</code> command to prevent your program from
|
|
seeing a signal, or cause it to see a signal it normally would not see,
|
|
or to give it any signal at any time. For example, if your program stopped
|
|
due to some sort of memory reference error, you might store correct
|
|
values into the erroneous variables and continue, hoping to see more
|
|
execution; but your program would probably terminate immediately as
|
|
a result of the fatal signal once it saw the signal. To prevent this,
|
|
you can continue with ‘<samp><span class="samp">signal 0</span></samp>’. See <a href="Signaling.html#Signaling">Giving your Program a Signal</a>.
|
|
|
|
<p><a name="index-stepping-and-signal-handlers-394"></a><a name="stepping-and-signal-handlers"></a><span class="sc">gdb</span> optimizes for stepping the mainline code. If a signal
|
|
that has <code>handle nostop</code> and <code>handle pass</code> set arrives while
|
|
a stepping command (e.g., <code>stepi</code>, <code>step</code>, <code>next</code>) is
|
|
in progress, <span class="sc">gdb</span> lets the signal handler run and then resumes
|
|
stepping the mainline code once the signal handler returns. In other
|
|
words, <span class="sc">gdb</span> steps over the signal handler. This prevents
|
|
signals that you've specified as not interesting (with <code>handle
|
|
nostop</code>) from changing the focus of debugging unexpectedly. Note that
|
|
the signal handler itself may still hit a breakpoint, stop for another
|
|
signal that has <code>handle stop</code> in effect, or for any other event
|
|
that normally results in stopping the stepping command sooner. Also
|
|
note that <span class="sc">gdb</span> still informs you that the program received a
|
|
signal if <code>handle print</code> is set.
|
|
|
|
<p><a name="stepping-into-signal-handlers"></a>If you set <code>handle pass</code> for a signal, and your program sets up a
|
|
handler for it, then issuing a stepping command, such as <code>step</code>
|
|
or <code>stepi</code>, when your program is stopped due to the signal will
|
|
step <em>into</em> the signal handler (if the target supports that).
|
|
|
|
<p>Likewise, if you use the <code>queue-signal</code> command to queue a signal
|
|
to be delivered to the current thread when execution of the thread
|
|
resumes (see <a href="Signaling.html#Signaling">Giving your Program a Signal</a>), then a
|
|
stepping command will step into the signal handler.
|
|
|
|
<p>Here's an example, using <code>stepi</code> to step to the first instruction
|
|
of <code>SIGUSR1</code>'s handler:
|
|
|
|
<pre class="smallexample"> (gdb) handle SIGUSR1
|
|
Signal Stop Print Pass to program Description
|
|
SIGUSR1 Yes Yes Yes User defined signal 1
|
|
(gdb) c
|
|
Continuing.
|
|
|
|
Program received signal SIGUSR1, User defined signal 1.
|
|
main () sigusr1.c:28
|
|
28 p = 0;
|
|
(gdb) si
|
|
sigusr1_handler () at sigusr1.c:9
|
|
9 {
|
|
</pre>
|
|
<p>The same, but using <code>queue-signal</code> instead of waiting for the
|
|
program to receive the signal first:
|
|
|
|
<pre class="smallexample"> (gdb) n
|
|
28 p = 0;
|
|
(gdb) queue-signal SIGUSR1
|
|
(gdb) si
|
|
sigusr1_handler () at sigusr1.c:9
|
|
9 {
|
|
(gdb)
|
|
</pre>
|
|
<p><a name="index-extra-signal-information-395"></a><a name="extra-signal-information"></a>On some targets, <span class="sc">gdb</span> can inspect extra signal information
|
|
associated with the intercepted signal, before it is actually
|
|
delivered to the program being debugged. This information is exported
|
|
by the convenience variable <code>$_siginfo</code>, and consists of data
|
|
that is passed by the kernel to the signal handler at the time of the
|
|
receipt of a signal. The data type of the information itself is
|
|
target dependent. You can see the data type using the <code>ptype
|
|
$_siginfo</code> command. On Unix systems, it typically corresponds to the
|
|
standard <code>siginfo_t</code> type, as defined in the <samp><span class="file">signal.h</span></samp>
|
|
system header.
|
|
|
|
<p>Here's an example, on a <span class="sc">gnu</span>/Linux system, printing the stray
|
|
referenced address that raised a segmentation fault.
|
|
|
|
<pre class="smallexample"> (gdb) continue
|
|
Program received signal SIGSEGV, Segmentation fault.
|
|
0x0000000000400766 in main ()
|
|
69 *(int *)p = 0;
|
|
(gdb) ptype $_siginfo
|
|
type = struct {
|
|
int si_signo;
|
|
int si_errno;
|
|
int si_code;
|
|
union {
|
|
int _pad[28];
|
|
struct {...} _kill;
|
|
struct {...} _timer;
|
|
struct {...} _rt;
|
|
struct {...} _sigchld;
|
|
struct {...} _sigfault;
|
|
struct {...} _sigpoll;
|
|
} _sifields;
|
|
}
|
|
(gdb) ptype $_siginfo._sifields._sigfault
|
|
type = struct {
|
|
void *si_addr;
|
|
}
|
|
(gdb) p $_siginfo._sifields._sigfault.si_addr
|
|
$1 = (void *) 0x7ffff7ff7000
|
|
</pre>
|
|
<p>Depending on target support, <code>$_siginfo</code> may also be writable.
|
|
|
|
<p><a name="index-Intel-MPX-boundary-violations-396"></a><a name="index-boundary-violations_002c-Intel-MPX-397"></a>On some targets, a <code>SIGSEGV</code> can be caused by a boundary
|
|
violation, i.e., accessing an address outside of the allowed range.
|
|
In those cases <span class="sc">gdb</span> may displays additional information,
|
|
depending on how <span class="sc">gdb</span> has been told to handle the signal.
|
|
With <code>handle stop SIGSEGV</code>, <span class="sc">gdb</span> displays the violation
|
|
kind: "Upper" or "Lower", the memory address accessed and the
|
|
bounds, while with <code>handle nostop SIGSEGV</code> no additional
|
|
information is displayed.
|
|
|
|
<p>The usual output of a segfault is:
|
|
<pre class="smallexample"> Program received signal SIGSEGV, Segmentation fault
|
|
0x0000000000400d7c in upper () at i386-mpx-sigsegv.c:68
|
|
68 value = *(p + len);
|
|
</pre>
|
|
<p>While a bound violation is presented as:
|
|
<pre class="smallexample"> Program received signal SIGSEGV, Segmentation fault
|
|
Upper bound violation while accessing address 0x7fffffffc3b3
|
|
Bounds: [lower = 0x7fffffffc390, upper = 0x7fffffffc3a3]
|
|
0x0000000000400d7c in upper () at i386-mpx-sigsegv.c:68
|
|
68 value = *(p + len);
|
|
</pre>
|
|
</body></html>
|
|
|