1999-03-17  Ulrich Drepper  <drepper@cygnus.com>

	* sysdeps/generic/segfault.c (write_strsignal): New function.
	(catch_segfault): Use it instead of calling strsignal.
This commit is contained in:
Ulrich Drepper 1999-03-17 18:37:48 +00:00
parent e573146ab2
commit f2a3785888
2 changed files with 39 additions and 7 deletions

View File

@ -1,3 +1,8 @@
1999-03-17 Ulrich Drepper <drepper@cygnus.com>
* sysdeps/generic/segfault.c (write_strsignal): New function.
(catch_segfault): Use it instead of calling strsignal.
1999-03-16 Andreas Jaeger <aj@arthur.rhein-neckar.de> 1999-03-16 Andreas Jaeger <aj@arthur.rhein-neckar.de>
* iconv/gconv.c (__gconv): Change type of last_start to unsigned * iconv/gconv.c (__gconv): Change type of last_start to unsigned

View File

@ -22,6 +22,7 @@
#include <execinfo.h> #include <execinfo.h>
#include <fcntl.h> #include <fcntl.h>
#include <signal.h> #include <signal.h>
#include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
@ -67,6 +68,10 @@ extern void *__libc_stack_end;
# define ADVANCE_STACK_FRAME(next) ((struct layout *) (next)) # define ADVANCE_STACK_FRAME(next) ((struct layout *) (next))
#endif #endif
/* We'll use tis a lot. */
#define WRITE_STRING(s) write (fd, s, strlen (s))
struct layout struct layout
{ {
void *next; void *next;
@ -74,6 +79,27 @@ struct layout
}; };
/* Name of the output file. */
static const char *fname;
/* We better should not use `strerror' since it can call far too many
other functions which might fail. Do it here ourselves. */
static void
write_strsignal (int fd, int signal)
{
if (signal < 0 || signal >= _NSIG || _sys_siglist[signal] == NULL)
{
char buf[30];
char *ptr = _itoa_word (signal, &buf[sizeof (buf)], 10, 0);
WRITE_STRING ("signal ");
write (fd, buf, &buf[sizeof (buf)] - ptr);
}
else
WRITE_STRING (_sys_siglist[signal]);
}
/* This function is called when a segmentation fault is caught. The system /* This function is called when a segmentation fault is caught. The system
is in an instable state now. This means especially that malloc() might is in an instable state now. This means especially that malloc() might
not work anymore. */ not work anymore. */
@ -83,28 +109,23 @@ catch_segfault (int signal, SIGCONTEXT ctx)
struct layout *current; struct layout *current;
void *top_frame; void *top_frame;
void *top_stack; void *top_stack;
const char *fname;
int fd; int fd;
void **arr; void **arr;
size_t cnt; size_t cnt;
struct sigaction sa; struct sigaction sa;
const char *sigstring;
/* This is the name of the file we are writing to. If none is given /* This is the name of the file we are writing to. If none is given
or we cannot write to this file write to stderr. */ or we cannot write to this file write to stderr. */
fd = 2; fd = 2;
fname = getenv ("SEGFAULT_OUTPUT_NAME"); if (fname != NULL)
if (fname != NULL && fname[0] != '\0')
{ {
fd = open (fname, O_TRUNC | O_WRONLY | O_CREAT, 0666); fd = open (fname, O_TRUNC | O_WRONLY | O_CREAT, 0666);
if (fd == -1) if (fd == -1)
fd = 2; fd = 2;
} }
#define WRITE_STRING(s) write (fd, s, strlen (s))
WRITE_STRING ("*** "); WRITE_STRING ("*** ");
sigstring = strsignal (signal); write_strsignal (fd, signal);
WRITE_STRING (sigstring);
WRITE_STRING ("\n"); WRITE_STRING ("\n");
#ifdef REGISTER_DUMP #ifdef REGISTER_DUMP
@ -164,6 +185,7 @@ install_handler (void)
{ {
struct sigaction sa; struct sigaction sa;
const char *sigs = getenv ("SEGFAULT_SIGNALS"); const char *sigs = getenv ("SEGFAULT_SIGNALS");
const char *name;
sa.sa_handler = (void *) catch_segfault; sa.sa_handler = (void *) catch_segfault;
sigemptyset (&sa.sa_mask); sigemptyset (&sa.sa_mask);
@ -214,4 +236,9 @@ install_handler (void)
INSTALL_FOR_SIG (SIGABRT, "abrt"); INSTALL_FOR_SIG (SIGABRT, "abrt");
INSTALL_FOR_SIG (SIGFPE, "fpe"); INSTALL_FOR_SIG (SIGFPE, "fpe");
} }
/* Preserve the output file name if there is any given. */
name = getenv ("SEGFAULT_OUTPUT_NAME");
if (name != NULL && name[0] != '\0')
fname = __strdup (name);
} }