| #include "caffe2/utils/signal_handler.h" |
| #include "caffe2/core/init.h" |
| #include "caffe2/core/workspace.h" |
| |
| namespace { |
| |
| C10_UNUSED void printBlobSizes() { |
| ::caffe2::Workspace::ForEach( |
| [&](::caffe2::Workspace* ws) { ws->PrintBlobSizes(); }); |
| } |
| |
| } // namespace |
| |
| #if defined(C10_SUPPORTS_FATAL_SIGNAL_HANDLERS) |
| C10_DEFINE_bool( |
| caffe2_print_stacktraces, |
| false, |
| "If set, prints stacktraces when a fatal signal is raised."); |
| |
| namespace caffe2 { |
| |
| C2FatalSignalHandler::C2FatalSignalHandler() {} |
| |
| C2FatalSignalHandler& C2FatalSignalHandler::getInstance() { |
| // Leaky singleton to avoid module destructor race. |
| static C2FatalSignalHandler* handler = new C2FatalSignalHandler(); |
| return *handler; |
| } |
| |
| void C2FatalSignalHandler::fatalSignalHandlerPostProcess() { |
| printBlobSizes(); |
| } |
| |
| void setPrintStackTracesOnFatalSignal(bool print) { |
| C2FatalSignalHandler::getInstance().setPrintStackTracesOnFatalSignal(print); |
| } |
| |
| bool printStackTracesOnFatalSignal() { |
| return C2FatalSignalHandler::getInstance().printStackTracesOnFatalSignal(); |
| } |
| |
| namespace internal { |
| bool Caffe2InitFatalSignalHandler(int*, char***) { |
| if (FLAGS_caffe2_print_stacktraces) { |
| setPrintStackTracesOnFatalSignal(true); |
| } |
| return true; |
| } |
| |
| REGISTER_CAFFE2_INIT_FUNCTION( |
| Caffe2InitFatalSignalHandler, |
| &Caffe2InitFatalSignalHandler, |
| "Inits signal handlers for fatal signals so we can see what if" |
| " caffe2_print_stacktraces is set."); |
| |
| } // namespace internal |
| } // namespace caffe2 |
| #endif // defined(C10_SUPPORTS_FATAL_SIGNAL_HANDLERS) |