1e5f5895bda30f374b0b51412fd4d837fa59aed66Alexey Samsonov//===-- asan_stats.cc -----------------------------------------------------===// 21e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// 31e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// The LLVM Compiler Infrastructure 41e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// 51e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// This file is distributed under the University of Illinois Open Source 61e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// License. See LICENSE.TXT for details. 71e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// 81e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany//===----------------------------------------------------------------------===// 91e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// 101e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// This file is a part of AddressSanitizer, an address sanity checker. 111e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// 121e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// Code related to statistics collected by AddressSanitizer. 131e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany//===----------------------------------------------------------------------===// 141e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#include "asan_interceptors.h" 151e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#include "asan_internal.h" 161e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#include "asan_stats.h" 171e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany#include "asan_thread_registry.h" 189e3bd38388a7c182db57f6e3fc0943e6d12f012eKostya Serebryany#include "sanitizer_common/sanitizer_stackdepot.h" 191e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 201e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanynamespace __asan { 211e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 221e172b4bdec57329bf904f063a29f99cddf2d85fKostya SerebryanyAsanStats::AsanStats() { 233f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryany CHECK(REAL(memset) != 0); 2409672caefb5694f1981a1712fdefa44840a95e67Alexey Samsonov REAL(memset)(this, 0, sizeof(AsanStats)); 251e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany} 261e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 271e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanystatic void PrintMallocStatsArray(const char *prefix, 283f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryany uptr (&array)[kNumberOfSizeClasses]) { 29283c296b64bc55deec9698260b3427a9b050a925Kostya Serebryany Printf("%s", prefix); 303f4c3875c42078e22c7e5356c5746fd18756d958Kostya Serebryany for (uptr i = 0; i < kNumberOfSizeClasses; i++) { 311e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany if (!array[i]) continue; 32283c296b64bc55deec9698260b3427a9b050a925Kostya Serebryany Printf("%zu:%zu; ", i, array[i]); 331e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany } 34283c296b64bc55deec9698260b3427a9b050a925Kostya Serebryany Printf("\n"); 351e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany} 361e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 371e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyvoid AsanStats::Print() { 38283c296b64bc55deec9698260b3427a9b050a925Kostya Serebryany Printf("Stats: %zuM malloced (%zuM for red zones) by %zu calls\n", 39e954101f6602ac181a2c3accfbbad0ae51b0bf7cAlexey Samsonov malloced>>20, malloced_redzones>>20, mallocs); 40283c296b64bc55deec9698260b3427a9b050a925Kostya Serebryany Printf("Stats: %zuM realloced by %zu calls\n", realloced>>20, reallocs); 41283c296b64bc55deec9698260b3427a9b050a925Kostya Serebryany Printf("Stats: %zuM freed by %zu calls\n", freed>>20, frees); 42283c296b64bc55deec9698260b3427a9b050a925Kostya Serebryany Printf("Stats: %zuM really freed by %zu calls\n", 43e954101f6602ac181a2c3accfbbad0ae51b0bf7cAlexey Samsonov really_freed>>20, real_frees); 44e11c5c5a8cd6e448ddf3c69f783eb655cf4aab01Kostya Serebryany Printf("Stats: %zuM (%zuM-%zuM) mmaped; %zu maps, %zu unmaps\n", 45e11c5c5a8cd6e448ddf3c69f783eb655cf4aab01Kostya Serebryany (mmaped-munmaped)>>20, mmaped>>20, munmaped>>20, 46e11c5c5a8cd6e448ddf3c69f783eb655cf4aab01Kostya Serebryany mmaps, munmaps); 471e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 481e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany PrintMallocStatsArray(" mmaps by size class: ", mmaped_by_size); 491e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany PrintMallocStatsArray(" mallocs by size class: ", malloced_by_size); 501e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany PrintMallocStatsArray(" frees by size class: ", freed_by_size); 511e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany PrintMallocStatsArray(" rfrees by size class: ", really_freed_by_size); 52283c296b64bc55deec9698260b3427a9b050a925Kostya Serebryany Printf("Stats: malloc large: %zu small slow: %zu\n", 53e954101f6602ac181a2c3accfbbad0ae51b0bf7cAlexey Samsonov malloc_large, malloc_small_slow); 541e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany} 551e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 56f4f51f2cc6fa936f0c65577f82e6b62989d546eeDmitry Vyukovstatic BlockingMutex print_lock(LINKER_INITIALIZED); 5775f74616d227a158539a5cc23ea8282142623159Kostya Serebryany 581e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanystatic void PrintAccumulatedStats() { 5984f5bacaf1021b9fb6fc2cf48abe5d4d416422efAlexey Samsonov AsanStats stats; 6084f5bacaf1021b9fb6fc2cf48abe5d4d416422efAlexey Samsonov asanThreadRegistry().GetAccumulatedStats(&stats); 611e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany // Use lock to keep reports from mixing up. 62f4f51f2cc6fa936f0c65577f82e6b62989d546eeDmitry Vyukov BlockingMutexLock lock(&print_lock); 631e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany stats.Print(); 649e3bd38388a7c182db57f6e3fc0943e6d12f012eKostya Serebryany StackDepotStats *stack_depot_stats = StackDepotGetStats(); 659e3bd38388a7c182db57f6e3fc0943e6d12f012eKostya Serebryany Printf("Stats: StackDepot: %zd ids; %zdM mapped\n", 669e3bd38388a7c182db57f6e3fc0943e6d12f012eKostya Serebryany stack_depot_stats->n_uniq_ids, stack_depot_stats->mapped >> 20); 674b48f4563ca25d8915155acc5837e195cf0e5c57Kostya Serebryany PrintInternalAllocatorStats(); 681e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany} 691e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 701e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany} // namespace __asan 711e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 721e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany// ---------------------- Interface ---------------- {{{1 731e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyusing namespace __asan; // NOLINT 741e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 759aead37421a6e4bf43265e5195c6ac31fc519982Kostya Serebryanyuptr __asan_get_current_allocated_bytes() { 761e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany return asanThreadRegistry().GetCurrentAllocatedBytes(); 771e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany} 781e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 799aead37421a6e4bf43265e5195c6ac31fc519982Kostya Serebryanyuptr __asan_get_heap_size() { 801e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany return asanThreadRegistry().GetHeapSize(); 811e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany} 821e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 839aead37421a6e4bf43265e5195c6ac31fc519982Kostya Serebryanyuptr __asan_get_free_bytes() { 841e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany return asanThreadRegistry().GetFreeBytes(); 851e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany} 861e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 879aead37421a6e4bf43265e5195c6ac31fc519982Kostya Serebryanyuptr __asan_get_unmapped_bytes() { 881e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany return 0; 891e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany} 901e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany 911e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryanyvoid __asan_print_accumulated_stats() { 921e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany PrintAccumulatedStats(); 931e172b4bdec57329bf904f063a29f99cddf2d85fKostya Serebryany} 94