diff options
author | Yabin Cui <yabinc@google.com> | 2015-10-07 15:00:46 -0700 |
---|---|---|
committer | Yabin Cui <yabinc@google.com> | 2015-10-12 20:10:45 -0700 |
commit | f469c3d7f4466a2a31c3e837969c43c1e3bc4c90 (patch) | |
tree | 26156da1cccc15a66e949fad0db87cb335c6d885 /simpleperf/record_test.cpp | |
parent | b1f20fa48b65b2f03f9303ffa2aa381cd1d3dd6f (diff) | |
download | extras-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.cpp | 46 |
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]); +} |