[compiler-rt] r341735 - [hwasan] Export memory stats through /proc/$PID/maps.

Peter Collingbourne via llvm-commits llvm-commits at lists.llvm.org
Fri Sep 7 17:23:54 PDT 2018


That's certainly a creative way of exposing process information!

Now I'm wondering whether the same technique can be used for anything else.

Peter

On Fri, Sep 7, 2018 at 5:12 PM Evgeniy Stepanov via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

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


-- 
-- 
Peter
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20180907/8d9d1d02/attachment.html>


More information about the llvm-commits mailing list