| 77 | } |
| 78 | |
| 79 | inline void setup_crash_handler() { |
| 80 | // Check if crash handler should be disabled (for debugger attachment) |
| 81 | const char* disable_handler = getenv("FASTLED_DISABLE_CRASH_HANDLER"); |
| 82 | if (disable_handler && (strcmp(disable_handler, "1") == 0 || strcmp(disable_handler, "true") == 0)) { |
| 83 | printf("Crash handler disabled (FASTLED_DISABLE_CRASH_HANDLER set)\n"); |
| 84 | printf("This allows external debuggers to attach for deadlock detection.\n"); |
| 85 | return; |
| 86 | } |
| 87 | |
| 88 | // Set up POSIX signal handlers |
| 89 | signal(SIGABRT, crash_handler); |
| 90 | signal(SIGFPE, crash_handler); |
| 91 | signal(SIGILL, crash_handler); |
| 92 | signal(SIGINT, crash_handler); |
| 93 | signal(SIGSEGV, crash_handler); |
| 94 | signal(SIGTERM, crash_handler); |
| 95 | |
| 96 | // libunwind is ready to use |
| 97 | } |
| 98 | |
| 99 | inline void print_stacktrace() { |
| 100 | print_stacktrace_libunwind(); |