#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <errno.h>
#define __USE_GNU
#include <ucontext.h>
static void sigsegv_handler(int signum, struct siginfo * info, void * ptr)
{
static const char *si_codes[3] = {"", "SEGV_MAPERR", "SEGV_ACCERR"};
int i;
struct ucontext *ucontext = (struct ucontext *)ptr;
printf("Segmentation Fault Trace:\n");
printf("info.si_signo %d\n", signum);
printf("info.si_errno %d\n", info->si_errno);
printf("info.si_code %d (%s)\n", info->si_code, si_codes[info->si_code]);
printf("info.si_addr %p\n", info->si_addr);
/*for x86*/
printf("the eip 0x%x\n", ucontext->uc_mcontext.gregs[REG_EIP]);
exit (-1);
}
static void catch_sigsegv ()
{
struct sigaction action;
memset (&action, 0, sizeof(action));
action.sa_sigaction = sigsegv_handler;
action.sa_flags = SA_SIGINFO;
if (sigaction(SIGSEGV, &action, NULL) < 0)
{
perror("sigaction");
}
return;
}
void dummy_function (void)
{
unsigned char *ptr = 0x00;
*ptr = 0x00;
}
int main (void)
{
catch_sigsegv();
dummy_function ();
return 0;
}
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <errno.h>
#define __USE_GNU
#include <ucontext.h>
static void sigsegv_handler(int signum, struct siginfo * info, void * ptr)
{
static const char *si_codes[3] = {"", "SEGV_MAPERR", "SEGV_ACCERR"};
int i;
struct ucontext *ucontext = (struct ucontext *)ptr;
printf("Segmentation Fault Trace:\n");
printf("info.si_signo %d\n", signum);
printf("info.si_errno %d\n", info->si_errno);
printf("info.si_code %d (%s)\n", info->si_code, si_codes[info->si_code]);
printf("info.si_addr %p\n", info->si_addr);
/*for x86*/
printf("the eip 0x%x\n", ucontext->uc_mcontext.gregs[REG_EIP]);
exit (-1);
}
static void catch_sigsegv ()
{
struct sigaction action;
memset (&action, 0, sizeof(action));
action.sa_sigaction = sigsegv_handler;
action.sa_flags = SA_SIGINFO;
if (sigaction(SIGSEGV, &action, NULL) < 0)
{
perror("sigaction");
}
return;
}
void dummy_function (void)
{
unsigned char *ptr = 0x00;
*ptr = 0x00;
}
int main (void)
{
catch_sigsegv();
dummy_function ();
return 0;
}
#include <execinfo.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void
myfunc3(void)
{
int j, nptrs;
#define SIZE 100
void *buffer[100];
char **strings;
nptrs = backtrace(buffer, SIZE);
printf("backtrace() returned %d addresses\n", nptrs);
/* The call backtrace_symbols_fd(buffer, nptrs, STDOUT_FILENO)
would produce similar output to the following: */
strings = backtrace_symbols(buffer, nptrs);
if (strings == NULL) {
perror("backtrace_symbols");
exit(EXIT_FAILURE);
}
for (j = 0; j < nptrs; j++)
printf("%s\n", strings[j]);
free(strings);
}
static void /* "static" means don't export the symbol... */
myfunc2(void)
{
myfunc3();
}
void
myfunc(int ncalls)
{
if (ncalls > 1)
myfunc(ncalls - 1);
else
myfunc2();
}
int
main(int argc, char *argv[])
{
if (argc != 2) {
fprintf(stderr, "%s num-calls\n", argv[0]);
exit(EXIT_FAILURE);
}
myfunc(atoi(argv[1]));
exit(EXIT_SUCCESS);
}
SIGSEGV信号处理与回溯

841

被折叠的 条评论
为什么被折叠?



