mirror of
https://github.com/adulau/aha.git
synced 2024-12-28 11:46:19 +00:00
f1dfa0b1c1
Example: { u64 addr = strtoull(sym_filter, NULL, 16); struct map *map = map_groups__find(kmaps, MAP__VARIABLE, addr); if (map == NULL) pr_err("couldn't find map!\n"); else { struct symbol *sym = map__find_symbol(map, addr, NULL); if (sym == NULL) pr_err("couldn't find addr!\n"); else pr_info("addr %#Lx is in %s global var\n", addr, sym->name); } exit(0); } Added just after symbol__init() call in 'perf top', then: { u64 addr = strtoull(sym_filter, NULL, 16); struct map *map = map_groups__find(kmaps, MAP__VARIABLE, addr); if (map == NULL) pr_err("couldn't find map!\n"); else { struct symbol *sym = map__find_symbol(map, addr, NULL); if (sym == NULL) pr_err("couldn't find addr!\n"); else pr_info("addr %#Lx is in %s global var\n", addr, sym->name); } exit(0); } [root@doppio linux-2.6-tip]# grep ' [dD] ' /proc/kallsyms | grep ' sched' ffffffff817827d8 d sched_nr_latency ffffffff81782ce0 d sched_domains_mutex ffffffff8178c070 d schedstr.22423 ffffffff817909a0 d sched_register_mutex ffffffff81823490 d sched_feat_names ffffffff81823558 d scheduler_running ffffffff818235b8 d sched_clock_running ffffffff818235bc D sched_clock_stable ffffffff81824f00 d sched_switch_trace [root@doppio linux-2.6-tip]# perf top -s 0xffffffff817827d9 addr 0xffffffff817827d9 is in sched_nr_latency global var [root@doppio linux-2.6-tip]# perf top -s ffffffff81782ce0 addr 0xffffffff81782ce0 is in sched_domains_mutex global var [root@doppio linux-2.6-tip]# [root@doppio linux-2.6-tip]# perf top -s ffffffff81782ce0 --vmlinux OFF The file OFF cannot be used, trying to use /proc/kallsyms...addr 0xffffffff81782ce0 is in sched_domains_mutex global var [root@doppio linux-2.6-tip]# perf top -s ffffffff818235bc --vmlinux OFF The file OFF cannot be used, trying to use /proc/kallsyms...addr 0xffffffff818235bc is in sched_clock_stable global var [root@doppio linux-2.6-tip]# So it works with both /proc/kallsyms and with ELF symtabs, either the one on the vmlinux explicitely passed via --vmlinux or in one in the vmlinux_path that matches the buildid for the running kernel or the one found in the buildid header section in a perf.data file. Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com> Cc: Frédéric Weisbecker <fweisbec@gmail.com> Cc: Mike Galbraith <efault@gmx.de> Cc: Peter Zijlstra <a.p.zijlstra@chello.nl> Cc: Paul Mackerras <paulus@samba.org> LKML-Reference: <1260550239-5372-4-git-send-email-acme@infradead.org> Signed-off-by: Ingo Molnar <mingo@elte.hu>
175 lines
3.5 KiB
C
175 lines
3.5 KiB
C
#ifndef __PERF_RECORD_H
|
|
#define __PERF_RECORD_H
|
|
|
|
#include "../perf.h"
|
|
#include "util.h"
|
|
#include <linux/list.h>
|
|
#include <linux/rbtree.h>
|
|
|
|
/*
|
|
* PERF_SAMPLE_IP | PERF_SAMPLE_TID | *
|
|
*/
|
|
struct ip_event {
|
|
struct perf_event_header header;
|
|
u64 ip;
|
|
u32 pid, tid;
|
|
unsigned char __more_data[];
|
|
};
|
|
|
|
struct mmap_event {
|
|
struct perf_event_header header;
|
|
u32 pid, tid;
|
|
u64 start;
|
|
u64 len;
|
|
u64 pgoff;
|
|
char filename[PATH_MAX];
|
|
};
|
|
|
|
struct comm_event {
|
|
struct perf_event_header header;
|
|
u32 pid, tid;
|
|
char comm[16];
|
|
};
|
|
|
|
struct fork_event {
|
|
struct perf_event_header header;
|
|
u32 pid, ppid;
|
|
u32 tid, ptid;
|
|
u64 time;
|
|
};
|
|
|
|
struct lost_event {
|
|
struct perf_event_header header;
|
|
u64 id;
|
|
u64 lost;
|
|
};
|
|
|
|
/*
|
|
* PERF_FORMAT_ENABLED | PERF_FORMAT_RUNNING | PERF_FORMAT_ID
|
|
*/
|
|
struct read_event {
|
|
struct perf_event_header header;
|
|
u32 pid, tid;
|
|
u64 value;
|
|
u64 time_enabled;
|
|
u64 time_running;
|
|
u64 id;
|
|
};
|
|
|
|
struct sample_event {
|
|
struct perf_event_header header;
|
|
u64 array[];
|
|
};
|
|
|
|
struct sample_data {
|
|
u64 ip;
|
|
u32 pid, tid;
|
|
u64 time;
|
|
u64 addr;
|
|
u64 id;
|
|
u64 stream_id;
|
|
u32 cpu;
|
|
u64 period;
|
|
struct ip_callchain *callchain;
|
|
u32 raw_size;
|
|
void *raw_data;
|
|
};
|
|
|
|
#define BUILD_ID_SIZE 20
|
|
|
|
struct build_id_event {
|
|
struct perf_event_header header;
|
|
u8 build_id[ALIGN(BUILD_ID_SIZE, sizeof(u64))];
|
|
char filename[];
|
|
};
|
|
|
|
typedef union event_union {
|
|
struct perf_event_header header;
|
|
struct ip_event ip;
|
|
struct mmap_event mmap;
|
|
struct comm_event comm;
|
|
struct fork_event fork;
|
|
struct lost_event lost;
|
|
struct read_event read;
|
|
struct sample_event sample;
|
|
} event_t;
|
|
|
|
struct events_stats {
|
|
unsigned long total;
|
|
unsigned long lost;
|
|
};
|
|
|
|
void event__print_totals(void);
|
|
|
|
enum map_type {
|
|
MAP__FUNCTION = 0,
|
|
MAP__VARIABLE,
|
|
};
|
|
|
|
#define MAP__NR_TYPES (MAP__VARIABLE + 1)
|
|
|
|
struct map {
|
|
union {
|
|
struct rb_node rb_node;
|
|
struct list_head node;
|
|
};
|
|
u64 start;
|
|
u64 end;
|
|
enum map_type type;
|
|
u64 pgoff;
|
|
u64 (*map_ip)(struct map *, u64);
|
|
u64 (*unmap_ip)(struct map *, u64);
|
|
struct dso *dso;
|
|
};
|
|
|
|
static inline u64 map__map_ip(struct map *map, u64 ip)
|
|
{
|
|
return ip - map->start + map->pgoff;
|
|
}
|
|
|
|
static inline u64 map__unmap_ip(struct map *map, u64 ip)
|
|
{
|
|
return ip + map->start - map->pgoff;
|
|
}
|
|
|
|
static inline u64 identity__map_ip(struct map *map __used, u64 ip)
|
|
{
|
|
return ip;
|
|
}
|
|
|
|
struct symbol;
|
|
|
|
typedef int (*symbol_filter_t)(struct map *map, struct symbol *sym);
|
|
|
|
void map__init(struct map *self, enum map_type type,
|
|
u64 start, u64 end, u64 pgoff, struct dso *dso);
|
|
struct map *map__new(struct mmap_event *event, enum map_type,
|
|
char *cwd, int cwdlen);
|
|
void map__delete(struct map *self);
|
|
struct map *map__clone(struct map *self);
|
|
int map__overlap(struct map *l, struct map *r);
|
|
size_t map__fprintf(struct map *self, FILE *fp);
|
|
struct symbol *map__find_symbol(struct map *self, u64 addr,
|
|
symbol_filter_t filter);
|
|
void map__fixup_start(struct map *self);
|
|
void map__fixup_end(struct map *self);
|
|
|
|
int event__synthesize_thread(pid_t pid, int (*process)(event_t *event));
|
|
void event__synthesize_threads(int (*process)(event_t *event));
|
|
|
|
extern char *event__cwd;
|
|
extern int event__cwdlen;
|
|
extern struct events_stats event__stats;
|
|
extern unsigned long event__total[PERF_RECORD_MAX];
|
|
|
|
int event__process_comm(event_t *self);
|
|
int event__process_lost(event_t *self);
|
|
int event__process_mmap(event_t *self);
|
|
int event__process_task(event_t *self);
|
|
|
|
struct addr_location;
|
|
int event__preprocess_sample(const event_t *self, struct addr_location *al,
|
|
symbol_filter_t filter);
|
|
int event__parse_sample(event_t *event, u64 type, struct sample_data *data);
|
|
|
|
#endif /* __PERF_RECORD_H */
|