Fossil SCM
Add GCC backtraces to the segv handler.
Commit
cc8c33ee8aff995b170421ebf78598a314e49ed7248c080ba58818a05d5631d8
Parent
5542cd43b3fe305…
1 file changed
+17
-1
+17
-1
| --- src/main.c | ||
| +++ src/main.c | ||
| @@ -1418,11 +1418,27 @@ | ||
| 1418 | 1418 | |
| 1419 | 1419 | /* |
| 1420 | 1420 | ** Called whenever a crash is encountered while processing a webpage. |
| 1421 | 1421 | */ |
| 1422 | 1422 | void sigsegv_handler(int x){ |
| 1423 | - fossil_errorlog("Segfault"); | |
| 1423 | +#if HAVE_BACKTRACE | |
| 1424 | + void *array[20]; | |
| 1425 | + size_t size; | |
| 1426 | + char **strings; | |
| 1427 | + size_t i; | |
| 1428 | + Blob out; | |
| 1429 | + size = backtrace(array, sizeof(array)/sizeof(array[0])); | |
| 1430 | + strings = backtrace_symbols(array, size); | |
| 1431 | + blob_init(&out, 0, 0); | |
| 1432 | + blob_appendf(&out, "Segfault"); | |
| 1433 | + for(i=0; i<size; i++){ | |
| 1434 | + blob_appendf(&out, "\n(%d) %s", i, strings[i]); | |
| 1435 | + } | |
| 1436 | + fossil_panic("%s", blob_str(&out)); | |
| 1437 | +#else | |
| 1438 | + fossil_panic("Segfault"); | |
| 1439 | +#endif | |
| 1424 | 1440 | exit(1); |
| 1425 | 1441 | } |
| 1426 | 1442 | |
| 1427 | 1443 | /* |
| 1428 | 1444 | ** Called if a server gets a SIGPIPE. This often happens when a client |
| 1429 | 1445 |
| --- src/main.c | |
| +++ src/main.c | |
| @@ -1418,11 +1418,27 @@ | |
| 1418 | |
| 1419 | /* |
| 1420 | ** Called whenever a crash is encountered while processing a webpage. |
| 1421 | */ |
| 1422 | void sigsegv_handler(int x){ |
| 1423 | fossil_errorlog("Segfault"); |
| 1424 | exit(1); |
| 1425 | } |
| 1426 | |
| 1427 | /* |
| 1428 | ** Called if a server gets a SIGPIPE. This often happens when a client |
| 1429 |
| --- src/main.c | |
| +++ src/main.c | |
| @@ -1418,11 +1418,27 @@ | |
| 1418 | |
| 1419 | /* |
| 1420 | ** Called whenever a crash is encountered while processing a webpage. |
| 1421 | */ |
| 1422 | void sigsegv_handler(int x){ |
| 1423 | #if HAVE_BACKTRACE |
| 1424 | void *array[20]; |
| 1425 | size_t size; |
| 1426 | char **strings; |
| 1427 | size_t i; |
| 1428 | Blob out; |
| 1429 | size = backtrace(array, sizeof(array)/sizeof(array[0])); |
| 1430 | strings = backtrace_symbols(array, size); |
| 1431 | blob_init(&out, 0, 0); |
| 1432 | blob_appendf(&out, "Segfault"); |
| 1433 | for(i=0; i<size; i++){ |
| 1434 | blob_appendf(&out, "\n(%d) %s", i, strings[i]); |
| 1435 | } |
| 1436 | fossil_panic("%s", blob_str(&out)); |
| 1437 | #else |
| 1438 | fossil_panic("Segfault"); |
| 1439 | #endif |
| 1440 | exit(1); |
| 1441 | } |
| 1442 | |
| 1443 | /* |
| 1444 | ** Called if a server gets a SIGPIPE. This often happens when a client |
| 1445 |