110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/** 210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @file daemon/opd_stats.c 310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * Management of daemon statistics 410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * 510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @remark Copyright 2002 OProfile authors 610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @remark Read the file COPYING 710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * 810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @author John Levon 910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * @author Philippe Elie 1010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project */ 1110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 1210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "opd_stats.h" 135a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng#include "opd_extended.h" 1410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "oprofiled.h" 1510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 1610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include "op_get_time.h" 1710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 1810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <dirent.h> 1910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <stdlib.h> 2010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project#include <stdio.h> 2110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 2210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectunsigned long opd_stats[OPD_MAX_STATS]; 2310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 2410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/** 2510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * print_if - print an integer value read from file filename, 2610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * do nothing if the value read == -1 except if force is non-zero 2710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project */ 2810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectstatic void print_if(char const * fmt, char const * path, char const * filename, int force) 2910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 3010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project int value = opd_read_fs_int(path, filename, 0); 3110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (value != -1 || force) 3210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project printf(fmt, value); 3310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 3410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 3510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project/** 3610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project * opd_print_stats - print out latest statistics 3710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project */ 3810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectvoid opd_print_stats(void) 3910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project{ 4010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project DIR * dir; 4110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project struct dirent * dirent; 4210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 4310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project printf("\n%s\n", op_get_time()); 445a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng printf("\n-- OProfile Statistics --\n"); 4510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project printf("Nr. sample dumps: %lu\n", opd_stats[OPD_DUMP_COUNT]); 4610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project printf("Nr. non-backtrace samples: %lu\n", opd_stats[OPD_SAMPLES]); 4710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project printf("Nr. kernel samples: %lu\n", opd_stats[OPD_KERNEL]); 4810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project printf("Nr. lost samples (no kernel/user): %lu\n", opd_stats[OPD_NO_CTX]); 4910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project printf("Nr. lost kernel samples: %lu\n", opd_stats[OPD_LOST_KERNEL]); 5010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project printf("Nr. incomplete code structs: %lu\n", opd_stats[OPD_DANGLING_CODE]); 5110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project printf("Nr. samples lost due to sample file open failure: %lu\n", 5210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project opd_stats[OPD_LOST_SAMPLEFILE]); 5310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project printf("Nr. samples lost due to no permanent mapping: %lu\n", 5410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project opd_stats[OPD_LOST_NO_MAPPING]); 5510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project print_if("Nr. event lost due to buffer overflow: %u\n", 5610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project "/dev/oprofile/stats", "event_lost_overflow", 1); 5710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project print_if("Nr. samples lost due to no mapping: %u\n", 5810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project "/dev/oprofile/stats", "sample_lost_no_mapping", 1); 5910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project print_if("Nr. backtraces skipped due to no file mapping: %u\n", 6010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project "/dev/oprofile/stats", "bt_lost_no_mapping", 0); 6110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project print_if("Nr. samples lost due to no mm: %u\n", 6210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project "/dev/oprofile/stats", "sample_lost_no_mm", 1); 6310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 645a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng opd_ext_print_stats(); 655a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng 6610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (!(dir = opendir("/dev/oprofile/stats/"))) 6710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project goto out; 6810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project while ((dirent = readdir(dir))) { 6910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project int cpu_nr; 7010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project char path[256]; 7110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project if (sscanf(dirent->d_name, "cpu%d", &cpu_nr) != 1) 7210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project continue; 7310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project snprintf(path, 256, "/dev/oprofile/stats/%s", dirent->d_name); 7410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project 755a4eb4eb367eccd4b976d1feae96cea96d2c50f2Ben Cheng printf("\n---- Statistics for cpu : %d\n", cpu_nr); 7610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project print_if("Nr. samples lost cpu buffer overflow: %u\n", 7710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project path, "sample_lost_overflow", 1); 7810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project print_if("Nr. samples lost task exit: %u\n", 7910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project path, "sample_lost_task_exit", 0); 8010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project print_if("Nr. samples received: %u\n", 8110e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project path, "sample_received", 1); 8210e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project print_if("Nr. backtrace aborted: %u\n", 8310e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project path, "backtrace_aborted", 0); 8410e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project print_if("Nr. samples lost invalid pc: %u\n", 8510e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project path, "sample_invalid_eip", 0); 8610e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project } 8710e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project closedir(dir); 8810e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Projectout: 8910e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project fflush(stdout); 9010e23eebca4175a8dfe3a788b2bebacb1fcfce54The Android Open Source Project} 91