aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf/util/debug.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf/util/debug.c')
-rw-r--r--tools/perf/util/debug.c111
1 files changed, 74 insertions, 37 deletions
diff --git a/tools/perf/util/debug.c b/tools/perf/util/debug.c
index 86d9c7302598..8c4212abd19b 100644
--- a/tools/perf/util/debug.c
+++ b/tools/perf/util/debug.c
@@ -5,6 +5,7 @@
5#include <string.h> 5#include <string.h>
6#include <stdarg.h> 6#include <stdarg.h>
7#include <stdio.h> 7#include <stdio.h>
8#include <api/debug.h>
8 9
9#include "cache.h" 10#include "cache.h"
10#include "color.h" 11#include "color.h"
@@ -22,7 +23,7 @@ int debug_ordered_events;
22static int redirect_to_stderr; 23static int redirect_to_stderr;
23int debug_data_convert; 24int debug_data_convert;
24 25
25static int _eprintf(int level, int var, const char *fmt, va_list args) 26int veprintf(int level, int var, const char *fmt, va_list args)
26{ 27{
27 int ret = 0; 28 int ret = 0;
28 29
@@ -36,24 +37,19 @@ static int _eprintf(int level, int var, const char *fmt, va_list args)
36 return ret; 37 return ret;
37} 38}
38 39
39int veprintf(int level, int var, const char *fmt, va_list args)
40{
41 return _eprintf(level, var, fmt, args);
42}
43
44int eprintf(int level, int var, const char *fmt, ...) 40int eprintf(int level, int var, const char *fmt, ...)
45{ 41{
46 va_list args; 42 va_list args;
47 int ret; 43 int ret;
48 44
49 va_start(args, fmt); 45 va_start(args, fmt);
50 ret = _eprintf(level, var, fmt, args); 46 ret = veprintf(level, var, fmt, args);
51 va_end(args); 47 va_end(args);
52 48
53 return ret; 49 return ret;
54} 50}
55 51
56static int __eprintf_time(u64 t, const char *fmt, va_list args) 52static int veprintf_time(u64 t, const char *fmt, va_list args)
57{ 53{
58 int ret = 0; 54 int ret = 0;
59 u64 secs, usecs, nsecs = t; 55 u64 secs, usecs, nsecs = t;
@@ -75,7 +71,7 @@ int eprintf_time(int level, int var, u64 t, const char *fmt, ...)
75 71
76 if (var >= level) { 72 if (var >= level) {
77 va_start(args, fmt); 73 va_start(args, fmt);
78 ret = __eprintf_time(t, fmt, args); 74 ret = veprintf_time(t, fmt, args);
79 va_end(args); 75 va_end(args);
80 } 76 }
81 77
@@ -91,7 +87,7 @@ void pr_stat(const char *fmt, ...)
91 va_list args; 87 va_list args;
92 88
93 va_start(args, fmt); 89 va_start(args, fmt);
94 _eprintf(1, verbose, fmt, args); 90 veprintf(1, verbose, fmt, args);
95 va_end(args); 91 va_end(args);
96 eprintf(1, verbose, "\n"); 92 eprintf(1, verbose, "\n");
97} 93}
@@ -110,40 +106,61 @@ int dump_printf(const char *fmt, ...)
110 return ret; 106 return ret;
111} 107}
112 108
109static void trace_event_printer(enum binary_printer_ops op,
110 unsigned int val, void *extra)
111{
112 const char *color = PERF_COLOR_BLUE;
113 union perf_event *event = (union perf_event *)extra;
114 unsigned char ch = (unsigned char)val;
115
116 switch (op) {
117 case BINARY_PRINT_DATA_BEGIN:
118 printf(".");
119 color_fprintf(stdout, color, "\n. ... raw event: size %d bytes\n",
120 event->header.size);
121 break;
122 case BINARY_PRINT_LINE_BEGIN:
123 printf(".");
124 break;
125 case BINARY_PRINT_ADDR:
126 color_fprintf(stdout, color, " %04x: ", val);
127 break;
128 case BINARY_PRINT_NUM_DATA:
129 color_fprintf(stdout, color, " %02x", val);
130 break;
131 case BINARY_PRINT_NUM_PAD:
132 color_fprintf(stdout, color, " ");
133 break;
134 case BINARY_PRINT_SEP:
135 color_fprintf(stdout, color, " ");
136 break;
137 case BINARY_PRINT_CHAR_DATA:
138 color_fprintf(stdout, color, "%c",
139 isprint(ch) ? ch : '.');
140 break;
141 case BINARY_PRINT_CHAR_PAD:
142 color_fprintf(stdout, color, " ");
143 break;
144 case BINARY_PRINT_LINE_END:
145 color_fprintf(stdout, color, "\n");
146 break;
147 case BINARY_PRINT_DATA_END:
148 printf("\n");
149 break;
150 default:
151 break;
152 }
153}
154
113void trace_event(union perf_event *event) 155void trace_event(union perf_event *event)
114{ 156{
115 unsigned char *raw_event = (void *)event; 157 unsigned char *raw_event = (void *)event;
116 const char *color = PERF_COLOR_BLUE;
117 int i, j;
118 158
119 if (!dump_trace) 159 if (!dump_trace)
120 return; 160 return;
121 161
122 printf("."); 162 print_binary(raw_event, event->header.size, 16,
123 color_fprintf(stdout, color, "\n. ... raw event: size %d bytes\n", 163 trace_event_printer, event);
124 event->header.size);
125
126 for (i = 0; i < event->header.size; i++) {
127 if ((i & 15) == 0) {
128 printf(".");
129 color_fprintf(stdout, color, " %04x: ", i);
130 }
131
132 color_fprintf(stdout, color, " %02x", raw_event[i]);
133
134 if (((i & 15) == 15) || i == event->header.size-1) {
135 color_fprintf(stdout, color, " ");
136 for (j = 0; j < 15-(i & 15); j++)
137 color_fprintf(stdout, color, " ");
138 for (j = i & ~15; j <= i; j++) {
139 color_fprintf(stdout, color, "%c",
140 isprint(raw_event[j]) ?
141 raw_event[j] : '.');
142 }
143 color_fprintf(stdout, color, "\n");
144 }
145 }
146 printf(".\n");
147} 164}
148 165
149static struct debug_variable { 166static struct debug_variable {
@@ -192,3 +209,23 @@ int perf_debug_option(const char *str)
192 free(s); 209 free(s);
193 return 0; 210 return 0;
194} 211}
212
213#define DEBUG_WRAPPER(__n, __l) \
214static int pr_ ## __n ## _wrapper(const char *fmt, ...) \
215{ \
216 va_list args; \
217 int ret; \
218 \
219 va_start(args, fmt); \
220 ret = veprintf(__l, verbose, fmt, args); \
221 va_end(args); \
222 return ret; \
223}
224
225DEBUG_WRAPPER(warning, 0);
226DEBUG_WRAPPER(debug, 1);
227
228void perf_debug_setup(void)
229{
230 libapi_set_print(pr_warning_wrapper, pr_warning_wrapper, pr_debug_wrapper);
231}