| /** |
| * @file daemon/opd_stats.c |
| * Management of daemon statistics |
| * |
| * @remark Copyright 2002 OProfile authors |
| * @remark Read the file COPYING |
| * |
| * @author John Levon |
| * @author Philippe Elie |
| */ |
| |
| #include "opd_stats.h" |
| #include "opd_extended.h" |
| #include "oprofiled.h" |
| |
| #include "op_get_time.h" |
| |
| #include <dirent.h> |
| #include <stdlib.h> |
| #include <stdio.h> |
| |
| unsigned long opd_stats[OPD_MAX_STATS]; |
| |
| /** |
| * print_if - print an integer value read from file filename, |
| * do nothing if the value read == -1 except if force is non-zero |
| */ |
| static void print_if(char const * fmt, char const * path, char const * filename, int force) |
| { |
| int value = opd_read_fs_int(path, filename, 0); |
| if (value != -1 || force) |
| printf(fmt, value); |
| } |
| |
| /** |
| * opd_print_stats - print out latest statistics |
| */ |
| void opd_print_stats(void) |
| { |
| DIR * dir; |
| struct dirent * dirent; |
| |
| printf("\n%s\n", op_get_time()); |
| printf("\n-- OProfile Statistics --\n"); |
| printf("Nr. sample dumps: %lu\n", opd_stats[OPD_DUMP_COUNT]); |
| printf("Nr. non-backtrace samples: %lu\n", opd_stats[OPD_SAMPLES]); |
| printf("Nr. kernel samples: %lu\n", opd_stats[OPD_KERNEL]); |
| printf("Nr. lost samples (no kernel/user): %lu\n", opd_stats[OPD_NO_CTX]); |
| printf("Nr. lost kernel samples: %lu\n", opd_stats[OPD_LOST_KERNEL]); |
| printf("Nr. incomplete code structs: %lu\n", opd_stats[OPD_DANGLING_CODE]); |
| printf("Nr. samples lost due to sample file open failure: %lu\n", |
| opd_stats[OPD_LOST_SAMPLEFILE]); |
| printf("Nr. samples lost due to no permanent mapping: %lu\n", |
| opd_stats[OPD_LOST_NO_MAPPING]); |
| print_if("Nr. event lost due to buffer overflow: %u\n", |
| "/dev/oprofile/stats", "event_lost_overflow", 1); |
| print_if("Nr. samples lost due to no mapping: %u\n", |
| "/dev/oprofile/stats", "sample_lost_no_mapping", 1); |
| print_if("Nr. backtraces skipped due to no file mapping: %u\n", |
| "/dev/oprofile/stats", "bt_lost_no_mapping", 0); |
| print_if("Nr. samples lost due to no mm: %u\n", |
| "/dev/oprofile/stats", "sample_lost_no_mm", 1); |
| |
| opd_ext_print_stats(); |
| |
| if (!(dir = opendir("/dev/oprofile/stats/"))) |
| goto out; |
| while ((dirent = readdir(dir))) { |
| int cpu_nr; |
| char path[256]; |
| if (sscanf(dirent->d_name, "cpu%d", &cpu_nr) != 1) |
| continue; |
| snprintf(path, 256, "/dev/oprofile/stats/%s", dirent->d_name); |
| |
| printf("\n---- Statistics for cpu : %d\n", cpu_nr); |
| print_if("Nr. samples lost cpu buffer overflow: %u\n", |
| path, "sample_lost_overflow", 1); |
| print_if("Nr. samples lost task exit: %u\n", |
| path, "sample_lost_task_exit", 0); |
| print_if("Nr. samples received: %u\n", |
| path, "sample_received", 1); |
| print_if("Nr. backtrace aborted: %u\n", |
| path, "backtrace_aborted", 0); |
| print_if("Nr. samples lost invalid pc: %u\n", |
| path, "sample_invalid_eip", 0); |
| } |
| closedir(dir); |
| out: |
| fflush(stdout); |
| } |