-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathhandler.c
More file actions
75 lines (58 loc) · 1.56 KB
/
handler.c
File metadata and controls
75 lines (58 loc) · 1.56 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include "handler.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <signal.h>
#include <execinfo.h>
const char *dump_path = "/home/hasan/faststatus_trace.txt";
FILE *dump_fp = NULL;
int dump_fileno = -1;
int setup_dump_file(void)
{
dump_fp = fopen(dump_path, "wb+");
if (!dump_fp)
return 1;
dump_fileno = fileno(dump_fp);
if (dump_fileno < 0) {
fclose(dump_fp);
return 2;
}
return 0;
}
static void full_write(int fd, const char *buf, size_t len)
{
while (len > 0) {
ssize_t ret = write(fd, buf, len);
if ((ret == -1) && (errno != EINTR))
break;
buf += (size_t) ret;
len -= (size_t) ret;
}
}
void segfault_handler()
{
char *start = "SEGFAULT OCCURRED - BACKTRACE:\n";
full_write(dump_fileno, start, strlen(start));
void *array[10];
size_t n = backtrace(array, 10);
char **backtrace_syms = backtrace_symbols(array, n);
for (size_t i = 1; i < n; i++) {
size_t len = strlen(backtrace_syms[i]);
full_write(dump_fileno, backtrace_syms[i], len);
full_write(dump_fileno, "\n", 1);
}
fclose(dump_fp);
exit(1);
}
/*
static int fake_main(void)
{
signal(SIGSEGV, segfault_handler);
setup_dump_file();
int *number = NULL;
printf ("number: %d\n", *number);
return 0;
}
*/