1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58
|
#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)
|