<div dir="ltr">That's certainly a creative way of exposing process information!<div><br></div><div>Now I'm wondering whether the same technique can be used for anything else.</div><div><br></div><div>Peter</div></div><br><div class="gmail_quote"><div dir="ltr">On Fri, Sep 7, 2018 at 5:12 PM Evgeniy Stepanov via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: eugenis<br>
Date: Fri Sep  7 17:11:12 2018<br>
New Revision: 341735<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=341735&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=341735&view=rev</a><br>
Log:<br>
[hwasan] Export memory stats through /proc/$PID/maps.<br>
<br>
Adds a line to /proc/$PID/maps with more or less up-to-date memory<br>
stats of the process.<br>
<br>
Added:<br>
    compiler-rt/trunk/test/hwasan/TestCases/print-memory-usage-android.c<br>
Modified:<br>
    compiler-rt/trunk/lib/hwasan/hwasan.cc<br>
    compiler-rt/trunk/lib/hwasan/hwasan.h<br>
    compiler-rt/trunk/lib/hwasan/hwasan_allocator.h<br>
    compiler-rt/trunk/lib/hwasan/hwasan_flags.inc<br>
<br>
Modified: compiler-rt/trunk/lib/hwasan/hwasan.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/hwasan/hwasan.cc?rev=341735&r1=341734&r2=341735&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/hwasan/hwasan.cc?rev=341735&r1=341734&r2=341735&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/hwasan/hwasan.cc (original)<br>
+++ compiler-rt/trunk/lib/hwasan/hwasan.cc Fri Sep  7 17:11:12 2018<br>
@@ -171,22 +171,53 @@ static void HWAsanCheckFailed(const char<br>
   Die();<br>
 }<br>
<br>
-static void HwasanPrintMemoryUsage() {<br>
+static constexpr uptr kMemoryUsageBufferSize = 4096;<br>
+<br>
+static void HwasanFormatMemoryUsage(InternalScopedString &s) {<br>
   auto thread_stats = Thread::GetThreadStats();<br>
   auto *sds = StackDepotGetStats();<br>
   AllocatorStatCounters asc;<br>
   GetAllocatorStats(asc);<br>
-  Printf(<br>
+  s.append(<br>
       "HWASAN pid: %d rss: %zd threads: %zd stacks: %zd"<br>
       " thr_aux: %zd stack_depot: %zd uniq_stacks: %zd"<br>
-      " heap: %zd\n",<br>
+      " heap: %zd",<br>
       internal_getpid(), GetRSS(), thread_stats.n_live_threads,<br>
       thread_stats.total_stack_size,<br>
       thread_stats.n_live_threads * Thread::MemoryUsedPerThread(),<br>
-      sds->allocated, sds->n_uniq_ids,<br>
-      asc[AllocatorStatMapped]);<br>
+      sds->allocated, sds->n_uniq_ids, asc[AllocatorStatMapped]);<br>
+}<br>
+<br>
+#if SANITIZER_ANDROID<br>
+static char *memory_usage_buffer = nullptr;<br>
+<br>
+#define PR_SET_VMA 0x53564d41<br>
+#define PR_SET_VMA_ANON_NAME 0<br>
+<br>
+static void InitMemoryUsage() {<br>
+  memory_usage_buffer =<br>
+      (char *)MmapOrDie(kMemoryUsageBufferSize, "memory usage string");<br>
+  CHECK(memory_usage_buffer);<br>
+  memory_usage_buffer[0] = '\0';<br>
+  CHECK(internal_prctl(PR_SET_VMA, PR_SET_VMA_ANON_NAME,<br>
+                       (uptr)memory_usage_buffer, kMemoryUsageBufferSize,<br>
+                       (uptr)memory_usage_buffer) == 0);<br>
 }<br>
<br>
+void UpdateMemoryUsage() {<br>
+  if (!flags()->export_memory_stats)<br>
+    return;<br>
+  if (!memory_usage_buffer)<br>
+    InitMemoryUsage();<br>
+  InternalScopedString s(kMemoryUsageBufferSize);<br>
+  HwasanFormatMemoryUsage(s);<br>
+  internal_strncpy(memory_usage_buffer, s.data(), kMemoryUsageBufferSize - 1);<br>
+  memory_usage_buffer[kMemoryUsageBufferSize - 1] = '\0';<br>
+}<br>
+#else<br>
+void UpdateMemoryUsage() {}<br>
+#endif<br>
+<br>
 } // namespace __hwasan<br>
<br>
 // Interface.<br>
@@ -455,7 +486,11 @@ void __hwasan_handle_longjmp(const void<br>
   TagMemory(sp, dst - sp, 0);<br>
 }<br>
