mirror of
https://github.com/torvalds/linux.git
synced 2026-06-01 02:53:36 +02:00
perf tools: Get debug info of DSO properly
The dso__debuginfo() just used the path name to open the file but it may
be outdated. It should check build-ID and use the file in the build-ID
cache if available rather than just using the path name.
Let's factor out dso__get_filename() to avoid code duplicate.
Fixes: 53a61a6ca2 ("perf annotate: Add dso__debuginfo() helper")
Reviewed-by: Ian Rogers <irogers@google.com>
Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Cc: Adrian Hunter <adrian.hunter@intel.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: James Clark <james.clark@linaro.org>
Cc: Jiri Olsa <jolsa@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
b42c4dfe02
commit
069e603d82
|
|
@ -112,7 +112,7 @@ bool dso__is_object_file(const struct dso *dso)
|
|||
|
||||
int dso__read_binary_type_filename(const struct dso *dso,
|
||||
enum dso_binary_type type,
|
||||
char *root_dir, char *filename, size_t size)
|
||||
const char *root_dir, char *filename, size_t size)
|
||||
{
|
||||
char build_id_hex[SBUILD_ID_SIZE];
|
||||
int ret = 0;
|
||||
|
|
@ -561,20 +561,15 @@ char *dso__filename_with_chroot(const struct dso *dso, const char *filename)
|
|||
return filename_with_chroot(nsinfo__pid(dso__nsinfo_const(dso)), filename);
|
||||
}
|
||||
|
||||
static int __open_dso(struct dso *dso, struct machine *machine)
|
||||
EXCLUSIVE_LOCKS_REQUIRED(_dso__data_open_lock)
|
||||
static char *dso__get_filename(struct dso *dso, const char *root_dir,
|
||||
bool *decomp)
|
||||
{
|
||||
int fd = -EINVAL;
|
||||
char *root_dir = (char *)"";
|
||||
char *name = malloc(PATH_MAX);
|
||||
bool decomp = false;
|
||||
|
||||
if (!name)
|
||||
return -ENOMEM;
|
||||
*decomp = false;
|
||||
|
||||
mutex_lock(dso__lock(dso));
|
||||
if (machine)
|
||||
root_dir = machine->root_dir;
|
||||
if (name == NULL)
|
||||
return NULL;
|
||||
|
||||
if (dso__read_binary_type_filename(dso, dso__binary_type(dso),
|
||||
root_dir, name, PATH_MAX))
|
||||
|
|
@ -599,20 +594,38 @@ static int __open_dso(struct dso *dso, struct machine *machine)
|
|||
size_t len = sizeof(newpath);
|
||||
|
||||
if (dso__decompress_kmodule_path(dso, name, newpath, len) < 0) {
|
||||
fd = -(*dso__load_errno(dso));
|
||||
errno = *dso__load_errno(dso);
|
||||
goto out;
|
||||
}
|
||||
|
||||
decomp = true;
|
||||
*decomp = true;
|
||||
strcpy(name, newpath);
|
||||
}
|
||||
return name;
|
||||
|
||||
fd = do_open(name);
|
||||
out:
|
||||
free(name);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int __open_dso(struct dso *dso, struct machine *machine)
|
||||
EXCLUSIVE_LOCKS_REQUIRED(_dso__data_open_lock)
|
||||
{
|
||||
int fd = -EINVAL;
|
||||
char *name;
|
||||
bool decomp = false;
|
||||
|
||||
mutex_lock(dso__lock(dso));
|
||||
|
||||
name = dso__get_filename(dso, machine ? machine->root_dir : "", &decomp);
|
||||
if (name)
|
||||
fd = do_open(name);
|
||||
else
|
||||
fd = -errno;
|
||||
|
||||
if (decomp)
|
||||
unlink(name);
|
||||
|
||||
out:
|
||||
mutex_unlock(dso__lock(dso));
|
||||
free(name);
|
||||
return fd;
|
||||
|
|
@ -1916,3 +1929,23 @@ const u8 *dso__read_symbol(struct dso *dso, const char *symfs_filename,
|
|||
return __dso__read_symbol(dso, symfs_filename, start, len,
|
||||
out_buf, out_buf_len, is_64bit);
|
||||
}
|
||||
|
||||
struct debuginfo *dso__debuginfo(struct dso *dso)
|
||||
{
|
||||
char *name;
|
||||
bool decomp = false;
|
||||
struct debuginfo *dinfo = NULL;
|
||||
|
||||
mutex_lock(dso__lock(dso));
|
||||
|
||||
name = dso__get_filename(dso, "", &decomp);
|
||||
if (name)
|
||||
dinfo = debuginfo__new(name);
|
||||
|
||||
if (decomp)
|
||||
unlink(name);
|
||||
|
||||
mutex_unlock(dso__lock(dso));
|
||||
free(name);
|
||||
return dinfo;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -784,7 +784,7 @@ int dso__kernel_module_get_build_id(struct dso *dso, const char *root_dir);
|
|||
|
||||
char dso__symtab_origin(const struct dso *dso);
|
||||
int dso__read_binary_type_filename(const struct dso *dso, enum dso_binary_type type,
|
||||
char *root_dir, char *filename, size_t size);
|
||||
const char *root_dir, char *filename, size_t size);
|
||||
bool is_kernel_module(const char *pathname, int cpumode);
|
||||
bool dso__needs_decompress(struct dso *dso);
|
||||
int dso__decompress_kmodule_fd(struct dso *dso, const char *name);
|
||||
|
|
@ -933,14 +933,7 @@ u64 dso__findnew_global_type(struct dso *dso, u64 addr, u64 offset);
|
|||
bool perf_pid_map_tid(const char *dso_name, int *tid);
|
||||
bool is_perf_pid_map_name(const char *dso_name);
|
||||
|
||||
/*
|
||||
* In the future, we may get debuginfo using build-ID (w/o path).
|
||||
* Add this helper is for the smooth conversion.
|
||||
*/
|
||||
static inline struct debuginfo *dso__debuginfo(struct dso *dso)
|
||||
{
|
||||
return debuginfo__new(dso__long_name(dso));
|
||||
}
|
||||
struct debuginfo *dso__debuginfo(struct dso *dso);
|
||||
|
||||
const u8 *dso__read_symbol(struct dso *dso, const char *symfs_filename,
|
||||
const struct map *map, const struct symbol *sym,
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user