public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
From: David Ahern <dsahern@gmail.com>
To: Frederic Weisbecker <fweisbec@gmail.com>,
	Akihiro Nagai <akihiro.nagai.hw@hitachi.com>
Cc: Arnaldo Carvalho de Melo <acme@infradead.org>,
	Ingo Molnar <mingo@elte.hu>,
	Peter Zijlstra <peterz@infradead.org>,
	linux-kernel@vger.kernel.org,
	Masami Hiramatsu <masami.hiramatsu.pt@hitachi.com>,
	pp-manager@sdl.hitachi.co.jp
Subject: Re: [PATCH -tip v4 0/7] perf: Introduce branch sub commands
Date: Thu, 26 May 2011 10:24:13 -0600	[thread overview]
Message-ID: <4DDE7EAD.7000603@gmail.com> (raw)
In-Reply-To: <20110526132833.GC21815@nowhere>

[-- Attachment #1: Type: text/plain, Size: 6188 bytes --]



On 05/26/2011 07:28 AM, Frederic Weisbecker wrote:
> (Adding David Ahern in Cc)
> 
> Ok that's all good except this needs to use the "perf script" centralized
> dump.
> 
> Currently running "perf script" without an actual script dumps
> the events by default, whatever kind of event they are: hardware,
> software, tracepoints, ...
> So we want the branch output to be supported there, so we can reuse
> some code and interface.
> 
> For example, "perf script -f branch:comm,tid,sym" would print the
> comm, tid and the sym for to and from addresses.
> 
> That's better than creating a new set of options in a new command
> that people need to relearn while everybody could simply get
> familiarized with common perf script options.
> 
> Of course we can still have a "perf branch" command, which could
> be a tiny shortcut that maps to perf record and perf script.
> 
> Like:
> 
> 	perf branch record
> 	perf branch [trace] -f tid,sym,comm
> 
> Would map to:
> 
> 	perf record branch:u
> 	perf script -f branch:tid,sym,comm
> 
> And may be if one day we can do something more tricky than a
> linear output for branches (like source code coloring/browsing),
> then it may be implemented inside perf branch and not rely on
> another subcommand. Until then we are only dealing with raw linear
> dump, and that's a core job for perf script where we want to
> centralize that kind of facility.

I mentioned that when v3 was posted.

The sample address can be converted to symbols and the output can be
added to perf-script rather easily. Attached is an example. I was going
to submit it back in April and got distracted. I'll rebase, move the
addr->sym conversion to a function and submit later today.

David

> 
> Thanks.
> 
> On Thu, May 26, 2011 at 02:02:46PM +0900, Akihiro Nagai wrote:
>> Hi,
>>
>> This patch series provides the commands 'perf branch record' and
>> 'perf branch trace' version 4. These commands record and analyze
>> a BTS (Branch Trace Store) log. And, they provide the interface
>> to use BTS log for application developers.
>>
>> BTS is a facility of Intel x86 processors, which records the address of
>> 'branch to/from' on every branch/jump instruction and interrupt.
>> This facility is very useful for developers to test their software,
>> for example, coverage test, execution path analysis, dynamic step count ...etc.
>> These test tools have a big advantage, which user doesn't have to modify target
>> executable binaries, because the BTS is a hardware feauture.
>>
>> But, there are few applications using BTS. Reasons I guess are ...
>>  - Few people know what BTS is.
>>  - Few people know how to use BTS on Linux box.
>>  - It's hard to analyze the BTS log because it includes just a series of
>>    addresses.
>>
>> So, I want to provide a user-friendly interface to BTS for application
>> developers.
>>
>>
>>  About new sub commands
>> ========================
>> 'perf branch record' provides an easy way to record BTS log.
>> Usage is 'perf branch record <command>'.  This command is just an alias to
>> 'perf record -e branches:u -c 1 -d <command>'. But, new one is more simple
>> and more intuitive.
>>
>> 'perf branch trace' can parse and analyze recorded BTS log and print various
>> information of execution path. This command can show address, pid, command name,
>> function+offset, file path of elf.
>> You can choose the printed information with option.
>>
>> Example: 'perf branch trace'
>>
>> function+offset
>> _start+0x3      => _dl_start+0x0
>> _dl_start+0x71  => _dl_start+0x93
>> _dl_start+0x97  => _dl_start+0x78
>> _dl_start+0x97  => _dl_start+0x78
>> _dl_start+0xa3  => _dl_start+0x3c0
>> _dl_start+0x3c8 => _dl_start+0x3e8
>> ...
>>
>> This is the default behavior of 'perf branch trace'. It prints function+offset.
>>
>> Example2: 'perf branch -cas trace'
>> command address            function+offset
>> ls      0x0000003e9b000b23 _start+0x3      => 0x0000003e9b004540 _dl_start+0x0
>> ls      0x0000003e9b0045b1 _dl_start+0x71  => 0x0000003e9b0045d3 _dl_start+0x93
>> ls      0x0000003e9b0045d7 _dl_start+0x97  => 0x0000003e9b0045b8 _dl_start+0x78
>> ls      0x0000003e9b0045d7 _dl_start+0x97  => 0x0000003e9b0045b8 _dl_start+0x78
>> ls      0x0000003e9b0045e3 _dl_start+0xa3  => 0x0000003e9b004900 _dl_start+0x3c0
>> ls      0x0000003e9b004908 _dl_start+0x3c8 => 0x0000003e9b004928 _dl_start+0x3e8
>> ...
>>
>> In the future, I'd like to make this more informative. For example
>>  - Show source file path
>>  - Show line number
>>  - Show inlined function name
>>  - Draw call graph
>>  - Browse source code and coloring
>>  - Make BTS record fast
>> and more!
>>
>> Changes in V4:
>>  - Add kenel filter
>>  - Print PID and command only once in a line
>>  - Add output TSV mode
>>
>> Changes in V3:
>>  - Update to the latest -tip tree
>>  - Rename to 'perf branch'
>>  - Process only BTS records
>>  - Fix bug of getting elf_filepath
>>  - Fix return value of __cmd_trace
>>
>> Changes in V2:
>>  - Update to the latest -tip tree
>>  - Add bts explanation to the subcommand list
>>  - Remove the patch already merged (add OPT_CALLBACK_DEFAULT_NOOPT)
>>  - Add comments
>>  - Add new function to the todo list
>>
>> Thanks,
>>
>> ---
>>
>> Akihiro Nagai (7):
>>       perf branch trace: add kernel filter
>>       perf branch trace: add print all option
>>       perf branch trace: print function+offset
>>       perf branch trace: print file path of the executed elf
>>       perf branch trace: print pid and command
>>       perf branch: Introduce new sub command 'perf branch trace'
>>       perf: new subcommand perf branch record
>>
>>
>>  tools/perf/Documentation/perf-branch.txt |   62 +++++
>>  tools/perf/Makefile                      |    1 
>>  tools/perf/builtin-branch.c              |  361 ++++++++++++++++++++++++++++++
>>  tools/perf/builtin.h                     |    1 
>>  tools/perf/command-list.txt              |    1 
>>  tools/perf/perf.c                        |    1 
>>  6 files changed, 427 insertions(+), 0 deletions(-)
>>  create mode 100644 tools/perf/Documentation/perf-branch.txt
>>  create mode 100644 tools/perf/builtin-branch.c
>>
>> -- 
>> Akihiro Nagai (akihiro.nagai.hw@hitachi.com)

[-- Attachment #2: perf-sample-addr.patch --]
[-- Type: text/plain, Size: 3024 bytes --]

diff --git a/tools/perf/builtin-script.c b/tools/perf/builtin-script.c
index 6debb9c..55f9967 100644
--- a/tools/perf/builtin-script.c
+++ b/tools/perf/builtin-script.c
@@ -32,6 +32,7 @@ enum perf_output_field {
 	PERF_OUTPUT_EVNAME          = 1U << 5,
 	PERF_OUTPUT_TRACE           = 1U << 6,
 	PERF_OUTPUT_SYM             = 1U << 7,
+	PERF_OUTPUT_ADDR            = 1U << 8,
 };
 
 struct output_option {
@@ -46,6 +47,7 @@ struct output_option {
 	{.str = "event", .field = PERF_OUTPUT_EVNAME},
 	{.str = "trace", .field = PERF_OUTPUT_TRACE},
 	{.str = "sym",   .field = PERF_OUTPUT_SYM},
+	{.str = "addr",  .field = PERF_OUTPUT_ADDR},
 };
 
 /* default set to maintain compatibility with current format */
@@ -71,7 +73,8 @@ static struct {
 
 		.fields = PERF_OUTPUT_COMM | PERF_OUTPUT_TID |
 			      PERF_OUTPUT_CPU | PERF_OUTPUT_TIME |
-			      PERF_OUTPUT_EVNAME | PERF_OUTPUT_SYM,
+			      PERF_OUTPUT_EVNAME | PERF_OUTPUT_SYM |
+			      PERF_OUTPUT_ADDR,
 
 		.invalid_fields = PERF_OUTPUT_TRACE,
 	},
@@ -173,6 +176,11 @@ static int perf_evsel__check_attr(struct perf_session *session,
 				       PERF_OUTPUT_CPU))
 		return -EINVAL;
 
+	if (PRINT_FIELD(ADDR) &&
+		perf_attr__check_stype(attr, PERF_SAMPLE_ADDR, "ADDR",
+				       PERF_OUTPUT_ADDR))
+		return -EINVAL;
+
 	return 0;
 }
 
@@ -260,7 +268,7 @@ static void print_sample_start(struct perf_sample *sample,
 	}
 }
 
