summaryrefslogtreecommitdiff
path: root/src/pmdbg/pmdbg.c
diff options
context:
space:
mode:
authorIgor Pashev <pashev.igor@gmail.com>2014-10-26 12:33:50 +0400
committerIgor Pashev <pashev.igor@gmail.com>2014-10-26 12:33:50 +0400
commit47e6e7c84f008a53061e661f31ae96629bc694ef (patch)
tree648a07f3b5b9d67ce19b0fd72e8caa1175c98f1a /src/pmdbg/pmdbg.c
downloadpcp-debian.tar.gz
Debian 3.9.10debian/3.9.10debian
Diffstat (limited to 'src/pmdbg/pmdbg.c')
-rw-r--r--src/pmdbg/pmdbg.c161
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;
+}