fall back to .debug_info scan in fatal signal handler
[folly.git] / folly / experimental / symbolizer / SignalHandler.cpp
index 5319b11a0e39df9dde41da1b921bf8d741c83920..06173c08f2be89d997f0e22fcc40fafe349158e6 100644 (file)
 
 #include <folly/experimental/symbolizer/SignalHandler.h>
 
+#include <pthread.h>
+#include <signal.h>
 #include <sys/types.h>
+#include <unistd.h>
+
+#include <algorithm>
 #include <atomic>
 #include <ctime>
 #include <mutex>
-#include <pthread.h>
-#include <signal.h>
-#include <unistd.h>
 #include <vector>
 
 #include <glog/logging.h>
@@ -33,6 +35,7 @@
 #include <folly/FileUtil.h>
 #include <folly/Portability.h>
 #include <folly/ScopeGuard.h>
+#include <folly/experimental/symbolizer/ElfCache.h>
 #include <folly/experimental/symbolizer/Symbolizer.h>
 #include <folly/portability/SysSyscall.h>
 
@@ -128,7 +131,9 @@ void callPreviousSignalHandler(int signum) {
 // in our signal handler at a time.
 //
 // Leak it so we don't have to worry about destruction order
-auto gSignalSafeElfCache = new SignalSafeElfCache(kFatalSignalHandlerCacheSize);
+constexpr size_t kMinSignalSafeElfCacheSize = 500;
+auto gSignalSafeElfCache = new SignalSafeElfCache(
+    std::max(countLoadedElfFiles(), kMinSignalSafeElfCacheSize));
 
 // Buffered writer (using a fixed-size buffer). We try to write only once
 // to prevent interleaving with messages written from other threads.
@@ -391,7 +396,9 @@ void dumpStackTrace(bool symbolize) {
   if (!getStackTraceSafe(addresses)) {
     print("(error retrieving stack trace)\n");
   } else if (symbolize) {
-    Symbolizer symbolizer(gSignalSafeElfCache);
+    // Do our best to populate location info, process is going to terminate,
+    // so performance isn't critical.
+    Symbolizer symbolizer(gSignalSafeElfCache, Dwarf::LocationInfoMode::FULL);
     symbolizer.symbolize(addresses);
 
     // Skip the top 2 frames: