[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