Merge "simpleperf: better support kernel symbols when running as root."
am: fbc7062e9b
Change-Id: I6950f4a91a52632e5f3abe124fee88854ce5ddf5
diff --git a/simpleperf/cmd_record.cpp b/simpleperf/cmd_record.cpp
index 1eff009..acba6ab 100644
--- a/simpleperf/cmd_record.cpp
+++ b/simpleperf/cmd_record.cpp
@@ -934,7 +934,9 @@
const std::vector<std::string>& args) {
// Read data section of perf.data to collect hit file information.
thread_tree_.ClearThreadAndMap();
- Dso::ReadKernelSymbolsFromProc();
+ if (CheckKernelSymbolAddresses()) {
+ Dso::ReadKernelSymbolsFromProc();
+ }
auto callback = [&](const Record* r) {
thread_tree_.Update(*r);
if (r->type() == PERF_RECORD_SAMPLE) {
diff --git a/simpleperf/cmd_record_test.cpp b/simpleperf/cmd_record_test.cpp
index 0d0c44a..571a3ca 100644
--- a/simpleperf/cmd_record_test.cpp
+++ b/simpleperf/cmd_record_test.cpp
@@ -331,7 +331,6 @@
GTEST_LOG_(INFO) << "Test requires root privilege";
return;
}
- system("echo 0 >/proc/sys/kernel/kptr_restrict");
TemporaryFile tmpfile;
ASSERT_TRUE(RunRecordCmd({"-a", "-o", tmpfile.path, "sleep", "1"}));
std::unique_ptr<RecordFileReader> reader = RecordFileReader::CreateInstance(tmpfile.path);
diff --git a/simpleperf/environment.cpp b/simpleperf/environment.cpp
index 0ad2d6b..d0cb835 100644
--- a/simpleperf/environment.cpp
+++ b/simpleperf/environment.cpp
@@ -451,12 +451,18 @@
LOG(ERROR) << "failed to parse " << kptr_restrict_file << ": " << s;
return false;
}
+ // Accessible to everyone?
if (value == 0) {
return true;
}
+ // Accessible to root?
if (value == 1 && IsRoot()) {
return true;
}
+ // Can we make it accessible to us?
+ if (IsRoot() && android::base::WriteStringToFile("1", kptr_restrict_file)) {
+ return true;
+ }
LOG(WARNING) << "Access to kernel symbol addresses is restricted. If "
<< "possible, please do `echo 0 >/proc/sys/kernel/kptr_restrict` "
<< "to fix this.";