summaryrefslogtreecommitdiff
path: root/simpleperf/ProbeEvents.cpp
diff options
context:
space:
mode:
authorYabin Cui <yabinc@google.com>2020-10-19 14:50:54 -0700
committerYabin Cui <yabinc@google.com>2020-10-19 15:00:35 -0700
commit68534b9e796819477b0cc985491c9624ae50c5dc (patch)
tree52861efb7b89b963b58ddabffb24b90623115123 /simpleperf/ProbeEvents.cpp
parentbc8a4a3be6c779c01555858b641214eec80bad85 (diff)
downloadextras-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.cpp20
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;
}