Skip to content

Commit

Permalink
[scudo] Adding an interface function to print allocator stats
Browse files Browse the repository at this point in the history
Summary:
This adds `__scudo_print_stats` as an interface function to display the Primary
and Secondary allocator statistics for Scudo.

Reviewers: alekseyshl, flowerhack

Reviewed By: alekseyshl

Subscribers: delcypher, llvm-commits, #sanitizers

Differential Revision: https://reviews.llvm.org/D46016

llvm-svn: 330857
  • Loading branch information
Kostya Kortchinsky committed Apr 25, 2018
1 parent a48924c commit d8803d3
Show file tree
Hide file tree
Showing 5 changed files with 43 additions and 0 deletions.
5 changes: 5 additions & 0 deletions compiler-rt/include/sanitizer/scudo_interface.h
Expand Up @@ -27,6 +27,11 @@ extern "C" {
// can be removed by setting LimitMb to 0. This function's parameters should
// be fully trusted to avoid security mishaps.
void __scudo_set_rss_limit(size_t LimitMb, int HardLimit);

// This function outputs various allocator statistics for both the Primary
// and Secondary allocators, including memory usage, number of allocations
// and deallocations.
void __scudo_print_stats(void);
#ifdef __cplusplus
} // extern "C"
#endif
Expand Down
9 changes: 9 additions & 0 deletions compiler-rt/lib/scudo/scudo_allocator.cpp
Expand Up @@ -594,6 +594,11 @@ struct ScudoAllocator {
SoftRssLimitMb = LimitMb;
CheckRssLimit = HardRssLimitMb || SoftRssLimitMb;
}

void printStats() {
initThreadMaybe();
BackendAllocator.printStats();
}
};

static ScudoAllocator Instance(LINKER_INITIALIZED);
Expand Down Expand Up @@ -743,3 +748,7 @@ void __scudo_set_rss_limit(uptr LimitMb, s32 HardLimit) {
return;
Instance.setRssLimit(LimitMb, !!HardLimit);
}

void __scudo_print_stats() {
Instance.printStats();
}
5 changes: 5 additions & 0 deletions compiler-rt/lib/scudo/scudo_allocator_combined.h
Expand Up @@ -61,6 +61,11 @@ class ScudoCombinedAllocator {
Stats.Get(StatType);
}

void printStats() {
Primary.PrintStats();
Secondary.PrintStats();
}

private:
PrimaryAllocator Primary;
SecondaryAllocator Secondary;
Expand Down
3 changes: 3 additions & 0 deletions compiler-rt/lib/scudo/scudo_interface_internal.h
Expand Up @@ -25,6 +25,9 @@ const char* __scudo_default_options();

SANITIZER_INTERFACE_ATTRIBUTE
void __scudo_set_rss_limit(uptr LimitMb, s32 HardLimit);

SANITIZER_INTERFACE_ATTRIBUTE
void __scudo_print_stats();
} // extern "C"

#endif // SCUDO_INTERFACE_INTERNAL_H_
21 changes: 21 additions & 0 deletions compiler-rt/test/scudo/stats.c
@@ -0,0 +1,21 @@
// RUN: %clang_scudo %s -o %t
// RUN: %run %t 2>&1 | FileCheck %s

// Tests that the allocator stats printing function exists and outputs
// "something". Currently that "something" is fairly nebulous, as the 32-bit
// primary doesn't output anything, and for the 64-bit one it's highly dependent
// on the size class map and potential library allocations. So keep it very
// generic for now.

#include <stdlib.h>

#include <sanitizer/scudo_interface.h>

int main(int argc, char **argv)
{
free(malloc(1U));
__scudo_print_stats();
return 0;
}

// CHECK: Stats:

0 comments on commit d8803d3

Please sign in to comment.