diff options
Diffstat (limited to 'tools/perf/util/debug.c')
-rw-r--r-- | tools/perf/util/debug.c | 111 |
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; | |||
22 | static int redirect_to_stderr; | 23 | static int redirect_to_stderr; |
23 | int debug_data_convert; | 24 | int debug_data_convert; |
24 | 25 | ||
25 | static int _eprintf(int level, int var, const char *fmt, va_list args) | 26 | int 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 | ||
39 | int veprintf(int level, int var, const char *fmt, va_list args) | ||
40 | { | ||
41 | return _eprintf(level, var, fmt, args); | ||
42 | } | ||
43 | |||
44 | int eprintf(int level, int var, const char *fmt, ...) | 40 | int 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 | ||
56 | static int __eprintf_time(u64 t, const char *fmt, va_list args) | 52 | static 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 | ||
109 | static 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 | |||
113 | void trace_event(union perf_event *event) | 155 | void 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 | ||
149 | static struct debug_variable { | 166 | static 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) \ | ||
214 | static 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 | |||
225 | DEBUG_WRAPPER(warning, 0); | ||
226 | DEBUG_WRAPPER(debug, 1); | ||
227 | |||
228 | void perf_debug_setup(void) | ||
229 | { | ||
230 | libapi_set_print(pr_warning_wrapper, pr_warning_wrapper, pr_debug_wrapper); | ||
231 | } | ||