summaryrefslogtreecommitdiff
path: root/simpleperf/record_test.cpp
diff options
context:
space:
mode:
authorYabin Cui <yabinc@google.com>2015-10-07 15:00:46 -0700
committerYabin Cui <yabinc@google.com>2015-10-12 20:10:45 -0700
commitf469c3d7f4466a2a31c3e837969c43c1e3bc4c90 (patch)
tree26156da1cccc15a66e949fad0db87cb335c6d885 /simpleperf/record_test.cpp
parentb1f20fa48b65b2f03f9303ffa2aa381cd1d3dd6f (diff)
downloadextras-f469c3d7f4466a2a31c3e837969c43c1e3bc4c90.tar.gz
Simpleperf: do stack unwinding while recording.
Dumping user's stack consumes lots of disk space, which makes long period recording impossible. This patch does stack unwinding before writing to perf.data, so it doesn't need to save user's stack. Previous behavior is still supported with --post-unwind option. A record cache is used for online record processing. Bug: 22229391 Change-Id: Idcc6ec46924fff3fcc8c165d62f8af875b173cd4
Diffstat (limited to 'simpleperf/record_test.cpp')
-rw-r--r--simpleperf/record_test.cpp46
1 files changed, 46 insertions, 0 deletions
diff --git a/simpleperf/record_test.cpp b/simpleperf/record_test.cpp
index 27edc529..6e4ed745 100644
--- a/simpleperf/record_test.cpp
+++ b/simpleperf/record_test.cpp
@@ -54,3 +54,49 @@ TEST_F(RecordTest, CommRecordMatchBinary) {
CommRecord record = CreateCommRecord(event_attr, 1, 2, "CommRecord");
CheckRecordMatchBinary(record);
}
+
+TEST_F(RecordTest, RecordCache_smoke) {
+ event_attr.sample_id_all = 1;
+ event_attr.sample_type |= PERF_SAMPLE_TIME;
+ RecordCache cache(event_attr, 2, 2);
+ MmapRecord r1 = CreateMmapRecord(event_attr, true, 1, 1, 0x100, 0x200, 0x300, "mmap_record1");
+ MmapRecord r2 = r1;
+ MmapRecord r3 = r1;
+ MmapRecord r4 = r1;
+ r1.sample_id.time_data.time = 3;
+ r2.sample_id.time_data.time = 1;
+ r3.sample_id.time_data.time = 4;
+ r4.sample_id.time_data.time = 6;
+ std::vector<char> buf1 = r1.BinaryFormat();
+ std::vector<char> buf2 = r2.BinaryFormat();
+ std::vector<char> buf3 = r3.BinaryFormat();
+ std::vector<char> buf4 = r4.BinaryFormat();
+ // Push r1.
+ cache.Push(buf1.data(), buf1.size());
+ ASSERT_EQ(nullptr, cache.Pop());
+ // Push r2.
+ cache.Push(buf2.data(), buf2.size());
+ // Pop r2.
+ std::unique_ptr<Record> popped_r = cache.Pop();
+ ASSERT_TRUE(popped_r != nullptr);
+ CheckRecordEqual(r2, *popped_r);
+ ASSERT_EQ(nullptr, cache.Pop());
+ // Push r3.
+ cache.Push(buf3.data(), buf3.size());
+ ASSERT_EQ(nullptr, cache.Pop());
+ // Push r4.
+ cache.Push(buf4.data(), buf4.size());
+ // Pop r1.
+ popped_r = cache.Pop();
+ ASSERT_TRUE(popped_r != nullptr);
+ CheckRecordEqual(r1, *popped_r);
+ // Pop r3.
+ popped_r = cache.Pop();
+ ASSERT_TRUE(popped_r != nullptr);
+ CheckRecordEqual(r3, *popped_r);
+ ASSERT_EQ(nullptr, cache.Pop());
+ // Pop r4.
+ std::vector<std::unique_ptr<Record>> last_records = cache.PopAll();
+ ASSERT_EQ(1u, last_records.size());
+ CheckRecordEqual(r4, *last_records[0]);
+}