22bool IsDumpStackInSignalHandler =
true;
24bool StartThread(
void* (*threadEntry)(
void*)) {
28 memset(&attr, 0,
sizeof(attr));
29 result = pthread_attr_init(&attr);
30 if (
result != 0)
return false;
31 constexpr size_t kDefaultStackSize = 4 * 1024 * 1024;
33 result = pthread_attr_getstacksize(&attr, &stack_size);
35 if (stack_size < kDefaultStackSize) stack_size = kDefaultStackSize;
37 result = pthread_attr_setstacksize(&attr, stack_size);
38 if (
result != 0)
return pthread_attr_destroy(&attr),
false;
40 std::mutex lock_guard;
42 result = pthread_create(&thread_, &attr, threadEntry,
nullptr);
44 perror(
"pthread_create");
45 return pthread_attr_destroy(&attr),
false;
48 result = pthread_attr_destroy(&attr);
52void StackDumpSignalHandler(
int signal, siginfo_t* info,
void* void_context) {
53 fprintf(stderr,
"Received signal %d\n", signal);
54 if (signal == SIGABRT) {
58 if (IsDumpStackInSignalHandler) __display_backtrace(STDERR_FILENO);
62void* StackDumpingSignalThread(
void* data) {
63 struct sigaction sigpipe_action;
64 memset(&sigpipe_action, 0,
sizeof(sigpipe_action));
65 sigpipe_action.sa_handler = SIG_IGN;
66 sigemptyset(&sigpipe_action.sa_mask);
67 bool success = (sigaction(SIGPIPE, &sigpipe_action,
nullptr) == 0);
69 struct sigaction action;
70 memset(&action, 0,
sizeof(action));
71 action.sa_flags = SA_RESETHAND | SA_SIGINFO | SA_ONSTACK;
72 action.sa_sigaction = &StackDumpSignalHandler;
73 sigemptyset(&action.sa_mask);
75 success &= (sigaction(SIGILL, &action,
nullptr) == 0);
76 success &= (sigaction(SIGABRT, &action,
nullptr) == 0);
77 success &= (sigaction(SIGFPE, &action,
nullptr) == 0);
78 success &= (sigaction(SIGBUS, &action,
nullptr) == 0);
79 success &= (sigaction(SIGSEGV, &action,
nullptr) == 0);
80 success &= (sigaction(SIGSYS, &action,
nullptr) == 0);
81 success &= (sigaction(SIGINT, &action,
nullptr) == 0);
82 success &= (sigaction(SIGTERM, &action,
nullptr) == 0);
95 IsDumpStackInSignalHandler =
true;
96 bool success = StartThread(StackDumpingSignalThread);
101 CHECK_EQ(0, pthread_sigmask(SIG_BLOCK, &set, NULL));
106 IsDumpStackInSignalHandler =
false;
108 __set_backtrace_on_abort(
false);
void OutputToStream(std::ostream *os) const
ZoneVector< RpoNumber > & result
V8_BASE_EXPORT bool EnableInProcessStackDumping()
V8_BASE_EXPORT void DisableSignalStackDump()
#define CHECK_EQ(lhs, rhs)
#define DCHECK_EQ(v1, v2)