linux: fix --monitor-self

The metrics recording signal handler doesn't need to be re-installed
on Linux because the handler installed by StartHandler() restores the
previously installed handler by default. Reinstalling the metrics
handler results in a crash dump loop in which each signal handler
restores the other.

Change-Id: Ieef40c74bfc69f6e0caef9809f33cfcaa10f0d03
Reviewed-on: https://chromium-review.googlesource.com/c/crashpad/crashpad/+/1832153
Reviewed-by: Mark Mentovai <mark@chromium.org>
Commit-Queue: Joshua Peraza <jperaza@chromium.org>
This commit is contained in:
Joshua Peraza 2019-09-30 13:56:12 -07:00 committed by Commit Bot
parent eff0680c13
commit 676a190308
2 changed files with 6 additions and 24 deletions

View File

@ -352,7 +352,6 @@ bool CrashpadClient::StartHandler(
const std::vector<std::string>& arguments, const std::vector<std::string>& arguments,
bool restartable, bool restartable,
bool asynchronous_start) { bool asynchronous_start) {
DCHECK(!restartable);
DCHECK(!asynchronous_start); DCHECK(!asynchronous_start);
ScopedFileHandle client_sock, handler_sock; ScopedFileHandle client_sock, handler_sock;

View File

@ -263,8 +263,6 @@ class CallMetricsRecordNormalExit {
#if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_ANDROID) #if defined(OS_MACOSX) || defined(OS_LINUX) || defined(OS_ANDROID)
Signals::OldActions g_old_crash_signal_handlers;
void HandleCrashSignal(int sig, siginfo_t* siginfo, void* context) { void HandleCrashSignal(int sig, siginfo_t* siginfo, void* context) {
MetricsRecordExit(Metrics::LifetimeMilestone::kCrashed); MetricsRecordExit(Metrics::LifetimeMilestone::kCrashed);
@ -299,9 +297,7 @@ void HandleCrashSignal(int sig, siginfo_t* siginfo, void* context) {
} }
Metrics::HandlerCrashed(metrics_code); Metrics::HandlerCrashed(metrics_code);
struct sigaction* old_action = Signals::RestoreHandlerAndReraiseSignalOnReturn(siginfo, nullptr);
g_old_crash_signal_handlers.ActionForSignal(sig);
Signals::RestoreHandlerAndReraiseSignalOnReturn(siginfo, old_action);
} }
void HandleTerminateSignal(int sig, siginfo_t* siginfo, void* context) { void HandleTerminateSignal(int sig, siginfo_t* siginfo, void* context) {
@ -309,13 +305,13 @@ void HandleTerminateSignal(int sig, siginfo_t* siginfo, void* context) {
Signals::RestoreHandlerAndReraiseSignalOnReturn(siginfo, nullptr); Signals::RestoreHandlerAndReraiseSignalOnReturn(siginfo, nullptr);
} }
#if defined(OS_MACOSX)
void ReinstallCrashHandler() { void ReinstallCrashHandler() {
// This is used to re-enable the metrics-recording crash handler after // This is used to re-enable the metrics-recording crash handler after
// MonitorSelf() sets up a Crashpad exception handler. On macOS, the // MonitorSelf() sets up a Crashpad exception handler. On macOS, the
// metrics-recording handler uses signals and the Crashpad handler uses Mach // metrics-recording handler uses signals and the Crashpad handler uses Mach
// exceptions, so theres nothing to re-enable. // exceptions, so theres nothing to re-enable.
// On Linux, the signal handler installed by StartHandler() restores the
// previously installed signal handler by default.
} }
void InstallCrashHandler() { void InstallCrashHandler() {
@ -325,6 +321,8 @@ void InstallCrashHandler() {
Signals::InstallTerminateHandlers(HandleTerminateSignal, 0, nullptr); Signals::InstallTerminateHandlers(HandleTerminateSignal, 0, nullptr);
} }
#if defined(OS_MACOSX)
struct ResetSIGTERMTraits { struct ResetSIGTERMTraits {
static struct sigaction* InvalidValue() { static struct sigaction* InvalidValue() {
return nullptr; return nullptr;
@ -349,21 +347,6 @@ void HandleSIGTERM(int sig, siginfo_t* siginfo, void* context) {
g_exception_handler_server->Stop(); g_exception_handler_server->Stop();
} }
#else
void ReinstallCrashHandler() {
// This is used to re-enable the metrics-recording crash handler after
// MonitorSelf() sets up a Crashpad signal handler.
Signals::InstallCrashHandlers(
HandleCrashSignal, 0, &g_old_crash_signal_handlers);
}
void InstallCrashHandler() {
ReinstallCrashHandler();
Signals::InstallTerminateHandlers(HandleTerminateSignal, 0, nullptr);
}
#endif // OS_MACOSX #endif // OS_MACOSX
#elif defined(OS_WIN) #elif defined(OS_WIN)
@ -473,7 +456,7 @@ void MonitorSelf(const Options& options) {
// instance of crashpad_handler to be writing metrics at a time, and it should // instance of crashpad_handler to be writing metrics at a time, and it should
// be the primary instance. // be the primary instance.
CrashpadClient crashpad_client; CrashpadClient crashpad_client;
#if defined(OS_LINUX) || defined(OS_ANDROID) #if defined(OS_ANDROID)
if (!crashpad_client.StartHandlerAtCrash(executable_path, if (!crashpad_client.StartHandlerAtCrash(executable_path,
options.database, options.database,
base::FilePath(), base::FilePath(),