Skip to content

Commit 21beb31

Browse files
committed
filebased_probe_listing
perf: show possible probes in a given executable file or library. Enhances -F/--funcs option of "perf probe" to list possible probe points in an executable file or library. Show last 10 functions in /bin/zsh. # perf probe -F -x /bin/zsh | tail zstrtol ztrcmp ztrdup ztrduppfx ztrftime ztrlen ztrncpy ztrsub zwarn zwarnnam Show first 10 functions in /lib/libc.so.6 # perf probe -F -x /lib/libc.so.6 | head _IO_adjust_column _IO_adjust_wcolumn _IO_default_doallocate _IO_default_finish _IO_default_pbackfail _IO_default_uflow _IO_default_xsgetn _IO_default_xsputn _IO_do_write@@GLIBC_2.2.5 _IO_doallocbuf Signed-off-by: Srikar Dronamraju <srikar@linux.vnet.ibm.com>
1 parent a307049 commit 21beb31

File tree

4 files changed

+49
-18
lines changed

4 files changed

+49
-18
lines changed

tools/perf/Documentation/perf-probe.txt

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ OPTIONS
7878
-F::
7979
--funcs::
8080
Show available functions in given module or kernel.
81+
With -x/--exec, can also list functions in a user space executable
82+
/ shared library.
8183

8284
--filter=FILTER::
8385
(Only for --vars and --funcs) Set filter. FILTER is a combination of glob
@@ -101,7 +103,7 @@ OPTIONS
101103
-x::
102104
--exec=PATH::
103105
Specify path to the executable or shared library file for user
104-
space tracing.
106+
space tracing. Can also be used with --funcs option.
105107

106108
PROBE SYNTAX
107109
------------

tools/perf/builtin-probe.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -365,8 +365,8 @@ int cmd_probe(int argc, const char **argv, const char *prefix __used)
365365
if (!params.filter)
366366
params.filter = strfilter__new(DEFAULT_FUNC_FILTER,
367367
NULL);
368-
ret = show_available_funcs(params.target,
369-
params.filter);
368+
ret = show_available_funcs(params.target, params.filter,
369+
params.uprobes);
370370
strfilter__delete(params.filter);
371371
if (ret < 0)
372372
pr_err(" Error: Failed to show functions."

tools/perf/util/probe-event.c

Lines changed: 42 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
#include "trace-event.h" /* For __unused */
4848
#include "probe-event.h"
4949
#include "probe-finder.h"
50+
#include "session.h"
5051

5152
#define MAX_CMDLEN 256
5253
#define MAX_PROBE_ARGS 128
@@ -2179,32 +2180,60 @@ static int filter_available_functions(struct map *map __unused,
21792180
return 1;
21802181
}
21812182

2182-
int show_available_funcs(const char *target, struct strfilter *_filter)
2183+
static int __show_available_funcs(struct map *map)
2184+
{
2185+
if (map__load(map, filter_available_functions)) {
2186+
pr_err("Failed to load map.\n");
2187+
return -EINVAL;
2188+
}
2189+
if (!dso__sorted_by_name(map->dso, map->type))
2190+
dso__sort_by_name(map->dso, map->type);
2191+
2192+
dso__fprintf_symbols_by_name(map->dso, map->type, stdout);
2193+
return 0;
2194+
}
2195+
2196+
static int available_kernel_funcs(const char *module)
21832197
{
21842198
struct map *map;
21852199
int ret;
21862200

2187-
setup_pager();
2188-
21892201
ret = init_vmlinux();
21902202
if (ret < 0)
21912203
return ret;
21922204

2193-
map = kernel_get_module_map(target);
2205+
map = kernel_get_module_map(module);
21942206
if (!map) {
2195-
pr_err("Failed to find %s map.\n", (target) ? : "kernel");
2207+
pr_err("Failed to find %s map.\n", (module) ? : "kernel");
21962208
return -EINVAL;
21972209
}
2210+
return __show_available_funcs(map);
2211+
}
2212+
2213+
int show_available_funcs(const char *target, struct strfilter *_filter,
2214+
bool user)
2215+
{
2216+
struct map *map;
2217+
int ret;
2218+
2219+
setup_pager();
21982220
available_func_filter = _filter;
2199-
if (map__load(map, filter_available_functions)) {
2200-
pr_err("Failed to load map.\n");
2201-
return -EINVAL;
2202-
}
2203-
if (!dso__sorted_by_name(map->dso, map->type))
2204-
dso__sort_by_name(map->dso, map->type);
22052221

2206-
dso__fprintf_symbols_by_name(map->dso, map->type, stdout);
2207-
return 0;
2222+
if (!user)
2223+
return available_kernel_funcs(target);
2224+
2225+
symbol_conf.try_vmlinux_path = false;
2226+
symbol_conf.sort_by_name = true;
2227+
ret = symbol__init();
2228+
if (ret < 0) {
2229+
pr_err("Failed to init symbol map.\n");
2230+
return ret;
2231+
}
2232+
map = dso__new_map(target);
2233+
ret = __show_available_funcs(map);
2234+
dso__delete(map->dso);
2235+
map__delete(map);
2236+
return ret;
22082237
}
22092238

22102239
#define DEFAULT_FUNC_FILTER "!_*"

tools/perf/util/probe-event.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,8 +131,8 @@ extern int show_line_range(struct line_range *lr, const char *module);
131131
extern int show_available_vars(struct perf_probe_event *pevs, int npevs,
132132
int max_probe_points, const char *module,
133133
struct strfilter *filter, bool externs);
134-
extern int show_available_funcs(const char *module, struct strfilter *filter);
135-
134+
extern int show_available_funcs(const char *module, struct strfilter *filter,
135+
bool user);
136136

137137
/* Maximum index number of event-name postfix */
138138
#define MAX_EVENT_INDEX 1024

0 commit comments

Comments
 (0)