patl@athena.mit.edu (Patrick J. LoPresti) (02/12/91)
Consider the following C program (compiled with "cc -g foo.c -o foo"):
#include <stdio.h>
#include <signal.h>
void MyHandler(int, int, struct sigcontext *);
int number = 6;
main(int argc, char *argv[])
{
signal(SIGFPE, MyHandler);
number = number / 0;
exit(0); /* never gets here */
}
void MyHandler(int type, int code, struct sigcontext *scp)
{
printf("Boom! Type = %d\n",type);
exit(-1);
}
When I run this on my NeXTStation, it does the right thing ("Boom! Type
= 8"). When I run under GDB, MyHandler never executes no matter what I
do. In particular, I ask GDB to "handle 8 nostop" (i.e., do not stop on
FPE signal), but GDB insists on stopping anyway. The "cont" command,
instead of calling my handler, falls through to the exit(0), causing the
program to "exit normally".
I try the same thing on a VAX (compile with gcc -g, run under GDB, ask
it to "handle 8 nostop") and it works. That is, GDB passes the signal
like it should, the code in MyHandler executes, and my program exits
with a status of -1.
Also, if I replace "number = number / 0" with "while (1);", then do a
"kill -FPE <pid>" from a different window, it works fine on both NeXT
and VAX. For some reason, GDB on the NeXT never allows my handler to
execute if the signal is generated internally, but *will* allow it to
execute if the signal is generated externally.
What gives? If this is a GDB bug, where do I go for a working version?
-Pat
P.S. NeXT GDB version 3.1; VAX GDB version 3.5.