<br>
-void __hwasan_print_memory_usage() { HwasanPrintMemoryUsage(); }<br>
+void __hwasan_print_memory_usage() {<br>
+  InternalScopedString s(kMemoryUsageBufferSize);<br>
+  HwasanFormatMemoryUsage(s);<br>
+  Printf("%s\n", s.data());<br>
+}<br>
<br>
 static const u8 kFallbackTag = 0xBB;<br>
<br>
<br>
Modified: compiler-rt/trunk/lib/hwasan/hwasan.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/hwasan/hwasan.h?rev=341735&r1=341734&r2=341735&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/hwasan/hwasan.h?rev=341735&r1=341734&r2=341735&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/hwasan/hwasan.h (original)<br>
+++ compiler-rt/trunk/lib/hwasan/hwasan.h Fri Sep  7 17:11:12 2018<br>
@@ -145,6 +145,8 @@ void HwasanTSDInit();<br>
<br>
 void HwasanOnDeadlySignal(int signo, void *info, void *context);<br>
<br>
+void UpdateMemoryUsage();<br>
+<br>
 }  // namespace __hwasan<br>
<br>
 #define HWASAN_MALLOC_HOOK(ptr, size)       \<br>
<br>
Modified: compiler-rt/trunk/lib/hwasan/hwasan_allocator.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/hwasan/hwasan_allocator.h?rev=341735&r1=341734&r2=341735&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/hwasan/hwasan_allocator.h?rev=341735&r1=341734&r2=341735&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/hwasan/hwasan_allocator.h (original)<br>
+++ compiler-rt/trunk/lib/hwasan/hwasan_allocator.h Fri Sep  7 17:11:12 2018<br>
@@ -34,7 +34,7 @@ struct Metadata {<br>
 };<br>
<br>
 struct HwasanMapUnmapCallback {<br>
-  void OnMap(uptr p, uptr size) const {}<br>
+  void OnMap(uptr p, uptr size) const { UpdateMemoryUsage(); }<br>
   void OnUnmap(uptr p, uptr size) const {<br>
     // We are about to unmap a chunk of user memory.<br>
     // It can return as user-requested mmap() or another thread stack.<br>
<br>
Modified: compiler-rt/trunk/lib/hwasan/hwasan_flags.inc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/hwasan/hwasan_flags.inc?rev=341735&r1=341734&r2=341735&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/hwasan/hwasan_flags.inc?rev=341735&r1=341734&r2=341735&view=diff</a><br>
==============================================================================<br>
--- compiler-rt/trunk/lib/hwasan/hwasan_flags.inc (original)<br>
+++ compiler-rt/trunk/lib/hwasan/hwasan_flags.inc Fri Sep  7 17:11:12 2018<br>
@@ -49,3 +49,5 @@ HWASAN_FLAG(int, heap_history_size, 1023<br>
           "The number of heap (de)allocations remembered per thread. "<br>
           "Affects the quality of heap-related reports, but not the ability "<br>
           "to find bugs.")<br>
+HWASAN_FLAG(bool, export_memory_stats, true,<br>
+            "Export up-to-date memory stats through /proc")<br>
<br>
Added: compiler-rt/trunk/test/hwasan/TestCases/print-memory-usage-android.c<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/hwasan/TestCases/print-memory-usage-android.c?rev=341735&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/hwasan/TestCases/print-memory-usage-android.c?rev=341735&view=auto</a><br>
==============================================================================<br>
--- compiler-rt/trunk/test/hwasan/TestCases/print-memory-usage-android.c (added)<br>
+++ compiler-rt/trunk/test/hwasan/TestCases/print-memory-usage-android.c Fri Sep  7 17:11:12 2018<br>
@@ -0,0 +1,13 @@<br>
+// Tests __hwasan_print_memory_usage through /proc/$PID/maps.<br>
+// RUN: %clang_hwasan %s -o %t && %env_hwasan_opts=export_memory_stats=1 %run %t 2>&1 | FileCheck %s<br>
+// REQUIRES: android<br>
+<br>
+#include <stdlib.h><br>
+#include <stdio.h><br>
+<br>
+int main() {<br>
+  char cmd[1024];<br>
+  snprintf(cmd, sizeof(cmd), "cat /proc/%d/maps", getpid());<br>
+  system(cmd);<br>
+  // CHECK: HWASAN pid: [[PID:[0-9]*]] rss: {{.*}} threads: 1 stacks: [[STACKS:[0-9]*]] thr_aux: {{.*}} stack_depot: {{.*}} uniq_stacks: [[UNIQ_STACKS:[0-9]*]] heap: [[HEAP:[0-9]*]]<br>
+}<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="m_-763778318475310753gmail_signature" data-smartmail="gmail_signature"><div dir="ltr">-- <div>Peter</div></div></div>