9.4 Stopping a program in an infinite loop
A program which goes into an infinite loop or "hangs" can be difficult
to debug. On most systems a foreground process can be stopped by
hitting Control-C, which sends it an interrupt signal (SIGINT).
However, this does not help in debugging the problem--the SIGINT
signal terminates the process without producing a core dump. A more
sophisticated approach is to attach to the running process with
a debugger and inspect it interactively.
For example, here is a simple program with an infinite loop:
int
main (void)
{
usigned int i = 0;
while (1) { i++; };
return 0;
}
In order to attach to the program and debug it, the code should be
compiled with the debugging option -g
:
$ gcc -Wall -g loop.c
$ ./a.out
(program hangs)
Once the executable is running we need to find its process id
(PID). This can be done from another session with the command
ps x
:
$ ps x
PID TTY STAT TIME COMMAND
... ..... . ....
891 pts/1 R 0:11 ./a.out
In this case the process id is 891, and we can now attach to it with
gdb
. The debugger should be started in the directory containing
the executable and its source code:(32)
$ gdb a.out
(gdb) attach 891
Attaching to program: a.out, process 891
Reading symbols from /lib/libc.so.6...done.
Loaded symbols for /lib/libc.so.6
Reading symbols from /lib/ld-linux.so.2...done.
Loaded symbols for /lib/ld-linux.so.2
0x080483d4 in main () at loop.c:5
5 while (1) { i++; };
(gdb)
The output shows the line that was about to execute at the point when
the debugger attached to the process. The attached program is paused but
still "live"---it can be examined interactively and continued or
terminated (with the kill
command) if necessary:
(gdb) print i
$1 = 1213315528
(gdb) kill
Kill the program being debugged? (y or n) y
(gdb)
If you want to stop a process immediately and create a core dump, the
shell command kill -3 pid
(where pid is the process
id) will send it a SIGQUIT signal. The SIGQUIT signal does
trigger a core dump, unlike SIGINT. Note that if core dumps were
disabled when the process was started, no core file will be produced
(see section 5.1 Examining core files).