[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <173073702882.2098439.13342508872190995896.stgit@mhiramat.roam.corp.google.com>
Date: Tue, 5 Nov 2024 01:17:08 +0900
From: "Masami Hiramatsu (Google)" <mhiramat@...nel.org>
To: Arnaldo Carvalho de Melo <acme@...nel.org>,
Namhyung Kim <namhyung@...nel.org>
Cc: Peter Zijlstra <peterz@...radead.org>,
Ingo Molnar <mingo@...hat.com>,
Masami Hiramatsu <mhiramat@...nel.org>,
Ian Rogers <irogers@...gle.com>,
Dima Kogan <dima@...retsauce.net>,
Alexander Lobakin <aleksander.lobakin@...el.com>,
Przemek Kitszel <przemyslaw.kitszel@...el.com>,
linux-perf-users@...r.kernel.org,
linux-kernel@...r.kernel.org
Subject: [PATCH 0/4] perf-probe: Improbe non-C language support
Hi,
Here is a series of patches for perf probe to improve non-C language
(e.g. Rust, Go) support.
The non-C symbols are demangled style in debuginfo, e.g. golang stores
----
$ ./perf probe -x /work/go/example/outyet/main -F main*
main.(*Server).ServeHTTP
main.(*Server).ServeHTTP.Print.func1
main.(*Server).poll
...
-----
And Rust stores
-----
$ ./perf probe -x /work/cro3/target/x86_64-unknown-linux-gnu/debug/cro3 -F cro3::cmd::servo*
cro3::cmd::servo::run
cro3::cmd::servo::run::CALLSITE
cro3::cmd::servo::run::CALLSITE::META
cro3::cmd::servo::run_control
-----
These symbols are not parsed correctly because it looks like a file name or
including line numbers (`:` caused it.) So, I decided to introduce the changes
- filename MUST start from '@'. (so it is able to distinguish the filename
and the function name)
- Fix to allow backslash to escape to --lines option.
- Introduce quotation mark support.
- Replace non-alnum character to '_' for event name (for non-C symbols).
With these changes, we can run -L (--lines) on golang;
------
$ perf probe -x goexample/hello/hello -L \"main.main\"
<main.main@...rk/goexample/hello/hello.go:0>
0 func main() {
// Configure logging for a command-line program.
2 log.SetFlags(0)
3 log.SetPrefix("hello: ")
// Parse flags.
6 flag.Usage = usage
7 flag.Parse()
------
And Rust
------
$ perf probe -x cro3 -L \"cro3::cmd::servo::run_show\"
<run_show@...rk/cro3/src/cmd/servo.rs:0>
0 fn run_show(args: &ArgsShow) -> Result<()> {
1 let list = ServoList::discover()?;
2 let s = list.find_by_serial(&args.servo)?;
3 if args.json {
4 println!("{s}");
------
And event name are created automatically like below;
$ ./perf probe -x /work/go/example/outyet/main -D 'main.(*Server).poll'
p:probe_main/main_Server_poll /work/go/example/outyet/main:0x353040
$ ./perf probe -x cro3 -D \"cro3::cmd::servo::run_show\"
p:probe_cro3/cro3_cmd_servo_run_show /work/cro3/target/x86_64-unknown-linux-gnu/debug/cro3:0x197530
We still need some more work, but these shows how perf-probe can work
with other languages.
Thank you,
---
Masami Hiramatsu (Google) (4):
perf-probe: Fix to ignore escaped characters in --lines option
perf-probe: Require '@' prefix for filename always
perf-probe: Introduce quotation marks support
perf-probe: Replace unacceptable characters when generating event name
tools/perf/util/probe-event.c | 136 ++++++++++++++++++++++------------------
tools/perf/util/probe-finder.c | 3 +
tools/perf/util/string.c | 100 +++++++++++++++++++++++++++++
tools/perf/util/string2.h | 2 +
4 files changed, 180 insertions(+), 61 deletions(-)
--
Masami Hiramatsu (Google) <mhiramat@...nel.org>
Powered by blists - more mailing lists