| 260 | } |
| 261 | |
| 262 | static void print_backtrace_frames(void **pcs, CrashFrame *frameInfo, int nframes) { |
| 263 | if (nframes <= 0) return; |
| 264 | CrashFrame collectedFrames[DAS_CRASH_HANDLER_MAX_STACK_FRAMES]; |
| 265 | int frameCount = 0; |
| 266 | fprintf(stderr, "Stack trace:\n"); |
| 267 | char **symbols = backtrace_symbols(pcs, nframes); |
| 268 | if (symbols) { |
| 269 | for (int i = 0; i < nframes; i++) { |
| 270 | char *d = demangle(symbols[i]); |
| 271 | fprintf(stderr, " [%2d] %s\n", i, d ? d : symbols[i]); |
| 272 | if (g_crash_handler_frame_filter && d |
| 273 | && g_crash_handler_frame_filter(d) |
| 274 | && frameCount < DAS_CRASH_HANDLER_MAX_STACK_FRAMES) { |
| 275 | collectedFrames[frameCount++] = frameInfo[i]; |
| 276 | } |
| 277 | free(d); |
| 278 | } |
| 279 | free(symbols); |
| 280 | } else { |
| 281 | backtrace_symbols_fd(pcs, nframes, STDERR_FILENO); |
| 282 | } |
| 283 | fflush(stderr); |
| 284 | if (g_crash_handler_extra_info && frameCount > 0) { |
| 285 | g_crash_handler_extra_info(collectedFrames, frameCount); |
| 286 | } |
| 287 | } |
| 288 | |
| 289 | static void crash_signal_handler(int sig, siginfo_t *info, void *ucontext_ptr) { |
| 290 | fprintf(stderr, "\nCRASH: %s (signal %d)", signal_to_string(sig), sig); |
no test coverage detected