- publishing free software manuals
An Introduction to GCC - for the GNU compilers gcc and g++
by Brian J. Gough, foreword by Richard M. Stallman
Paperback (6"x9"), 144 pages
ISBN 0954161793
RRP £12.95 ($19.95)

"An excellent introduction... fills a much-needed niche in the marketplace" --- Association of C and C++ Users book review (Issue 16-4, August 2004) Get a printed copy>>>

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).

ISBN 0954161793An Introduction to GCC - for the GNU compilers gcc and g++See the print edition