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:
Namhyung Kim 2026-01-13 15:37:57 -08:00 committed by Arnaldo Carvalho de Melo
parent b42c4dfe02
commit 069e603d82
2 changed files with 50 additions and 24 deletions

View File

@ -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;
}

View File

@ -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,