mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 14:11:52 +00:00
perf tools: Make it possible to see perf's kernel and module memory mappings
Dump kmaps if using 'perf --debug kmaps' or verbose > 2 (e.g. -vvv) for tools 'perf script' and 'perf report' if there is no browser. Example: $ perf --debug kmaps script 2>&1 >/dev/null | grep kvm.intel build id event received for /lib/modules/6.7.2-local/kernel/arch/x86/kvm/kvm-intel.ko: 0691d75e10e72ebbbd45a44c59f6d00a5604badf [20] Map: 0-3a3 4f5d8 [kvm_intel].modinfo Map: 0-5240 5f280 [kvm_intel]__versions Map: 0-30 64 [kvm_intel].note.Linux Map: 0-14 644c0 [kvm_intel].orc_header Map: 0-5297 43680 [kvm_intel].rodata Map: 0-5bee 3b837 [kvm_intel].text.unlikely Map: 0-7e0 41430 [kvm_intel].noinstr.text Map: 0-2080 713c0 [kvm_intel].bss Map: 0-26 705c8 [kvm_intel].data..read_mostly Map: 0-5888 6a4c0 [kvm_intel].data Map: 0-22 70220 [kvm_intel].data.once Map: 0-40 705f0 [kvm_intel].data..percpu Map: 0-1685 41d20 [kvm_intel].init.text Map: 0-4b8 6fd60 [kvm_intel].init.data Map: 0-380 70248 [kvm_intel]__dyndbg Map: 0-8 70218 [kvm_intel].exit.data Map: 0-438 4f980 [kvm_intel]__param Map: 0-5f5 4ca0f [kvm_intel].rodata.str1.1 Map: 0-3657 493b8 [kvm_intel].rodata.str1.8 Map: 0-e0 70640 [kvm_intel].data..ro_after_init Map: 0-500 70ec0 [kvm_intel].gnu.linkonce.this_module Map: ffffffffc13a7000-ffffffffc1421000 a0 /lib/modules/6.7.2-local/kernel/arch/x86/kvm/kvm-intel.ko The example above shows how the module section mappings are all wrong except for the main .text mapping at 0xffffffffc13a7000. Signed-off-by: Adrian Hunter <adrian.hunter@intel.com> Acked-by: Namhyung Kim <namhyung@kernel.org> Cc: Like Xu <like.xu.linux@gmail.com> Signed-off-by: Namhyung Kim <namhyung@kernel.org> Link: https://lore.kernel.org/r/20240208085326.13432-2-adrian.hunter@intel.com
This commit is contained in:
parent
5b9e4eefc5
commit
0bdfbd04c6
@ -63,6 +63,8 @@ OPTIONS
|
||||
in browser mode
|
||||
perf-event-open - Print perf_event_open() arguments and
|
||||
return value
|
||||
kmaps - Print kernel and module maps (perf script
|
||||
and perf report without browser)
|
||||
|
||||
--debug-file::
|
||||
Write debug output to a specified file.
|
||||
|
@ -1766,6 +1766,8 @@ repeat:
|
||||
} else
|
||||
ret = 0;
|
||||
|
||||
if (!use_browser && (verbose > 2 || debug_kmaps))
|
||||
perf_session__dump_kmaps(session);
|
||||
error:
|
||||
if (report.ptime_range) {
|
||||
itrace_synth_opts__clear_time_range(&itrace_synth_opts);
|
||||
|
@ -4378,6 +4378,9 @@ script_found:
|
||||
|
||||
flush_scripting();
|
||||
|
||||
if (verbose > 2 || debug_kmaps)
|
||||
perf_session__dump_kmaps(session);
|
||||
|
||||
out_delete:
|
||||
if (script.ptime_range) {
|
||||
itrace_synth_opts__clear_time_range(&itrace_synth_opts);
|
||||
|
@ -33,6 +33,7 @@
|
||||
#endif
|
||||
|
||||
int verbose;
|
||||
int debug_kmaps;
|
||||
int debug_peo_args;
|
||||
bool dump_trace = false, quiet = false;
|
||||
int debug_ordered_events;
|
||||
@ -229,6 +230,7 @@ static struct sublevel_option debug_opts[] = {
|
||||
{ .name = "stderr", .value_ptr = &redirect_to_stderr},
|
||||
{ .name = "data-convert", .value_ptr = &debug_data_convert },
|
||||
{ .name = "perf-event-open", .value_ptr = &debug_peo_args },
|
||||
{ .name = "kmaps", .value_ptr = &debug_kmaps },
|
||||
{ .name = NULL, }
|
||||
};
|
||||
|
||||
@ -267,6 +269,7 @@ int perf_quiet_option(void)
|
||||
/* For debug variables that are used as bool types, set to 0. */
|
||||
redirect_to_stderr = 0;
|
||||
debug_peo_args = 0;
|
||||
debug_kmaps = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -9,6 +9,7 @@
|
||||
#include <linux/compiler.h>
|
||||
|
||||
extern int verbose;
|
||||
extern int debug_kmaps;
|
||||
extern int debug_peo_args;
|
||||
extern bool quiet, dump_trace;
|
||||
extern int debug_ordered_events;
|
||||
|
@ -181,6 +181,7 @@ int perf_bpf_filter__destroy(struct evsel *evsel __maybe_unused)
|
||||
* implementing 'verbose' and 'eprintf'.
|
||||
*/
|
||||
int verbose;
|
||||
int debug_kmaps;
|
||||
int debug_peo_args;
|
||||
|
||||
int eprintf(int level, int var, const char *fmt, ...);
|
||||
|
@ -2720,6 +2720,17 @@ size_t perf_session__fprintf(struct perf_session *session, FILE *fp)
|
||||
return machine__fprintf(&session->machines.host, fp);
|
||||
}
|
||||
|
||||
void perf_session__dump_kmaps(struct perf_session *session)
|
||||
{
|
||||
int save_verbose = verbose;
|
||||
|
||||
fflush(stdout);
|
||||
fprintf(stderr, "Kernel and module maps:\n");
|
||||
verbose = 0; /* Suppress verbose to print a summary only */
|
||||
maps__fprintf(machine__kernel_maps(&session->machines.host), stderr);
|
||||
verbose = save_verbose;
|
||||
}
|
||||
|
||||
struct evsel *perf_session__find_first_evtype(struct perf_session *session,
|
||||
unsigned int type)
|
||||
{
|
||||
|
@ -133,6 +133,8 @@ size_t perf_session__fprintf_dsos_buildid(struct perf_session *session, FILE *fp
|
||||
size_t perf_session__fprintf_nr_events(struct perf_session *session, FILE *fp,
|
||||
bool skip_empty);
|
||||
|
||||
void perf_session__dump_kmaps(struct perf_session *session);
|
||||
|
||||
struct evsel *perf_session__find_first_evtype(struct perf_session *session,
|
||||
unsigned int type);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user