| // | |
| // Copyright 2018 The Abseil Authors. | |
| // | |
| // Licensed under the Apache License, Version 2.0 (the "License"); | |
| // you may not use this file except in compliance with the License. | |
| // You may obtain a copy of the License at | |
| // | |
| // http://www.apache.org/licenses/LICENSE-2.0 | |
| // | |
| // Unless required by applicable law or agreed to in writing, software | |
| // distributed under the License is distributed on an "AS IS" BASIS, | |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| // See the License for the specific language governing permissions and | |
| // limitations under the License. | |
| // | |
| // This module allows the programmer to install a signal handler that | |
| // dumps useful debugging information (like a stacktrace) on program | |
| // failure. To use this functionality, call | |
| // absl::InstallFailureSignalHandler() very early in your program, | |
| // usually in the first few lines of main(): | |
| // | |
| // int main(int argc, char** argv) { | |
| // absl::InitializeSymbolizer(argv[0]); | |
| // absl::FailureSignalHandlerOptions options; | |
| // absl::InstallFailureSignalHandler(options); | |
| // DoSomethingInteresting(); | |
| // return 0; | |
| // } | |
| #ifndef ABSL_DEBUGGING_FAILURE_SIGNAL_HANDLER_H_ | |
| #define ABSL_DEBUGGING_FAILURE_SIGNAL_HANDLER_H_ | |
| namespace absl { | |
| // Options struct for absl::InstallFailureSignalHandler(). | |
| struct FailureSignalHandlerOptions { | |
| // If true, try to symbolize the stacktrace emitted on failure. | |
| bool symbolize_stacktrace = true; | |
| // If true, try to run signal handlers on an alternate stack (if | |
| // supported on the given platform). This is useful in the case | |
| // where the program crashes due to a stack overflow. By running on | |
| // a alternate stack, the signal handler might be able to run even | |
| // when the normal stack space has been exausted. The downside of | |
| // using an alternate stack is that extra memory for the alternate | |
| // stack needs to be pre-allocated. | |
| bool use_alternate_stack = true; | |
| // If positive, FailureSignalHandler() sets an alarm to be delivered | |
| // to the program after this many seconds, which will immediately | |
| // abort the program. This is useful in the potential case where | |
| // FailureSignalHandler() itself is hung or deadlocked. | |
| int alarm_on_failure_secs = 3; | |
| // If false, after absl::FailureSignalHandler() runs, the signal is | |
| // raised to the default handler for that signal (which normally | |
| // terminates the program). | |
| // | |
| // If true, after absl::FailureSignalHandler() runs, it will call | |
| // the previously registered signal handler for the signal that was | |
| // received (if one was registered). This can be used to chain | |
| // signal handlers. | |
| // | |
| // IMPORTANT: If true, the chained fatal signal handlers must not | |
| // try to recover from the fatal signal. Instead, they should | |
| // terminate the program via some mechanism, like raising the | |
| // default handler for the signal, or by calling _exit(). | |
| // absl::FailureSignalHandler() may put parts of the Abseil | |
| // library into a state that cannot be recovered from. | |
| bool call_previous_handler = false; | |
| // If not null, this function may be called with a std::string argument | |
| // containing failure data. This function is used as a hook to write | |
| // the failure data to a secondary location, for instance, to a log | |
| // file. This function may also be called with a null data | |
| // argument. This is a hint that this is a good time to flush any | |
| // buffered data before the program may be terminated. Consider | |
| // flushing any buffered data in all calls to this function. | |
| // | |
| // Since this function runs in a signal handler, it should be | |
| // async-signal-safe if possible. | |
| // See http://man7.org/linux/man-pages/man7/signal-safety.7.html | |
| void (*writerfn)(const char*) = nullptr; | |
| }; | |
| // Installs a signal handler for the common failure signals SIGSEGV, | |
| // SIGILL, SIGFPE, SIGABRT, SIGTERM, SIGBUG, and SIGTRAP (if they | |
| // exist on the given platform). The signal handler dumps program | |
| // failure data in a unspecified format to stderr. The data dumped by | |
| // the signal handler includes information that may be useful in | |
| // debugging the failure. This may include the program counter, a | |
| // stacktrace, and register information on some systems. Do not rely | |
| // on the exact format of the output; it is subject to change. | |
| void InstallFailureSignalHandler(const FailureSignalHandlerOptions& options); | |
| namespace debugging_internal { | |
| const char* FailureSignalToString(int signo); | |
| } // namespace debugging_internal | |
| } // namespace absl | |
| #endif // ABSL_DEBUGGING_FAILURE_SIGNAL_HANDLER_H_ |