1 /** 2 * @file daemon/opd_stats.c 3 * Management of daemon statistics 4 * 5 * @remark Copyright 2002 OProfile authors 6 * @remark Read the file COPYING 7 * 8 * @author John Levon 9 * @author Philippe Elie 10 */ 11 12 #include "opd_stats.h" 13 #include "opd_extended.h" 14 #include "oprofiled.h" 15 16 #include "op_get_time.h" 17 18 #include <dirent.h> 19 #include <stdlib.h> 20 #include <stdio.h> 21 22 unsigned long opd_stats[OPD_MAX_STATS]; 23 24 /** 25 * print_if - print an integer value read from file filename, 26 * do nothing if the value read == -1 except if force is non-zero 27 */ 28 static void print_if(char const * fmt, char const * path, char const * filename, int force) 29 { 30 int value = opd_read_fs_int(path, filename, 0); 31 if (value != -1 || force) 32 printf(fmt, value); 33 } 34 35 /** 36 * opd_print_stats - print out latest statistics 37 */ 38 void opd_print_stats(void) 39 { 40 DIR * dir; 41 struct dirent * dirent; 42 43 printf("\n%s\n", op_get_time()); 44 printf("\n-- OProfile Statistics --\n"); 45 printf("Nr. sample dumps: %lu\n", opd_stats[OPD_DUMP_COUNT]); 46 printf("Nr. non-backtrace samples: %lu\n", opd_stats[OPD_SAMPLES]); 47 printf("Nr. kernel samples: %lu\n", opd_stats[OPD_KERNEL]); 48 printf("Nr. lost samples (no kernel/user): %lu\n", opd_stats[OPD_NO_CTX]); 49 printf("Nr. lost kernel samples: %lu\n", opd_stats[OPD_LOST_KERNEL]); 50 printf("Nr. incomplete code structs: %lu\n", opd_stats[OPD_DANGLING_CODE]); 51 printf("Nr. samples lost due to sample file open failure: %lu\n", 52 opd_stats[OPD_LOST_SAMPLEFILE]); 53 printf("Nr. samples lost due to no permanent mapping: %lu\n", 54 opd_stats[OPD_LOST_NO_MAPPING]); 55 print_if("Nr. event lost due to buffer overflow: %u\n", 56 "/dev/oprofile/stats", "event_lost_overflow", 1); 57 print_if("Nr. samples lost due to no mapping: %u\n", 58 "/dev/oprofile/stats", "sample_lost_no_mapping", 1); 59 print_if("Nr. backtraces skipped due to no file mapping: %u\n", 60 "/dev/oprofile/stats", "bt_lost_no_mapping", 0); 61 print_if("Nr. samples lost due to no mm: %u\n", 62 "/dev/oprofile/stats", "sample_lost_no_mm", 1); 63 64 opd_ext_print_stats(); 65 66 if (!(dir = opendir("/dev/oprofile/stats/"))) 67 goto out; 68 while ((dirent = readdir(dir))) { 69 int cpu_nr; 70 char path[256]; 71 if (sscanf(dirent->d_name, "cpu%d", &cpu_nr) != 1) 72 continue; 73 snprintf(path, 256, "/dev/oprofile/stats/%s", dirent->d_name); 74 75 printf("\n---- Statistics for cpu : %d\n", cpu_nr); 76 print_if("Nr. samples lost cpu buffer overflow: %u\n", 77 path, "sample_lost_overflow", 1); 78 print_if("Nr. samples lost task exit: %u\n", 79 path, "sample_lost_task_exit", 0); 80 print_if("Nr. samples received: %u\n", 81 path, "sample_received", 1); 82 print_if("Nr. backtrace aborted: %u\n", 83 path, "backtrace_aborted", 0); 84 print_if("Nr. samples lost invalid pc: %u\n", 85 path, "sample_invalid_eip", 0); 86 } 87 closedir(dir); 88 out: 89 fflush(stdout); 90 } 91