diff options
author | Yabin Cui <yabinc@google.com> | 2020-10-19 14:50:54 -0700 |
---|---|---|
committer | Yabin Cui <yabinc@google.com> | 2020-10-19 15:00:35 -0700 |
commit | 68534b9e796819477b0cc985491c9624ae50c5dc (patch) | |
tree | 52861efb7b89b963b58ddabffb24b90623115123 /simpleperf/ProbeEvents.cpp | |
parent | bc8a4a3be6c779c01555858b641214eec80bad85 (diff) | |
download | extras-68534b9e796819477b0cc985491c9624ae50c5dc.tar.gz |
simpleperf: add shortcut for creating kprobe events.
When using a kprobe event without any arguments, a --kprobe option
isn't needed. For example, when "-e kprobes:do_sys_open" is used
without --kprobe, a default kprobe event is created at the entry
of do_sys_open().
Bug: 160630060
Test: run simpleperf_unit_test.
Change-Id: I62f5616c423ecb104d64a425fbd52e38e57e993e
Diffstat (limited to 'simpleperf/ProbeEvents.cpp')
-rw-r--r-- | simpleperf/ProbeEvents.cpp | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/simpleperf/ProbeEvents.cpp b/simpleperf/ProbeEvents.cpp index 5659b7e4..c09652a5 100644 --- a/simpleperf/ProbeEvents.cpp +++ b/simpleperf/ProbeEvents.cpp @@ -30,6 +30,7 @@ #include <android-base/unique_fd.h> #include "environment.h" +#include "event_type.h" #include "utils.h" using android::base::ParseInt; @@ -42,6 +43,8 @@ using namespace simpleperf; namespace simpleperf { +static const std::string kKprobeEventPrefix = "kprobes:"; + bool ProbeEvents::ParseKprobeEventName(const std::string& kprobe_cmd, ProbeEvent* event) { // kprobe_cmd is in formats described in <kernel>/Documentation/trace/kprobetrace.rst: // p[:[GRP/]EVENT] [MOD:]SYM[+offs]|MEMADDR [FETCHARGS] @@ -116,12 +119,26 @@ bool ProbeEvents::AddKprobe(const std::string& kprobe_cmd) { return true; } +bool ProbeEvents::IsProbeEvent(const std::string& event_name) { + return android::base::StartsWith(event_name, kKprobeEventPrefix); +} + +bool ProbeEvents::CreateProbeEventIfNotExist(const std::string& event_name) { + if (EventTypeManager::Instance().FindType(event_name) != nullptr) { + return true; + } + std::string function_name = event_name.substr(kKprobeEventPrefix.size()); + return AddKprobe(StringPrintf("p:%s %s", function_name.c_str(), function_name.c_str())); +} + void ProbeEvents::Clear() { for (const auto& kprobe_event : kprobe_events_) { if (!WriteKprobeCmd("-:" + kprobe_event.group_name + "/" + kprobe_event.event_name)) { LOG(WARNING) << "failed to delete kprobe event " << kprobe_event.group_name << ":" << kprobe_event.event_name; } + EventTypeManager::Instance().RemoveProbeType(kprobe_event.group_name + ":" + + kprobe_event.event_name); } kprobe_events_.clear(); } @@ -141,9 +158,6 @@ bool ProbeEvents::WriteKprobeCmd(const std::string& kprobe_cmd) { PLOG(ERROR) << "failed to write '" << kprobe_cmd << "' to " << path; return false; } - fd.reset(); - std::string data; - android::base::ReadFileToString(path, &data); return true; } |