-static void process_event(union perf_event *event __unused,
+static void process_event(union perf_event *event,
 			  struct perf_sample *sample,
 			  struct perf_evsel *evsel,
 			  struct perf_session *session,
@@ -273,6 +281,31 @@ static void process_event(union perf_event *event __unused,
 
 	print_sample_start(sample, thread, attr);
 
+	if (PRINT_FIELD(ADDR)) {
+		struct addr_location al;
+		u8 cpumode = event->header.misc & PERF_RECORD_MISC_CPUMODE_MASK;
+		const char *symname, *dsoname;
+
+		thread__find_addr_map(thread, session, cpumode, MAP__FUNCTION,
+				      event->ip.pid, sample->addr, &al);
+		if (al.map)
+			al.sym = map__find_symbol(al.map, al.addr, NULL);
+		else
+			al.sym = NULL;
+
+		if (al.sym && al.sym->name)
+			symname = al.sym->name;
+		else
+			symname = "";
+
+		if (al.map && al.map->dso && al.map->dso->name)
+			dsoname = al.map->dso->name;
+		else
+			dsoname = "";
+
+		printf("%16" PRIx64 " %s (%s)", al.addr, symname, dsoname);
+	}
+
 	if (PRINT_FIELD(TRACE))
 		print_trace_event(sample->cpu, sample->raw_data,
 				  sample->raw_size);
@@ -972,7 +1005,7 @@ static const struct option options[] = {
 	OPT_STRING(0, "symfs", &symbol_conf.symfs, "directory",
 		    "Look for files with symbols relative to this directory"),
 	OPT_CALLBACK('f', "fields", NULL, "str",
-		     "comma separated output fields prepend with 'type:'. Valid types: hw,sw,trace. Fields: comm,tid,pid,time,cpu,event,trace,sym",
+		     "comma separated output fields prepend with 'type:'. Valid types: hw,sw,trace. Fields: comm,tid,pid,time,cpu,event,trace,sym,addr",
 		     parse_output_fields),
 
 	OPT_END()

  reply	other threads:[~2011-05-26 16:24 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-05-26  5:02 [PATCH -tip v4 0/7] perf: Introduce branch sub commands Akihiro Nagai
2011-05-26  5:03 ` [PATCH -tip v4 1/7] perf: new subcommand perf branch record Akihiro Nagai
2011-05-26  5:03 ` [PATCH -tip v4 2/7] perf branch: Introduce new sub command 'perf branch trace' Akihiro Nagai
2011-05-26  5:03 ` [PATCH -tip v4 3/7] perf branch trace: print pid and command Akihiro Nagai
2011-05-26  5:03 ` [PATCH -tip v4 4/7] perf branch trace: print file path of the executed elf Akihiro Nagai
2011-05-26  5:03 ` [PATCH -tip v4 5/7] perf branch trace: print function+offset Akihiro Nagai
2011-05-26  5:03 ` [PATCH -tip v4 6/7] perf branch trace: add print all option Akihiro Nagai
2011-05-26  5:03 ` [PATCH -tip v4 7/7] perf branch trace: add kernel filter Akihiro Nagai
2011-05-26 13:28 ` [PATCH -tip v4 0/7] perf: Introduce branch sub commands Frederic Weisbecker
2011-05-26 16:24   ` David Ahern [this message]
2011-05-30 13:31     ` Akihiro Nagai
2011-05-30 15:26       ` David Ahern
2011-05-30 16:11         ` Frederic Weisbecker
2011-05-30 19:00           ` Arnaldo Carvalho de Melo
2011-06-10  4:24         ` Akihiro Nagai
2011-06-10  7:17   ` Akihiro Nagai

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4DDE7EAD.7000603@gmail.com \
    --to=dsahern@gmail.com \
    --cc=acme@infradead.org \
    --cc=akihiro.nagai.hw@hitachi.com \
    --cc=fweisbec@gmail.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=masami.hiramatsu.pt@hitachi.com \
    --cc=mingo@elte.hu \
    --cc=peterz@infradead.org \
    --cc=pp-manager@sdl.hitachi.co.jp \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox