summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYabin Cui <yabinc@google.com>2017-05-22 18:37:58 +0000
committerandroid-build-merger <android-build-merger@google.com>2017-05-22 18:37:58 +0000
commit7b9a8f1ca96ec80b8b64e158a0bda07d9841eb6d (patch)
tree3cfc839e53913233a85dd8fabf856653b83c1fe5
parent2b57f1233855835c0b90f3dfe2496df5b0960eca (diff)
parent41ed89b9794e4275e617b94431e7ccf86c87d354 (diff)
downloadextras-7b9a8f1ca96ec80b8b64e158a0bda07d9841eb6d.tar.gz
Merge "simpleperf: better support kernel symbols when running as root." am: fbc7062e9b am: e9488b3fec
am: 41ed89b979 Change-Id: I80c51cddc14f73a1cdc611bc1424623988007ba6
-rw-r--r--simpleperf/cmd_record.cpp4
-rw-r--r--simpleperf/cmd_record_test.cpp1
-rw-r--r--simpleperf/environment.cpp6
3 files changed, 9 insertions, 2 deletions
diff --git a/simpleperf/cmd_record.cpp b/simpleperf/cmd_record.cpp
index 1eff009e..acba6abb 100644
--- a/simpleperf/cmd_record.cpp
+++ b/simpleperf/cmd_record.cpp
@@ -934,7 +934,9 @@ bool RecordCommand::DumpAdditionalFeatures(
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 0d0c44a7..571a3ca0 100644
--- a/simpleperf/cmd_record_test.cpp
+++ b/simpleperf/cmd_record_test.cpp
@@ -331,7 +331,6 @@ TEST(record_cmd, dump_kernel_symbols) {
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 0ad2d6bd..d0cb8351 100644
--- a/simpleperf/environment.cpp
+++ b/simpleperf/environment.cpp
@@ -451,12 +451,18 @@ bool CheckKernelSymbolAddresses() {
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.";