piiswrong closed pull request #8851: Use backtrace from dmlc-core (dmlc::stack_trace()) URL: https://github.com/apache/incubator-mxnet/pull/8851
This is a PR merged from a forked repository. As GitHub hides the original diff on merge, it is displayed below for the sake of provenance: As this is a foreign pull request (from a fork), the diff is supplied below (as it won't show otherwise due to GitHub magic): diff --git a/CMakeLists.txt b/CMakeLists.txt index 480479333b..8211624a7d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -47,6 +47,7 @@ mxnet_option(USE_MXNET_LIB_NAMING "Use MXNet library naming conventions." ON) mxnet_option(USE_GPROF "Compile with gprof (profiling) flag" OFF) mxnet_option(USE_VTUNE "Enable use of Intel Amplifier XE (VTune)" OFF) # one could set VTUNE_ROOT for search path mxnet_option(INSTALL_EXAMPLES "Install the example source files." OFF) +mxnet_option(USE_SIGNAL_HANDLER "Print stack traces on segfaults." OFF) @@ -574,6 +575,10 @@ if (INSTALL_EXAMPLES) install(DIRECTORY example DESTINATION ${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME}) endif() +if (USE_SIGNAL_HANDLER) + add_definitions(-DMXNET_USE_SIGNAL_HANDLER=1) +endif() + # AUTO_INSTALL_DIR -> Optional: specify post-build install direcory if(AUTO_INSTALL_DIR) # ---[ Install Includes diff --git a/make/config.mk b/make/config.mk index 6db22df0c8..9c6393a45d 100644 --- a/make/config.mk +++ b/make/config.mk @@ -33,7 +33,7 @@ DEBUG = 0 # whether compile with profiler USE_PROFILER = -# whether to turn on signal handler (e.g. segfault logger) +# whether to turn on segfault signal handler to log the stack trace USE_SIGNAL_HANDLER = # the additional link flags you want to add diff --git a/src/initialize.cc b/src/initialize.cc index 56d6fe1fff..2d077f4908 100644 --- a/src/initialize.cc +++ b/src/initialize.cc @@ -25,37 +25,23 @@ #include <signal.h> #include <dmlc/logging.h> #include <mxnet/engine.h> - #include "engine/profiler.h" namespace mxnet { - -void segfault_logger(int sig) { - const int MAX_STACK_SIZE = 10; - void *stack[MAX_STACK_SIZE]; - +#if MXNET_USE_SIGNAL_HANDLER && DMLC_LOG_STACK_TRACE +static void SegfaultLogger(int sig) { fprintf(stderr, "\nSegmentation fault: %d\n\n", sig); - -#if DMLC_LOG_STACK_TRACE - int nframes = backtrace(stack, MAX_STACK_SIZE); - fprintf(stderr, "Stack trace returned %d entries:\n", nframes); - char **msgs = backtrace_symbols(stack, nframes); - if (msgs != nullptr) { - for (int i = 0; i < nframes; ++i) { - fprintf(stderr, "[bt] (%d) %s\n", i, msgs[i]); - } - } -#endif // DMLC_LOG_STACK_TRACE - + fprintf(stderr, "%s", dmlc::StackTrace().c_str()); exit(-1); } +#endif class LibraryInitializer { public: LibraryInitializer() { dmlc::InitLogging("mxnet"); -#if MXNET_USE_SIGNAL_HANDLER - signal(SIGSEGV, segfault_logger); +#if MXNET_USE_SIGNAL_HANDLER && DMLC_LOG_STACK_TRACE + signal(SIGSEGV, SegfaultLogger); #endif #if MXNET_USE_PROFILER // ensure profiler's constructor are called before atexit. ---------------------------------------------------------------- This is an automated message from the Apache Git Service. To respond to the message, please log on GitHub and use the URL above to go to the specific comment. For queries about this service, please contact Infrastructure at: us...@infra.apache.org With regards, Apache Git Services