Loading libbacktrace/BacktraceCurrent.cpp +17 −1 Original line number Diff line number Diff line Loading @@ -93,6 +93,10 @@ bool BacktraceCurrent::DiscardFrame(const backtrace_frame_data_t& frame) { static pthread_mutex_t g_sigaction_mutex = PTHREAD_MUTEX_INITIALIZER; static void SignalLogOnly(int, siginfo_t*, void*) { BACK_LOGE("pid %d, tid %d: Received a spurious signal %d\n", getpid(), gettid(), THREAD_SIGNAL); } static void SignalHandler(int, siginfo_t*, void* sigcontext) { ThreadEntry* entry = ThreadEntry::Get(getpid(), gettid(), false); if (!entry) { Loading Loading @@ -151,9 +155,21 @@ bool BacktraceCurrent::UnwindThread(size_t num_ignore_frames) { // that we are waiting for the first Wake() call made by the thread. bool wait_completed = entry->Wait(1); if (!wait_completed && oldact.sa_sigaction == nullptr) { // If the wait failed, it could be that the signal could not be delivered // within the timeout. Add a signal handler that's simply going to log // something so that we don't crash if the signal eventually gets // delivered. Only do this if there isn't already an action set up. memset(&act, 0, sizeof(act)); act.sa_sigaction = SignalLogOnly; act.sa_flags = SA_RESTART | SA_SIGINFO | SA_ONSTACK; sigemptyset(&act.sa_mask); sigaction(THREAD_SIGNAL, &act, nullptr); } else { sigaction(THREAD_SIGNAL, &oldact, nullptr); } // After the thread has received the signal, allow other unwinders to // continue. sigaction(THREAD_SIGNAL, &oldact, nullptr); pthread_mutex_unlock(&g_sigaction_mutex); bool unwind_done = false; Loading Loading
libbacktrace/BacktraceCurrent.cpp +17 −1 Original line number Diff line number Diff line Loading @@ -93,6 +93,10 @@ bool BacktraceCurrent::DiscardFrame(const backtrace_frame_data_t& frame) { static pthread_mutex_t g_sigaction_mutex = PTHREAD_MUTEX_INITIALIZER; static void SignalLogOnly(int, siginfo_t*, void*) { BACK_LOGE("pid %d, tid %d: Received a spurious signal %d\n", getpid(), gettid(), THREAD_SIGNAL); } static void SignalHandler(int, siginfo_t*, void* sigcontext) { ThreadEntry* entry = ThreadEntry::Get(getpid(), gettid(), false); if (!entry) { Loading Loading @@ -151,9 +155,21 @@ bool BacktraceCurrent::UnwindThread(size_t num_ignore_frames) { // that we are waiting for the first Wake() call made by the thread. bool wait_completed = entry->Wait(1); if (!wait_completed && oldact.sa_sigaction == nullptr) { // If the wait failed, it could be that the signal could not be delivered // within the timeout. Add a signal handler that's simply going to log // something so that we don't crash if the signal eventually gets // delivered. Only do this if there isn't already an action set up. memset(&act, 0, sizeof(act)); act.sa_sigaction = SignalLogOnly; act.sa_flags = SA_RESTART | SA_SIGINFO | SA_ONSTACK; sigemptyset(&act.sa_mask); sigaction(THREAD_SIGNAL, &act, nullptr); } else { sigaction(THREAD_SIGNAL, &oldact, nullptr); } // After the thread has received the signal, allow other unwinders to // continue. sigaction(THREAD_SIGNAL, &oldact, nullptr); pthread_mutex_unlock(&g_sigaction_mutex); bool unwind_done = false; Loading