debug.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. /* For general debugging purposes */
  2. #include "../perf.h"
  3. #include <string.h>
  4. #include <stdarg.h>
  5. #include <stdio.h>
  6. #include "cache.h"
  7. #include "color.h"
  8. #include "event.h"
  9. #include "debug.h"
  10. #include "util.h"
  11. #include "target.h"
  12. #define NSECS_PER_SEC 1000000000ULL
  13. #define NSECS_PER_USEC 1000ULL
  14. int verbose;
  15. bool dump_trace = false, quiet = false;
  16. int debug_ordered_events;
  17. static int _eprintf(int level, int var, const char *fmt, va_list args)
  18. {
  19. int ret = 0;
  20. if (var >= level) {
  21. if (use_browser >= 1)
  22. ui_helpline__vshow(fmt, args);
  23. else
  24. ret = vfprintf(stderr, fmt, args);
  25. }
  26. return ret;
  27. }
  28. int eprintf(int level, int var, const char *fmt, ...)
  29. {
  30. va_list args;
  31. int ret;
  32. va_start(args, fmt);
  33. ret = _eprintf(level, var, fmt, args);
  34. va_end(args);
  35. return ret;
  36. }
  37. static int __eprintf_time(u64 t, const char *fmt, va_list args)
  38. {
  39. int ret = 0;
  40. u64 secs, usecs, nsecs = t;
  41. secs = nsecs / NSECS_PER_SEC;
  42. nsecs -= secs * NSECS_PER_SEC;
  43. usecs = nsecs / NSECS_PER_USEC;
  44. ret = fprintf(stderr, "[%13" PRIu64 ".%06" PRIu64 "] ",
  45. secs, usecs);
  46. ret += vfprintf(stderr, fmt, args);
  47. return ret;
  48. }
  49. int eprintf_time(int level, int var, u64 t, const char *fmt, ...)
  50. {
  51. int ret = 0;
  52. va_list args;
  53. if (var >= level) {
  54. va_start(args, fmt);
  55. ret = __eprintf_time(t, fmt, args);
  56. va_end(args);
  57. }
  58. return ret;
  59. }
  60. /*
  61. * Overloading libtraceevent standard info print
  62. * function, display with -v in perf.
  63. */
  64. void pr_stat(const char *fmt, ...)
  65. {
  66. va_list args;
  67. va_start(args, fmt);
  68. _eprintf(1, verbose, fmt, args);
  69. va_end(args);
  70. eprintf(1, verbose, "\n");
  71. }
  72. int dump_printf(const char *fmt, ...)
  73. {
  74. va_list args;
  75. int ret = 0;
  76. if (dump_trace) {
  77. va_start(args, fmt);
  78. ret = vprintf(fmt, args);
  79. va_end(args);
  80. }
  81. return ret;
  82. }
  83. void trace_event(union perf_event *event)
  84. {
  85. unsigned char *raw_event = (void *)event;
  86. const char *color = PERF_COLOR_BLUE;
  87. int i, j;
  88. if (!dump_trace)
  89. return;
  90. printf(".");
  91. color_fprintf(stdout, color, "\n. ... raw event: size %d bytes\n",
  92. event->header.size);
  93. for (i = 0; i < event->header.size; i++) {
  94. if ((i & 15) == 0) {
  95. printf(".");
  96. color_fprintf(stdout, color, " %04x: ", i);
  97. }
  98. color_fprintf(stdout, color, " %02x", raw_event[i]);
  99. if (((i & 15) == 15) || i == event->header.size-1) {
  100. color_fprintf(stdout, color, " ");
  101. for (j = 0; j < 15-(i & 15); j++)
  102. color_fprintf(stdout, color, " ");
  103. for (j = i & ~15; j <= i; j++) {
  104. color_fprintf(stdout, color, "%c",
  105. isprint(raw_event[j]) ?
  106. raw_event[j] : '.');
  107. }
  108. color_fprintf(stdout, color, "\n");
  109. }
  110. }
  111. printf(".\n");
  112. }
  113. static struct debug_variable {
  114. const char *name;
  115. int *ptr;
  116. } debug_variables[] = {
  117. { .name = "verbose", .ptr = &verbose },
  118. { .name = "ordered-events", .ptr = &debug_ordered_events},
  119. { .name = NULL, }
  120. };
  121. int perf_debug_option(const char *str)
  122. {
  123. struct debug_variable *var = &debug_variables[0];
  124. char *vstr, *s = strdup(str);
  125. int v = 1;
  126. vstr = strchr(s, '=');
  127. if (vstr)
  128. *vstr++ = 0;
  129. while (var->name) {
  130. if (!strcmp(s, var->name))
  131. break;
  132. var++;
  133. }
  134. if (!var->name) {
  135. pr_err("Unknown debug variable name '%s'\n", s);
  136. free(s);
  137. return -1;
  138. }
  139. if (vstr) {
  140. v = atoi(vstr);
  141. /*
  142. * Allow only values in range (0, 10),
  143. * otherwise set 0.
  144. */
  145. v = (v < 0) || (v > 10) ? 0 : v;
  146. }
  147. *var->ptr = v;
  148. free(s);
  149. return 0;
  150. }