Add option to force memunreachable check.

The new option is named check_unreachable_on_signal. It is meant
to duplicate dumpsys meminfo --unreachable <PID> for non-java
processes. When enabled, a user can send a signal to a process
which will trigger the unreachable check on the next allocation
call.

Added new unit tests.

Test: New unit tests pass.
Test: Enabled for the entire system, then dumped on the netd
Test: process and also system_server.
Change-Id: I73561b408a947a11ce21a211b065d59fcc39097b
diff --git a/libc/malloc_debug/Config.cpp b/libc/malloc_debug/Config.cpp
index 11887e2..5fd511f 100644
--- a/libc/malloc_debug/Config.cpp
+++ b/libc/malloc_debug/Config.cpp
@@ -70,17 +70,21 @@
 
 const std::unordered_map<std::string, Config::OptionInfo> Config::kOptions = {
     {
-        "guard", {FRONT_GUARD | REAR_GUARD | TRACK_ALLOCS, &Config::SetGuard},
+        "guard",
+        {FRONT_GUARD | REAR_GUARD | TRACK_ALLOCS, &Config::SetGuard},
     },
     {
-        "front_guard", {FRONT_GUARD | TRACK_ALLOCS, &Config::SetFrontGuard},
+        "front_guard",
+        {FRONT_GUARD | TRACK_ALLOCS, &Config::SetFrontGuard},
     },
     {
-        "rear_guard", {REAR_GUARD | TRACK_ALLOCS, &Config::SetRearGuard},
+        "rear_guard",
+        {REAR_GUARD | TRACK_ALLOCS, &Config::SetRearGuard},
     },
 
     {
-        "backtrace", {BACKTRACE | TRACK_ALLOCS, &Config::SetBacktrace},
+        "backtrace",
+        {BACKTRACE | TRACK_ALLOCS, &Config::SetBacktrace},
     },
     {
         "backtrace_enable_on_signal",
@@ -88,55 +92,74 @@
     },
 
     {
-        "backtrace_dump_on_exit", {0, &Config::SetBacktraceDumpOnExit},
+        "backtrace_dump_on_exit",
+        {0, &Config::SetBacktraceDumpOnExit},
     },
     {
-        "backtrace_dump_prefix", {0, &Config::SetBacktraceDumpPrefix},
+        "backtrace_dump_prefix",
+        {0, &Config::SetBacktraceDumpPrefix},
     },
     {
-        "backtrace_full", {BACKTRACE_FULL, &Config::VerifyValueEmpty},
+        "backtrace_full",
+        {BACKTRACE_FULL, &Config::VerifyValueEmpty},
     },
 
     {
-        "fill", {FILL_ON_ALLOC | FILL_ON_FREE, &Config::SetFill},
+        "fill",
+        {FILL_ON_ALLOC | FILL_ON_FREE, &Config::SetFill},
     },
     {
-        "fill_on_alloc", {FILL_ON_ALLOC, &Config::SetFillOnAlloc},
+        "fill_on_alloc",
+        {FILL_ON_ALLOC, &Config::SetFillOnAlloc},
     },
     {
-        "fill_on_free", {FILL_ON_FREE, &Config::SetFillOnFree},
+        "fill_on_free",
+        {FILL_ON_FREE, &Config::SetFillOnFree},
     },
 
     {
-        "expand_alloc", {EXPAND_ALLOC, &Config::SetExpandAlloc},
+        "expand_alloc",
+        {EXPAND_ALLOC, &Config::SetExpandAlloc},
     },
 
     {
-        "free_track", {FREE_TRACK | FILL_ON_FREE | TRACK_ALLOCS, &Config::SetFreeTrack},
+        "free_track",
+        {FREE_TRACK | FILL_ON_FREE | TRACK_ALLOCS, &Config::SetFreeTrack},
     },
     {
-        "free_track_backtrace_num_frames", {0, &Config::SetFreeTrackBacktraceNumFrames},
+        "free_track_backtrace_num_frames",
+        {0, &Config::SetFreeTrackBacktraceNumFrames},
     },
 
     {
-        "leak_track", {LEAK_TRACK | TRACK_ALLOCS, &Config::VerifyValueEmpty},
+        "leak_track",
+        {LEAK_TRACK | TRACK_ALLOCS, &Config::VerifyValueEmpty},
     },
 
     {
-        "record_allocs", {RECORD_ALLOCS, &Config::SetRecordAllocs},
+        "record_allocs",
+        {RECORD_ALLOCS, &Config::SetRecordAllocs},
     },
     {
-        "record_allocs_file", {0, &Config::SetRecordAllocsFile},
+        "record_allocs_file",
+        {0, &Config::SetRecordAllocsFile},
     },
 
     {
-        "verify_pointers", {TRACK_ALLOCS, &Config::VerifyValueEmpty},
+        "verify_pointers",
+        {TRACK_ALLOCS, &Config::VerifyValueEmpty},
     },
     {
-        "abort_on_error", {ABORT_ON_ERROR, &Config::VerifyValueEmpty},
+        "abort_on_error",
+        {ABORT_ON_ERROR, &Config::VerifyValueEmpty},
     },
     {
-        "verbose", {VERBOSE, &Config::VerifyValueEmpty},
+        "verbose",
+        {VERBOSE, &Config::VerifyValueEmpty},
+    },
+    {
+        "check_unreachable_on_signal",
+        {CHECK_UNREACHABLE_ON_SIGNAL, &Config::VerifyValueEmpty},
     },
 };
 
@@ -380,6 +403,7 @@
   backtrace_enabled_ = false;
   backtrace_dump_on_exit_ = false;
   backtrace_dump_prefix_ = DEFAULT_BACKTRACE_DUMP_PREFIX;
+  check_unreachable_signal_ = SIGRTMAX - 16;
 
   // Process each option name we can find.
   std::string option;