perf probe: Support distro-style debuginfo for uprobe
Support distro-style debuginfo supported by dso for setting uprobes. Note that this tries to find a debuginfo file based on the real path of the target binary. If the debuginfo is not correctly installed on the system, this can not find it. Signed-off-by: Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com> Cc: David Ahern <dsahern@gmail.com> Cc: "David A. Long" <dave.long@linaro.org> Cc: Ingo Molnar <mingo@redhat.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Oleg Nesterov <oleg@redhat.com> Cc: Srikar Dronamraju <srikar@linux.vnet.ibm.com> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: yrl.pp-manager.tt@hitachi.com Link: http://lkml.kernel.org/r/20140206053227.29635.54434.stgit@kbuild-fedora.yrl.intra.hitachi.co.jp Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
eb948e5083
commit
a15ad2f536
3 changed files with 43 additions and 8 deletions
|
@ -256,17 +256,14 @@ static void clear_probe_trace_events(struct probe_trace_event *tevs, int ntevs)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_DWARF_SUPPORT
|
#ifdef HAVE_DWARF_SUPPORT
|
||||||
|
|
||||||
/* Open new debuginfo of given module */
|
/* Open new debuginfo of given module */
|
||||||
static struct debuginfo *open_debuginfo(const char *module)
|
static struct debuginfo *open_debuginfo(const char *module)
|
||||||
{
|
{
|
||||||
const char *path;
|
const char *path = module;
|
||||||
|
|
||||||
/* A file path -- this is an offline module */
|
if (!module || !strchr(module, '/')) {
|
||||||
if (module && strchr(module, '/'))
|
|
||||||
path = module;
|
|
||||||
else {
|
|
||||||
path = kernel_get_module_path(module);
|
path = kernel_get_module_path(module);
|
||||||
|
|
||||||
if (!path) {
|
if (!path) {
|
||||||
pr_err("Failed to find path of %s module.\n",
|
pr_err("Failed to find path of %s module.\n",
|
||||||
module ?: "kernel");
|
module ?: "kernel");
|
||||||
|
|
|
@ -34,6 +34,7 @@
|
||||||
|
|
||||||
#include <linux/bitops.h>
|
#include <linux/bitops.h>
|
||||||
#include "event.h"
|
#include "event.h"
|
||||||
|
#include "dso.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#include "intlist.h"
|
#include "intlist.h"
|
||||||
#include "util.h"
|
#include "util.h"
|
||||||
|
@ -89,7 +90,7 @@ error:
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
struct debuginfo *debuginfo__new(const char *path)
|
static struct debuginfo *__debuginfo__new(const char *path)
|
||||||
{
|
{
|
||||||
struct debuginfo *dbg = zalloc(sizeof(*dbg));
|
struct debuginfo *dbg = zalloc(sizeof(*dbg));
|
||||||
if (!dbg)
|
if (!dbg)
|
||||||
|
@ -97,10 +98,46 @@ struct debuginfo *debuginfo__new(const char *path)
|
||||||
|
|
||||||
if (debuginfo__init_offline_dwarf(dbg, path) < 0)
|
if (debuginfo__init_offline_dwarf(dbg, path) < 0)
|
||||||
zfree(&dbg);
|
zfree(&dbg);
|
||||||
|
if (dbg)
|
||||||
|
pr_debug("Open Debuginfo file: %s\n", path);
|
||||||
return dbg;
|
return dbg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum dso_binary_type distro_dwarf_types[] = {
|
||||||
|
DSO_BINARY_TYPE__FEDORA_DEBUGINFO,
|
||||||
|
DSO_BINARY_TYPE__UBUNTU_DEBUGINFO,
|
||||||
|
DSO_BINARY_TYPE__OPENEMBEDDED_DEBUGINFO,
|
||||||
|
DSO_BINARY_TYPE__BUILDID_DEBUGINFO,
|
||||||
|
DSO_BINARY_TYPE__NOT_FOUND,
|
||||||
|
};
|
||||||
|
|
||||||
|
struct debuginfo *debuginfo__new(const char *path)
|
||||||
|
{
|
||||||
|
enum dso_binary_type *type;
|
||||||
|
char buf[PATH_MAX], nil = '\0';
|
||||||
|
struct dso *dso;
|
||||||
|
struct debuginfo *dinfo = NULL;
|
||||||
|
|
||||||
|
/* Try to open distro debuginfo files */
|
||||||
|
dso = dso__new(path);
|
||||||
|
if (!dso)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
for (type = distro_dwarf_types;
|
||||||
|
!dinfo && *type != DSO_BINARY_TYPE__NOT_FOUND;
|
||||||
|
type++) {
|
||||||
|
if (dso__read_binary_type_filename(dso, *type, &nil,
|
||||||
|
buf, PATH_MAX) < 0)
|
||||||
|
continue;
|
||||||
|
dinfo = __debuginfo__new(buf);
|
||||||
|
}
|
||||||
|
dso__delete(dso);
|
||||||
|
|
||||||
|
out:
|
||||||
|
/* if failed to open all distro debuginfo, open given binary */
|
||||||
|
return dinfo ? : __debuginfo__new(path);
|
||||||
|
}
|
||||||
|
|
||||||
void debuginfo__delete(struct debuginfo *dbg)
|
void debuginfo__delete(struct debuginfo *dbg)
|
||||||
{
|
{
|
||||||
if (dbg) {
|
if (dbg) {
|
||||||
|
|
|
@ -30,6 +30,7 @@ struct debuginfo {
|
||||||
Dwarf_Addr bias;
|
Dwarf_Addr bias;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* This also tries to open distro debuginfo */
|
||||||
extern struct debuginfo *debuginfo__new(const char *path);
|
extern struct debuginfo *debuginfo__new(const char *path);
|
||||||
extern void debuginfo__delete(struct debuginfo *dbg);
|
extern void debuginfo__delete(struct debuginfo *dbg);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue