[scudo] Adding an interface function to print allocator stats

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
This commit is contained in:
Kostya Kortchinsky 2018-04-25 18:52:29 +00:00
parent a48924c706
commit d8803d3d92
5 changed files with 43 additions and 0 deletions

View File

@ -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

View File

@ -594,6 +594,11 @@ struct ScudoAllocator {
SoftRssLimitMb = LimitMb;
CheckRssLimit = HardRssLimitMb || SoftRssLimitMb;
}
void printStats() {
initThreadMaybe();
BackendAllocator.printStats();
}
};
static ScudoAllocator Instance(LINKER_INITIALIZED);
@ -743,3 +748,7 @@ void __scudo_set_rss_limit(uptr LimitMb, s32 HardLimit) {
return;
Instance.setRssLimit(LimitMb, !!HardLimit);
}
void __scudo_print_stats() {
Instance.printStats();
}

View File

@ -61,6 +61,11 @@ class ScudoCombinedAllocator {
Stats.Get(StatType);
}
void printStats() {
Primary.PrintStats();
Secondary.PrintStats();
}
private:
PrimaryAllocator Primary;
SecondaryAllocator Secondary;

View File

@ -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_

View File

@ -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: