summaryrefslogtreecommitdiff
path: root/simpleperf/cmd_record_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'simpleperf/cmd_record_test.cpp')
-rw-r--r--simpleperf/cmd_record_test.cpp31
1 files changed, 31 insertions, 0 deletions
diff --git a/simpleperf/cmd_record_test.cpp b/simpleperf/cmd_record_test.cpp
index fcedcee1..8b70fcd2 100644
--- a/simpleperf/cmd_record_test.cpp
+++ b/simpleperf/cmd_record_test.cpp
@@ -429,3 +429,34 @@ TEST(record_cmd, cpu_clock_for_a_long_time) {
ASSERT_TRUE(RecordCmd()->Run(
{"-e", "cpu-clock", "-o", tmpfile.path, "-p", pid, "--duration", "3"}));
}
+
+TEST(record_cmd, dump_regs_for_tracepoint_events) {
+ // Check if the kernel can dump registers for tracepoint events.
+ // If not, probably a kernel patch below is missing:
+ // "5b09a094f2 arm64: perf: Fix callchain parse error with kernel tracepoint events"
+ std::vector<std::unique_ptr<Workload>> workloads;
+ CreateProcesses(1, &workloads);
+ std::string pid = std::to_string(workloads[0]->GetPid());
+ TemporaryFile tmpfile;
+ ASSERT_TRUE(RecordCmd()->Run({"-o", tmpfile.path, "-p", pid, "-e", "sched:sched_switch",
+ "-g", "--no-unwind", "--duration", "1"}));
+
+ // If the kernel patch is missing, all regs dumped in sample records are zero.
+ std::unique_ptr<RecordFileReader> reader = RecordFileReader::CreateInstance(tmpfile.path);
+ CHECK(reader != nullptr);
+ std::unique_ptr<Record> r;
+ bool regs_all_zero = true;
+ while (reader->ReadRecord(r) && r && regs_all_zero) {
+ if (r->type() != PERF_RECORD_SAMPLE) {
+ continue;
+ }
+ SampleRecord* s = static_cast<SampleRecord*>(r.get());
+ for (size_t i = 0; i < s->regs_user_data.reg_nr; ++i) {
+ if (s->regs_user_data.regs[i] != 0u) {
+ regs_all_zero = false;
+ break;
+ }
+ }
+ }
+ ASSERT_FALSE(regs_all_zero);
+}