提交 cd84c2ac 编写于 作者: F Frederic Weisbecker

perf tools: Factorize high level dso helpers

Factorize multiple definitions of high level dso helpers into the
symbol source file.

The side effect is a general export of the verbose and eprintf
debugging helpers into a new file dedicated to debugging purposes.
Signed-off-by: NFrederic Weisbecker <fweisbec@gmail.com>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Brice Goglin <Brice.Goglin@inria.fr>
上级 9f866697
...@@ -339,6 +339,7 @@ LIB_OBJS += util/pager.o ...@@ -339,6 +339,7 @@ LIB_OBJS += util/pager.o
LIB_OBJS += util/header.o LIB_OBJS += util/header.o
LIB_OBJS += util/callchain.o LIB_OBJS += util/callchain.o
LIB_OBJS += util/values.o LIB_OBJS += util/values.o
LIB_OBJS += util/debug.o
BUILTIN_OBJS += builtin-annotate.o BUILTIN_OBJS += builtin-annotate.o
BUILTIN_OBJS += builtin-help.o BUILTIN_OBJS += builtin-help.o
......
...@@ -26,7 +26,6 @@ ...@@ -26,7 +26,6 @@
#define SHOW_HV 4 #define SHOW_HV 4
static char const *input_name = "perf.data"; static char const *input_name = "perf.data";
static char *vmlinux = "vmlinux";
static char default_sort_order[] = "comm,symbol"; static char default_sort_order[] = "comm,symbol";
static char *sort_order = default_sort_order; static char *sort_order = default_sort_order;
...@@ -37,9 +36,6 @@ static int show_mask = SHOW_KERNEL | SHOW_USER | SHOW_HV; ...@@ -37,9 +36,6 @@ static int show_mask = SHOW_KERNEL | SHOW_USER | SHOW_HV;
static int dump_trace = 0; static int dump_trace = 0;
#define dprintf(x...) do { if (dump_trace) printf(x); } while (0) #define dprintf(x...) do { if (dump_trace) printf(x); } while (0)
static int verbose;
static int modules;
static int full_paths; static int full_paths;
...@@ -89,98 +85,6 @@ struct sym_ext { ...@@ -89,98 +85,6 @@ struct sym_ext {
char *path; char *path;
}; };
static LIST_HEAD(dsos);
static struct dso *kernel_dso;
static struct dso *vdso;
static void dsos__add(struct dso *dso)
{
list_add_tail(&dso->node, &dsos);
}
static struct dso *dsos__find(const char *name)
{
struct dso *pos;
list_for_each_entry(pos, &dsos, node)
if (strcmp(pos->name, name) == 0)
return pos;
return NULL;
}
static struct dso *dsos__findnew(const char *name)
{
struct dso *dso = dsos__find(name);
int nr;
if (dso)
return dso;
dso = dso__new(name, 0);
if (!dso)
goto out_delete_dso;
nr = dso__load(dso, NULL, verbose);
if (nr < 0) {
if (verbose)
fprintf(stderr, "Failed to open: %s\n", name);
goto out_delete_dso;
}
if (!nr && verbose) {
fprintf(stderr,
"No symbols found in: %s, maybe install a debug package?\n",
name);
}
dsos__add(dso);
return dso;
out_delete_dso:
dso__delete(dso);
return NULL;
}
static void dsos__fprintf(FILE *fp)
{
struct dso *pos;
list_for_each_entry(pos, &dsos, node)
dso__fprintf(pos, fp);
}
static struct symbol *vdso__find_symbol(struct dso *dso, u64 ip)
{
return dso__find_symbol(dso, ip);
}
static int load_kernel(void)
{
int err;
kernel_dso = dso__new("[kernel]", 0);
if (!kernel_dso)
return -1;
err = dso__load_kernel(kernel_dso, vmlinux, NULL, verbose, modules);
if (err <= 0) {
dso__delete(kernel_dso);
kernel_dso = NULL;
} else
dsos__add(kernel_dso);
vdso = dso__new("[vdso]", 0);
if (!vdso)
return -1;
vdso->find_symbol = vdso__find_symbol;
dsos__add(vdso);
return err;
}
struct map { struct map {
struct list_head node; struct list_head node;
u64 start; u64 start;
......
...@@ -40,7 +40,6 @@ static int inherit = 1; ...@@ -40,7 +40,6 @@ static int inherit = 1;
static int force = 0; static int force = 0;
static int append_file = 0; static int append_file = 0;
static int call_graph = 0; static int call_graph = 0;
static int verbose = 0;
static int inherit_stat = 0; static int inherit_stat = 0;
static int no_samples = 0; static int no_samples = 0;
static int sample_address = 0; static int sample_address = 0;
......
...@@ -30,7 +30,6 @@ ...@@ -30,7 +30,6 @@
#define SHOW_HV 4 #define SHOW_HV 4
static char const *input_name = "perf.data"; static char const *input_name = "perf.data";
static char *vmlinux = NULL;
static char default_sort_order[] = "comm,dso,symbol"; static char default_sort_order[] = "comm,dso,symbol";
static char *sort_order = default_sort_order; static char *sort_order = default_sort_order;
...@@ -46,11 +45,6 @@ static int dump_trace = 0; ...@@ -46,11 +45,6 @@ static int dump_trace = 0;
#define dprintf(x...) do { if (dump_trace) printf(x); } while (0) #define dprintf(x...) do { if (dump_trace) printf(x); } while (0)
#define cdprintf(x...) do { if (dump_trace) color_fprintf(stdout, color, x); } while (0) #define cdprintf(x...) do { if (dump_trace) color_fprintf(stdout, color, x); } while (0)
static int verbose;
#define eprintf(x...) do { if (verbose) fprintf(stderr, x); } while (0)
static int modules;
static int full_paths; static int full_paths;
static int show_nr_samples; static int show_nr_samples;
...@@ -161,98 +155,7 @@ static int repsep_fprintf(FILE *fp, const char *fmt, ...) ...@@ -161,98 +155,7 @@ static int repsep_fprintf(FILE *fp, const char *fmt, ...)
return n; return n;
} }
static LIST_HEAD(dsos);
static struct dso *kernel_dso;
static struct dso *vdso;
static struct dso *hypervisor_dso;
static void dsos__add(struct dso *dso)
{
list_add_tail(&dso->node, &dsos);
}
static struct dso *dsos__find(const char *name)
{
struct dso *pos;
list_for_each_entry(pos, &dsos, node)
if (strcmp(pos->name, name) == 0)
return pos;
return NULL;
}
static struct dso *dsos__findnew(const char *name)
{
struct dso *dso = dsos__find(name);
int nr;
if (dso)
return dso;
dso = dso__new(name, 0);
if (!dso)
goto out_delete_dso;
nr = dso__load(dso, NULL, verbose);
if (nr < 0) {
eprintf("Failed to open: %s\n", name);
goto out_delete_dso;
}
if (!nr)
eprintf("No symbols found in: %s, maybe install a debug package?\n", name);
dsos__add(dso);
return dso;
out_delete_dso:
dso__delete(dso);
return NULL;
}
static void dsos__fprintf(FILE *fp)
{
struct dso *pos;
list_for_each_entry(pos, &dsos, node)
dso__fprintf(pos, fp);
}
static struct symbol *vdso__find_symbol(struct dso *dso, u64 ip)
{
return dso__find_symbol(dso, ip);
}
static int load_kernel(void)
{
int err;
kernel_dso = dso__new("[kernel]", 0);
if (!kernel_dso)
return -1;
err = dso__load_kernel(kernel_dso, vmlinux, NULL, verbose, modules);
if (err <= 0) {
dso__delete(kernel_dso);
kernel_dso = NULL;
} else
dsos__add(kernel_dso);
vdso = dso__new("[vdso]", 0);
if (!vdso)
return -1;
vdso->find_symbol = vdso__find_symbol;
dsos__add(vdso);
hypervisor_dso = dso__new("[hypervisor]", 0);
if (!hypervisor_dso)
return -1;
dsos__add(hypervisor_dso);
return err;
}
static char __cwd[PATH_MAX]; static char __cwd[PATH_MAX];
static char *cwd = __cwd; static char *cwd = __cwd;
......
...@@ -63,7 +63,6 @@ static struct perf_counter_attr default_attrs[] = { ...@@ -63,7 +63,6 @@ static struct perf_counter_attr default_attrs[] = {
#define MAX_RUN 100 #define MAX_RUN 100
static int system_wide = 0; static int system_wide = 0;
static int verbose = 0;
static unsigned int nr_cpus = 0; static unsigned int nr_cpus = 0;
static int run_idx = 0; static int run_idx = 0;
......
...@@ -68,8 +68,6 @@ static int group = 0; ...@@ -68,8 +68,6 @@ static int group = 0;
static unsigned int page_size; static unsigned int page_size;
static unsigned int mmap_pages = 16; static unsigned int mmap_pages = 16;
static int freq = 0; static int freq = 0;
static int verbose = 0;
static char *vmlinux = NULL;
static int delay_secs = 2; static int delay_secs = 2;
static int zero; static int zero;
...@@ -338,8 +336,6 @@ static void show_details(struct sym_entry *syme) ...@@ -338,8 +336,6 @@ static void show_details(struct sym_entry *syme)
printf("%d lines not displayed, maybe increase display entries [e]\n", more); printf("%d lines not displayed, maybe increase display entries [e]\n", more);
} }
struct dso *kernel_dso;
/* /*
* Symbols will be added here in record_ip and will get out * Symbols will be added here in record_ip and will get out
* after decayed. * after decayed.
......
...@@ -22,5 +22,6 @@ extern int cmd_stat(int argc, const char **argv, const char *prefix); ...@@ -22,5 +22,6 @@ extern int cmd_stat(int argc, const char **argv, const char *prefix);
extern int cmd_top(int argc, const char **argv, const char *prefix); extern int cmd_top(int argc, const char **argv, const char *prefix);
extern int cmd_version(int argc, const char **argv, const char *prefix); extern int cmd_version(int argc, const char **argv, const char *prefix);
extern int cmd_list(int argc, const char **argv, const char *prefix); extern int cmd_list(int argc, const char **argv, const char *prefix);
extern int cmd_trace(int argc, const char **argv, const char *prefix);
#endif #endif
...@@ -48,6 +48,7 @@ ...@@ -48,6 +48,7 @@
#include "../../include/linux/perf_counter.h" #include "../../include/linux/perf_counter.h"
#include "util/types.h" #include "util/types.h"
#include "util/debug.h"
/* /*
* prctl(PR_TASK_PERF_COUNTERS_DISABLE) will (cheaply) disable all * prctl(PR_TASK_PERF_COUNTERS_DISABLE) will (cheaply) disable all
......
/* For general debugging purposes */
#include "../perf.h"
#include <string.h>
#include <stdarg.h>
#include <stdio.h>
int verbose = 0;
int eprintf(const char *fmt, ...)
{
va_list args;
int ret = 0;
if (verbose) {
va_start(args, fmt);
ret = vfprintf(stderr, fmt, args);
va_end(args);
}
return ret;
}
/* For debugging general purposes */
extern int verbose;
int eprintf(const char *fmt, ...) __attribute__((format(printf, 1, 2)));
...@@ -937,6 +937,103 @@ int dso__load_kernel(struct dso *self, const char *vmlinux, ...@@ -937,6 +937,103 @@ int dso__load_kernel(struct dso *self, const char *vmlinux,
return err; return err;
} }
LIST_HEAD(dsos);
struct dso *kernel_dso;
struct dso *vdso;
struct dso *hypervisor_dso;
char *vmlinux = "vmlinux";
int modules;
static void dsos__add(struct dso *dso)
{
list_add_tail(&dso->node, &dsos);
}
static struct dso *dsos__find(const char *name)
{
struct dso *pos;
list_for_each_entry(pos, &dsos, node)
if (strcmp(pos->name, name) == 0)
return pos;
return NULL;
}
struct dso *dsos__findnew(const char *name)
{
struct dso *dso = dsos__find(name);
int nr;
if (dso)
return dso;
dso = dso__new(name, 0);
if (!dso)
goto out_delete_dso;
nr = dso__load(dso, NULL, verbose);
if (nr < 0) {
eprintf("Failed to open: %s\n", name);
goto out_delete_dso;
}
if (!nr)
eprintf("No symbols found in: %s, maybe install a debug package?\n", name);
dsos__add(dso);
return dso;
out_delete_dso:
dso__delete(dso);
return NULL;
}
void dsos__fprintf(FILE *fp)
{
struct dso *pos;
list_for_each_entry(pos, &dsos, node)
dso__fprintf(pos, fp);
}
static struct symbol *vdso__find_symbol(struct dso *dso, u64 ip)
{
return dso__find_symbol(dso, ip);
}
int load_kernel(void)
{
int err;
kernel_dso = dso__new("[kernel]", 0);
if (!kernel_dso)
return -1;
err = dso__load_kernel(kernel_dso, vmlinux, NULL, verbose, modules);
if (err <= 0) {
dso__delete(kernel_dso);
kernel_dso = NULL;
} else
dsos__add(kernel_dso);
vdso = dso__new("[vdso]", 0);
if (!vdso)
return -1;
vdso->find_symbol = vdso__find_symbol;
dsos__add(vdso);
hypervisor_dso = dso__new("[hypervisor]", 0);
if (!hypervisor_dso)
return -1;
dsos__add(hypervisor_dso);
return err;
}
void symbol__init(void) void symbol__init(void)
{ {
elf_version(EV_CURRENT); elf_version(EV_CURRENT);
......
...@@ -48,9 +48,20 @@ int dso__load_kernel(struct dso *self, const char *vmlinux, ...@@ -48,9 +48,20 @@ int dso__load_kernel(struct dso *self, const char *vmlinux,
symbol_filter_t filter, int verbose, int modules); symbol_filter_t filter, int verbose, int modules);
int dso__load_modules(struct dso *self, symbol_filter_t filter, int verbose); int dso__load_modules(struct dso *self, symbol_filter_t filter, int verbose);
int dso__load(struct dso *self, symbol_filter_t filter, int verbose); int dso__load(struct dso *self, symbol_filter_t filter, int verbose);
struct dso *dsos__findnew(const char *name);
void dsos__fprintf(FILE *fp);
size_t dso__fprintf(struct dso *self, FILE *fp); size_t dso__fprintf(struct dso *self, FILE *fp);
char dso__symtab_origin(const struct dso *self); char dso__symtab_origin(const struct dso *self);
int load_kernel(void);
void symbol__init(void); void symbol__init(void);
extern struct list_head dsos;
extern struct dso *kernel_dso;
extern struct dso *vdso;
extern struct dso *hypervisor_dso;
extern char *vmlinux;
extern int modules;
#endif /* _PERF_SYMBOL_ */ #endif /* _PERF_SYMBOL_ */
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册