diff options
author | Igor Pashev <pashev.igor@gmail.com> | 2014-10-26 12:33:50 +0400 |
---|---|---|
committer | Igor Pashev <pashev.igor@gmail.com> | 2014-10-26 12:33:50 +0400 |
commit | 47e6e7c84f008a53061e661f31ae96629bc694ef (patch) | |
tree | 648a07f3b5b9d67ce19b0fd72e8caa1175c98f1a /src/pmdbg/pmdbg.c | |
download | pcp-debian.tar.gz |
Debian 3.9.10debian/3.9.10debian
Diffstat (limited to 'src/pmdbg/pmdbg.c')
-rw-r--r-- | src/pmdbg/pmdbg.c | 161 |
1 files changed, 161 insertions, 0 deletions
diff --git a/src/pmdbg/pmdbg.c b/src/pmdbg/pmdbg.c new file mode 100644 index 0000000..4879eaa --- /dev/null +++ b/src/pmdbg/pmdbg.c @@ -0,0 +1,161 @@ +/* + * Copyright (c) 2013 Red Hat. + * Copyright (c) 1995,2002-2003 Silicon Graphics, Inc. All Rights Reserved. + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * for more details. + */ + +/* + * pmdbg - help for PCP debug flags + */ + +#include <ctype.h> +#include "pmapi.h" +#include "impl.h" + +static struct { + int flag; + char *name; + char *text; +} foo[] = { + { DBG_TRACE_PDU, "PDU", + "Trace PDU traffic at the Xmit and Recv level" }, + { DBG_TRACE_FETCH, "FETCH", + "Dump results from pmFetch" }, + { DBG_TRACE_PROFILE, "PROFILE", + "Trace changes and xmits for instance profile" }, + { DBG_TRACE_VALUE, "VALUE", + "Diags for metric value extraction and conversion" }, + { DBG_TRACE_CONTEXT, "CONTEXT", + "Trace changes to contexts" }, + { DBG_TRACE_INDOM, "INDOM", + "Low-level instance profile xfers" }, + { DBG_TRACE_PDUBUF, "PDUBUF", + "Trace pin/unpin ops for PDU buffers" }, + { DBG_TRACE_LOG, "LOG", + "Diags for archive log manipulations" }, + { DBG_TRACE_LOGMETA, "LOGMETA", + "Diags for meta-data operations on archive logs" }, + { DBG_TRACE_OPTFETCH, "OPTFETCH", + "Trace optFetch magic" }, + { DBG_TRACE_AF, "AF", + "Trace asynchronous event scheduling" }, + { DBG_TRACE_APPL0, "APPL0", + "Application-specific flag 0" }, + { DBG_TRACE_APPL1, "APPL1", + "Application-specific flag 1" }, + { DBG_TRACE_APPL2, "APPL2", + "Application-specific flag 2" }, + { DBG_TRACE_PMNS, "PMNS", + "Diags for PMNS manipulations" }, + { DBG_TRACE_LIBPMDA, "LIBPMDA", + "Trace PMDA callbacks in libpcp_pmda" }, + { DBG_TRACE_TIMECONTROL, "TIMECONTROL", + "Trace Time Control API" }, + { DBG_TRACE_PMC, "PMC", + "Trace metrics class operations" }, + { DBG_TRACE_DERIVE, "DERIVE", + "Derived metrics operations" }, + { DBG_TRACE_LOCK, "LOCK", + "Trace locks (if multi-threading enabled)" }, + { DBG_TRACE_INTERP, "INTERP", + "Diags for value interpolation in archives" }, + { DBG_TRACE_CONFIG, "CONFIG", + "Trace config initialization from pmGetConfig" }, + { DBG_TRACE_LOOP, "LOOP", + "Diags for pmLoop* services" }, + { DBG_TRACE_FAULT, "FAULT", + "Trace fault injection (if enabled)" }, + { DBG_TRACE_AUTH, "AUTH", + "Authentication services (if enabled)" }, + { DBG_TRACE_DISCOVERY, "DISCOVERY", + "Service discovery (if enabled)" }, + { DBG_TRACE_DESPERATE, "DESPERATE", + "Desperate/verbose level" }, +}; + +static int nfoo = sizeof(foo) / sizeof(foo[0]); + +static char *fmt = "DBG_TRACE_%-11.11s %7d %s\n"; + +static pmLongOptions longopts[] = { + PMAPI_OPTIONS_HEADER("General options"), + { "list", 0, 'l', 0, "displays mnemonic and decimal values of PCP debug bitfields" }, + PMOPT_HELP, + PMAPI_OPTIONS_END +}; + +static pmOptions opts = { + .short_options = "l?", + .long_options = longopts, + .short_usage = "[options] [code ..]", +}; + +int +main(int argc, char **argv) +{ + int i; + int c; + + while ((c = pmgetopt_r(argc, argv, &opts)) != EOF) { + switch (c) { + + case 'l': /* list all flags */ + printf("Performance Co-Pilot Debug Flags\n"); + printf("#define Value Meaning\n"); + for (i = 0; i < nfoo; i++) + printf(fmt, foo[i].name, foo[i].flag, foo[i].text); + exit(0); + + case '?': + default: + opts.errors++; + break; + } + } + + if (opts.errors || opts.optind >= argc) { + pmUsageMessage(&opts); + exit(1); + } + + /* non-flag args are argv[opts.optind] ... argv[argc-1] */ + while (opts.optind < argc) { + char *p = argv[opts.optind]; + for (p = argv[opts.optind]; *p && isdigit((int)*p); p++) + ; + if (*p == '\0') + sscanf(argv[opts.optind], "%d", &c); + else { + char *q; + p = argv[opts.optind]; + if (*p == '0' && (p[1] == 'x' || p[1] == 'X')) + p = &p[2]; + for (q = p; isxdigit((int)*q); q++) + ; + if (*q != '\0' || sscanf(p, "%x", &c) != 1) { + printf("Cannot decode \"%s\" - neither decimal nor hexadecimal\n", argv[opts.optind]); + goto next; + } + } + printf("Performance Co-Pilot -- pmDebug value = %d (0x%x)\n", c, c); + printf("#define Value Meaning\n"); + for (i = 0; i < nfoo; i++) { + if (c & foo[i].flag) + printf(fmt, foo[i].name, foo[i].flag, foo[i].text); + } + +next: + opts.optind++; + } + + return 0; +} |