1/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#include <stdlib.h>
18
19#include <memory>
20#include <string>
21
22#include <android-base/file.h>
23#include <gtest/gtest.h>
24#include <unwindstack/Memory.h>
25
26#include "libdebuggerd/utility.h"
27
28#include "log_fake.h"
29
30const char g_expected_full_dump[] =
31"\nmemory near r1:\n"
32#if defined(__LP64__)
33"    0000000012345658 0706050403020100 0f0e0d0c0b0a0908  ................\n"
34"    0000000012345668 1716151413121110 1f1e1d1c1b1a1918  ................\n"
35"    0000000012345678 2726252423222120 2f2e2d2c2b2a2928   !\"#$%&'()*+,-./\n"
36"    0000000012345688 3736353433323130 3f3e3d3c3b3a3938  0123456789:;<=>?\n"
37"    0000000012345698 4746454443424140 4f4e4d4c4b4a4948  @ABCDEFGHIJKLMNO\n"
38"    00000000123456a8 5756555453525150 5f5e5d5c5b5a5958  PQRSTUVWXYZ[\\]^_\n"
39"    00000000123456b8 6766656463626160 6f6e6d6c6b6a6968  `abcdefghijklmno\n"
40"    00000000123456c8 7776757473727170 7f7e7d7c7b7a7978  pqrstuvwxyz{|}~.\n"
41"    00000000123456d8 8786858483828180 8f8e8d8c8b8a8988  ................\n"
42"    00000000123456e8 9796959493929190 9f9e9d9c9b9a9998  ................\n"
43"    00000000123456f8 a7a6a5a4a3a2a1a0 afaeadacabaaa9a8  ................\n"
44"    0000000012345708 b7b6b5b4b3b2b1b0 bfbebdbcbbbab9b8  ................\n"
45"    0000000012345718 c7c6c5c4c3c2c1c0 cfcecdcccbcac9c8  ................\n"
46"    0000000012345728 d7d6d5d4d3d2d1d0 dfdedddcdbdad9d8  ................\n"
47"    0000000012345738 e7e6e5e4e3e2e1e0 efeeedecebeae9e8  ................\n"
48"    0000000012345748 f7f6f5f4f3f2f1f0 fffefdfcfbfaf9f8  ................\n";
49#else
50"    12345658 03020100 07060504 0b0a0908 0f0e0d0c  ................\n"
51"    12345668 13121110 17161514 1b1a1918 1f1e1d1c  ................\n"
52"    12345678 23222120 27262524 2b2a2928 2f2e2d2c   !\"#$%&'()*+,-./\n"
53"    12345688 33323130 37363534 3b3a3938 3f3e3d3c  0123456789:;<=>?\n"
54"    12345698 43424140 47464544 4b4a4948 4f4e4d4c  @ABCDEFGHIJKLMNO\n"
55"    123456a8 53525150 57565554 5b5a5958 5f5e5d5c  PQRSTUVWXYZ[\\]^_\n"
56"    123456b8 63626160 67666564 6b6a6968 6f6e6d6c  `abcdefghijklmno\n"
57"    123456c8 73727170 77767574 7b7a7978 7f7e7d7c  pqrstuvwxyz{|}~.\n"
58"    123456d8 83828180 87868584 8b8a8988 8f8e8d8c  ................\n"
59"    123456e8 93929190 97969594 9b9a9998 9f9e9d9c  ................\n"
60"    123456f8 a3a2a1a0 a7a6a5a4 abaaa9a8 afaeadac  ................\n"
61"    12345708 b3b2b1b0 b7b6b5b4 bbbab9b8 bfbebdbc  ................\n"
62"    12345718 c3c2c1c0 c7c6c5c4 cbcac9c8 cfcecdcc  ................\n"
63"    12345728 d3d2d1d0 d7d6d5d4 dbdad9d8 dfdedddc  ................\n"
64"    12345738 e3e2e1e0 e7e6e5e4 ebeae9e8 efeeedec  ................\n"
65"    12345748 f3f2f1f0 f7f6f5f4 fbfaf9f8 fffefdfc  ................\n";
66#endif
67
68const char g_expected_partial_dump[] = \
69"\nmemory near pc:\n"
70#if defined(__LP64__)
71"    00000000123455e0 0706050403020100 0f0e0d0c0b0a0908  ................\n"
72"    00000000123455f0 1716151413121110 1f1e1d1c1b1a1918  ................\n"
73"    0000000012345600 2726252423222120 2f2e2d2c2b2a2928   !\"#$%&'()*+,-./\n"
74"    0000000012345610 3736353433323130 3f3e3d3c3b3a3938  0123456789:;<=>?\n"
75"    0000000012345620 4746454443424140 4f4e4d4c4b4a4948  @ABCDEFGHIJKLMNO\n"
76"    0000000012345630 5756555453525150 5f5e5d5c5b5a5958  PQRSTUVWXYZ[\\]^_\n"
77"    0000000012345640 6766656463626160 ----------------  `abcdefg........\n"
78"    0000000012345650 ---------------- ----------------  ................\n"
79"    0000000012345660 ---------------- ----------------  ................\n"
80"    0000000012345670 ---------------- ----------------  ................\n"
81"    0000000012345680 ---------------- ----------------  ................\n"
82"    0000000012345690 ---------------- ----------------  ................\n"
83"    00000000123456a0 ---------------- ----------------  ................\n"
84"    00000000123456b0 ---------------- ----------------  ................\n"
85"    00000000123456c0 ---------------- ----------------  ................\n"
86"    00000000123456d0 ---------------- ----------------  ................\n";
87#else
88"    123455e0 03020100 07060504 0b0a0908 0f0e0d0c  ................\n"
89"    123455f0 13121110 17161514 1b1a1918 1f1e1d1c  ................\n"
90"    12345600 23222120 27262524 2b2a2928 2f2e2d2c   !\"#$%&'()*+,-./\n"
91"    12345610 33323130 37363534 3b3a3938 3f3e3d3c  0123456789:;<=>?\n"
92"    12345620 43424140 47464544 4b4a4948 4f4e4d4c  @ABCDEFGHIJKLMNO\n"
93"    12345630 53525150 57565554 5b5a5958 5f5e5d5c  PQRSTUVWXYZ[\\]^_\n"
94"    12345640 63626160 67666564 -------- --------  `abcdefg........\n"
95"    12345650 -------- -------- -------- --------  ................\n"
96"    12345660 -------- -------- -------- --------  ................\n"
97"    12345670 -------- -------- -------- --------  ................\n"
98"    12345680 -------- -------- -------- --------  ................\n"
99"    12345690 -------- -------- -------- --------  ................\n"
100"    123456a0 -------- -------- -------- --------  ................\n"
101"    123456b0 -------- -------- -------- --------  ................\n"
102"    123456c0 -------- -------- -------- --------  ................\n"
103"    123456d0 -------- -------- -------- --------  ................\n";
104#endif
105
106class MemoryMock : public unwindstack::Memory {
107 public:
108  virtual ~MemoryMock() = default;
109
110  virtual size_t Read(uint64_t addr, void* buffer, size_t bytes) override {
111    size_t offset = 0;
112    if (last_read_addr_ > 0) {
113      offset = addr - last_read_addr_;
114    }
115    size_t bytes_available = buffer_.size() - offset;
116
117    if (partial_read_) {
118      bytes = std::min(bytes, bytes_partial_read_);
119      bytes_partial_read_ -= bytes;
120      partial_read_ = bytes_partial_read_;
121    } else if (bytes > bytes_available) {
122      bytes = bytes_available;
123    }
124
125    if (bytes > 0) {
126      memcpy(buffer, buffer_.data() + offset, bytes);
127    }
128
129    last_read_addr_ = addr;
130    return bytes;
131  }
132
133  void SetReadData(uint8_t* buffer, size_t bytes) {
134    buffer_.resize(bytes);
135    memcpy(buffer_.data(), buffer, bytes);
136    bytes_partial_read_ = 0;
137    last_read_addr_ = 0;
138  }
139
140  void SetPartialReadAmount(size_t bytes) {
141    if (bytes > buffer_.size()) {
142      abort();
143    }
144    partial_read_ = true;
145    bytes_partial_read_ = bytes;
146  }
147
148 private:
149  std::vector<uint8_t> buffer_;
150  bool partial_read_ = false;
151  size_t bytes_partial_read_ = 0;
152  uintptr_t last_read_addr_ = 0;
153};
154
155class DumpMemoryTest : public ::testing::Test {
156 protected:
157  virtual void SetUp() {
158    memory_mock_ = std::make_unique<MemoryMock>();
159
160    char tmp_file[256];
161    const char data_template[] = "/data/local/tmp/debuggerd_memory_testXXXXXX";
162    memcpy(tmp_file, data_template, sizeof(data_template));
163    int tombstone_fd = mkstemp(tmp_file);
164    if (tombstone_fd == -1) {
165      const char tmp_template[] = "/tmp/debuggerd_memory_testXXXXXX";
166      memcpy(tmp_file, tmp_template, sizeof(tmp_template));
167      tombstone_fd = mkstemp(tmp_file);
168      if (tombstone_fd == -1) {
169        abort();
170      }
171    }
172    if (unlink(tmp_file) == -1) {
173      abort();
174    }
175
176    log_.tfd = tombstone_fd;
177    log_.amfd_data = nullptr;
178    log_.crashed_tid = 12;
179    log_.current_tid = 12;
180    log_.should_retrieve_logcat = false;
181
182    resetLogs();
183  }
184
185  virtual void TearDown() {
186    if (log_.tfd >= 0) {
187      close(log_.tfd);
188    }
189    memory_mock_.reset();
190  }
191
192  std::unique_ptr<MemoryMock> memory_mock_;
193
194  log_t log_;
195};
196
197TEST_F(DumpMemoryTest, aligned_addr) {
198  uint8_t buffer[256];
199  for (size_t i = 0; i < sizeof(buffer); i++) {
200    buffer[i] = i;
201  }
202  memory_mock_->SetReadData(buffer, sizeof(buffer));
203
204  dump_memory(&log_, memory_mock_.get(), 0x12345678, "memory near r1");
205
206  std::string tombstone_contents;
207  ASSERT_TRUE(lseek(log_.tfd, 0, SEEK_SET) == 0);
208  ASSERT_TRUE(android::base::ReadFdToString(log_.tfd, &tombstone_contents));
209  ASSERT_STREQ(g_expected_full_dump, tombstone_contents.c_str());
210
211  // Verify that the log buf is empty, and no error messages.
212  ASSERT_STREQ("", getFakeLogBuf().c_str());
213  ASSERT_STREQ("", getFakeLogPrint().c_str());
214}
215
216TEST_F(DumpMemoryTest, partial_read) {
217  uint8_t buffer[256];
218  for (size_t i = 0; i < sizeof(buffer); i++) {
219    buffer[i] = i;
220  }
221  memory_mock_->SetReadData(buffer, sizeof(buffer));
222  memory_mock_->SetPartialReadAmount(96);
223
224  dump_memory(&log_, memory_mock_.get(), 0x12345679, "memory near r1");
225
226  std::string tombstone_contents;
227  ASSERT_TRUE(lseek(log_.tfd, 0, SEEK_SET) == 0);
228  ASSERT_TRUE(android::base::ReadFdToString(log_.tfd, &tombstone_contents));
229  ASSERT_STREQ(g_expected_full_dump, tombstone_contents.c_str());
230
231  // Verify that the log buf is empty, and no error messages.
232  ASSERT_STREQ("", getFakeLogBuf().c_str());
233  ASSERT_STREQ("", getFakeLogPrint().c_str());
234}
235
236TEST_F(DumpMemoryTest, unaligned_addr) {
237  uint8_t buffer[256];
238  for (size_t i = 0; i < sizeof(buffer); i++) {
239    buffer[i] = i;
240  }
241  memory_mock_->SetReadData(buffer, sizeof(buffer));
242
243  dump_memory(&log_, memory_mock_.get(), 0x12345679, "memory near r1");
244
245  std::string tombstone_contents;
246  ASSERT_TRUE(lseek(log_.tfd, 0, SEEK_SET) == 0);
247  ASSERT_TRUE(android::base::ReadFdToString(log_.tfd, &tombstone_contents));
248  ASSERT_STREQ(g_expected_full_dump, tombstone_contents.c_str());
249
250  // Verify that the log buf is empty, and no error messages.
251  ASSERT_STREQ("", getFakeLogBuf().c_str());
252  ASSERT_STREQ("", getFakeLogPrint().c_str());
253}
254
255TEST_F(DumpMemoryTest, memory_unreadable) {
256  dump_memory(&log_, memory_mock_.get(), 0xa2345678, "memory near pc");
257
258  std::string tombstone_contents;
259  ASSERT_TRUE(lseek(log_.tfd, 0, SEEK_SET) == 0);
260  ASSERT_TRUE(android::base::ReadFdToString(log_.tfd, &tombstone_contents));
261  const char* expected_dump = \
262"\nmemory near pc:\n"
263#if defined(__LP64__)
264"    00000000a2345658 ---------------- ----------------  ................\n"
265"    00000000a2345668 ---------------- ----------------  ................\n"
266"    00000000a2345678 ---------------- ----------------  ................\n"
267"    00000000a2345688 ---------------- ----------------  ................\n"
268"    00000000a2345698 ---------------- ----------------  ................\n"
269"    00000000a23456a8 ---------------- ----------------  ................\n"
270"    00000000a23456b8 ---------------- ----------------  ................\n"
271"    00000000a23456c8 ---------------- ----------------  ................\n"
272"    00000000a23456d8 ---------------- ----------------  ................\n"
273"    00000000a23456e8 ---------------- ----------------  ................\n"
274"    00000000a23456f8 ---------------- ----------------  ................\n"
275"    00000000a2345708 ---------------- ----------------  ................\n"
276"    00000000a2345718 ---------------- ----------------  ................\n"
277"    00000000a2345728 ---------------- ----------------  ................\n"
278"    00000000a2345738 ---------------- ----------------  ................\n"
279"    00000000a2345748 ---------------- ----------------  ................\n";
280#else
281"    a2345658 -------- -------- -------- --------  ................\n"
282"    a2345668 -------- -------- -------- --------  ................\n"
283"    a2345678 -------- -------- -------- --------  ................\n"
284"    a2345688 -------- -------- -------- --------  ................\n"
285"    a2345698 -------- -------- -------- --------  ................\n"
286"    a23456a8 -------- -------- -------- --------  ................\n"
287"    a23456b8 -------- -------- -------- --------  ................\n"
288"    a23456c8 -------- -------- -------- --------  ................\n"
289"    a23456d8 -------- -------- -------- --------  ................\n"
290"    a23456e8 -------- -------- -------- --------  ................\n"
291"    a23456f8 -------- -------- -------- --------  ................\n"
292"    a2345708 -------- -------- -------- --------  ................\n"
293"    a2345718 -------- -------- -------- --------  ................\n"
294"    a2345728 -------- -------- -------- --------  ................\n"
295"    a2345738 -------- -------- -------- --------  ................\n"
296"    a2345748 -------- -------- -------- --------  ................\n";
297#endif
298  ASSERT_STREQ(expected_dump, tombstone_contents.c_str());
299
300  // Verify that the log buf is empty, and no error messages.
301  ASSERT_STREQ("", getFakeLogBuf().c_str());
302  ASSERT_STREQ("", getFakeLogPrint().c_str());
303}
304
305TEST_F(DumpMemoryTest, memory_partially_unreadable) {
306  uint8_t buffer[104];
307  for (size_t i = 0; i < sizeof(buffer); i++) {
308    buffer[i] = i;
309  }
310  memory_mock_->SetReadData(buffer, sizeof(buffer));
311
312  dump_memory(&log_, memory_mock_.get(), 0x12345600, "memory near pc");
313
314  std::string tombstone_contents;
315  ASSERT_TRUE(lseek(log_.tfd, 0, SEEK_SET) == 0);
316  ASSERT_TRUE(android::base::ReadFdToString(log_.tfd, &tombstone_contents));
317  ASSERT_STREQ(g_expected_partial_dump, tombstone_contents.c_str());
318
319  // Verify that the log buf is empty, and no error messages.
320  ASSERT_STREQ("", getFakeLogBuf().c_str());
321  ASSERT_STREQ("", getFakeLogPrint().c_str());
322}
323
324TEST_F(DumpMemoryTest, memory_partially_unreadable_unaligned_return) {
325  uint8_t buffer[104];
326  for (size_t i = 0; i < sizeof(buffer); i++) {
327    buffer[i] = i;
328  }
329  memory_mock_->SetReadData(buffer, sizeof(buffer));
330  memory_mock_->SetPartialReadAmount(102);
331
332  dump_memory(&log_, memory_mock_.get(), 0x12345600, "memory near pc");
333
334  std::string tombstone_contents;
335  ASSERT_TRUE(lseek(log_.tfd, 0, SEEK_SET) == 0);
336  ASSERT_TRUE(android::base::ReadFdToString(log_.tfd, &tombstone_contents));
337  ASSERT_STREQ(g_expected_partial_dump, tombstone_contents.c_str());
338
339#if defined(__LP64__)
340  ASSERT_STREQ("6 DEBUG Bytes read 102, is not a multiple of 8\n", getFakeLogPrint().c_str());
341#else
342  ASSERT_STREQ("6 DEBUG Bytes read 102, is not a multiple of 4\n", getFakeLogPrint().c_str());
343#endif
344
345  // Verify that the log buf is empty, and no error messages.
346  ASSERT_STREQ("", getFakeLogBuf().c_str());
347}
348
349TEST_F(DumpMemoryTest, memory_partially_unreadable_two_unaligned_reads) {
350  uint8_t buffer[106];
351  for (size_t i = 0; i < sizeof(buffer); i++) {
352    buffer[i] = i;
353  }
354  memory_mock_->SetReadData(buffer, sizeof(buffer));
355  memory_mock_->SetPartialReadAmount(45);
356
357  dump_memory(&log_, memory_mock_.get(), 0x12345600, "memory near pc");
358
359  std::string tombstone_contents;
360  ASSERT_TRUE(lseek(log_.tfd, 0, SEEK_SET) == 0);
361  ASSERT_TRUE(android::base::ReadFdToString(log_.tfd, &tombstone_contents));
362  ASSERT_STREQ(g_expected_partial_dump, tombstone_contents.c_str());
363
364#if defined(__LP64__)
365  ASSERT_STREQ("6 DEBUG Bytes read 45, is not a multiple of 8\n"
366               "6 DEBUG Bytes after second read 106, is not a multiple of 8\n",
367               getFakeLogPrint().c_str());
368#else
369  ASSERT_STREQ("6 DEBUG Bytes read 45, is not a multiple of 4\n"
370               "6 DEBUG Bytes after second read 106, is not a multiple of 4\n",
371               getFakeLogPrint().c_str());
372#endif
373
374  // Verify that the log buf is empty, and no error messages.
375  ASSERT_STREQ("", getFakeLogBuf().c_str());
376}
377
378TEST_F(DumpMemoryTest, address_low_fence) {
379  uint8_t buffer[256];
380  memset(buffer, 0, sizeof(buffer));
381  memory_mock_->SetReadData(buffer, sizeof(buffer));
382
383  dump_memory(&log_, memory_mock_.get(), 0x1000, "memory near r1");
384
385  std::string tombstone_contents;
386  ASSERT_TRUE(lseek(log_.tfd, 0, SEEK_SET) == 0);
387  ASSERT_TRUE(android::base::ReadFdToString(log_.tfd, &tombstone_contents));
388  const char* expected_dump = \
389"\nmemory near r1:\n"
390#if defined(__LP64__)
391"    0000000000001000 0000000000000000 0000000000000000  ................\n"
392"    0000000000001010 0000000000000000 0000000000000000  ................\n"
393"    0000000000001020 0000000000000000 0000000000000000  ................\n"
394"    0000000000001030 0000000000000000 0000000000000000  ................\n"
395"    0000000000001040 0000000000000000 0000000000000000  ................\n"
396"    0000000000001050 0000000000000000 0000000000000000  ................\n"
397"    0000000000001060 0000000000000000 0000000000000000  ................\n"
398"    0000000000001070 0000000000000000 0000000000000000  ................\n"
399"    0000000000001080 0000000000000000 0000000000000000  ................\n"
400"    0000000000001090 0000000000000000 0000000000000000  ................\n"
401"    00000000000010a0 0000000000000000 0000000000000000  ................\n"
402"    00000000000010b0 0000000000000000 0000000000000000  ................\n"
403"    00000000000010c0 0000000000000000 0000000000000000  ................\n"
404"    00000000000010d0 0000000000000000 0000000000000000  ................\n"
405"    00000000000010e0 0000000000000000 0000000000000000  ................\n"
406"    00000000000010f0 0000000000000000 0000000000000000  ................\n";
407#else
408"    00001000 00000000 00000000 00000000 00000000  ................\n"
409"    00001010 00000000 00000000 00000000 00000000  ................\n"
410"    00001020 00000000 00000000 00000000 00000000  ................\n"
411"    00001030 00000000 00000000 00000000 00000000  ................\n"
412"    00001040 00000000 00000000 00000000 00000000  ................\n"
413"    00001050 00000000 00000000 00000000 00000000  ................\n"
414"    00001060 00000000 00000000 00000000 00000000  ................\n"
415"    00001070 00000000 00000000 00000000 00000000  ................\n"
416"    00001080 00000000 00000000 00000000 00000000  ................\n"
417"    00001090 00000000 00000000 00000000 00000000  ................\n"
418"    000010a0 00000000 00000000 00000000 00000000  ................\n"
419"    000010b0 00000000 00000000 00000000 00000000  ................\n"
420"    000010c0 00000000 00000000 00000000 00000000  ................\n"
421"    000010d0 00000000 00000000 00000000 00000000  ................\n"
422"    000010e0 00000000 00000000 00000000 00000000  ................\n"
423"    000010f0 00000000 00000000 00000000 00000000  ................\n";
424#endif
425  ASSERT_STREQ(expected_dump, tombstone_contents.c_str());
426
427  // Verify that the log buf is empty, and no error messages.
428  ASSERT_STREQ("", getFakeLogBuf().c_str());
429  ASSERT_STREQ("", getFakeLogPrint().c_str());
430}
431
432TEST_F(DumpMemoryTest, memory_address_too_low) {
433  uint8_t buffer[256];
434  memset(buffer, 0, sizeof(buffer));
435  memory_mock_->SetReadData(buffer, sizeof(buffer));
436
437  dump_memory(&log_, memory_mock_.get(), 0, "memory near r1");
438
439  std::string tombstone_contents;
440  ASSERT_TRUE(lseek(log_.tfd, 0, SEEK_SET) == 0);
441  ASSERT_TRUE(android::base::ReadFdToString(log_.tfd, &tombstone_contents));
442  ASSERT_STREQ("", tombstone_contents.c_str());
443
444  // Verify that the log buf is empty, and no error messages.
445  ASSERT_STREQ("", getFakeLogBuf().c_str());
446  ASSERT_STREQ("", getFakeLogPrint().c_str());
447}
448
449TEST_F(DumpMemoryTest, memory_address_too_high) {
450  uint8_t buffer[256];
451  memset(buffer, 0, sizeof(buffer));
452  memory_mock_->SetReadData(buffer, sizeof(buffer));
453
454#if defined(__LP64__)
455  dump_memory(&log_, memory_mock_.get(), 0x4000000000000000UL, "memory near r1");
456  dump_memory(&log_, memory_mock_.get(), 0x4000000000000000UL - 32, "memory near r1");
457  dump_memory(&log_, memory_mock_.get(), 0x4000000000000000UL - 216, "memory near r1");
458#else
459  dump_memory(&log_, memory_mock_.get(), 0xffff0000, "memory near r1");
460  dump_memory(&log_, memory_mock_.get(), 0xffff0000 - 32, "memory near r1");
461  dump_memory(&log_, memory_mock_.get(), 0xffff0000 - 220, "memory near r1");
462#endif
463
464  std::string tombstone_contents;
465  ASSERT_TRUE(lseek(log_.tfd, 0, SEEK_SET) == 0);
466  ASSERT_TRUE(android::base::ReadFdToString(log_.tfd, &tombstone_contents));
467  ASSERT_STREQ("", tombstone_contents.c_str());
468
469  // Verify that the log buf is empty, and no error messages.
470  ASSERT_STREQ("", getFakeLogBuf().c_str());
471  ASSERT_STREQ("", getFakeLogPrint().c_str());
472}
473
474TEST_F(DumpMemoryTest, memory_address_would_overflow) {
475  uint8_t buffer[256];
476  memset(buffer, 0, sizeof(buffer));
477  memory_mock_->SetReadData(buffer, sizeof(buffer));
478
479#if defined(__LP64__)
480  dump_memory(&log_, memory_mock_.get(), 0xfffffffffffffff0, "memory near r1");
481#else
482  dump_memory(&log_, memory_mock_.get(), 0xfffffff0, "memory near r1");
483#endif
484
485  std::string tombstone_contents;
486  ASSERT_TRUE(lseek(log_.tfd, 0, SEEK_SET) == 0);
487  ASSERT_TRUE(android::base::ReadFdToString(log_.tfd, &tombstone_contents));
488  ASSERT_STREQ("", tombstone_contents.c_str());
489
490  // Verify that the log buf is empty, and no error messages.
491  ASSERT_STREQ("", getFakeLogBuf().c_str());
492  ASSERT_STREQ("", getFakeLogPrint().c_str());
493}
494
495TEST_F(DumpMemoryTest, memory_address_nearly_too_high) {
496  uint8_t buffer[256];
497  for (size_t i = 0; i < sizeof(buffer); i++) {
498    buffer[i] = i;
499  }
500  memory_mock_->SetReadData(buffer, sizeof(buffer));
501
502#if defined(__LP64__)
503  dump_memory(&log_, memory_mock_.get(), 0x4000000000000000UL - 224, "memory near r4");
504#else
505  dump_memory(&log_, memory_mock_.get(), 0xffff0000 - 224, "memory near r4");
506#endif
507
508  std::string tombstone_contents;
509  ASSERT_TRUE(lseek(log_.tfd, 0, SEEK_SET) == 0);
510  ASSERT_TRUE(android::base::ReadFdToString(log_.tfd, &tombstone_contents));
511  const char* expected_dump = \
512"\nmemory near r4:\n"
513#if defined(__LP64__)
514"    3fffffffffffff00 0706050403020100 0f0e0d0c0b0a0908  ................\n"
515"    3fffffffffffff10 1716151413121110 1f1e1d1c1b1a1918  ................\n"
516"    3fffffffffffff20 2726252423222120 2f2e2d2c2b2a2928   !\"#$%&'()*+,-./\n"
517"    3fffffffffffff30 3736353433323130 3f3e3d3c3b3a3938  0123456789:;<=>?\n"
518"    3fffffffffffff40 4746454443424140 4f4e4d4c4b4a4948  @ABCDEFGHIJKLMNO\n"
519"    3fffffffffffff50 5756555453525150 5f5e5d5c5b5a5958  PQRSTUVWXYZ[\\]^_\n"
520"    3fffffffffffff60 6766656463626160 6f6e6d6c6b6a6968  `abcdefghijklmno\n"
521"    3fffffffffffff70 7776757473727170 7f7e7d7c7b7a7978  pqrstuvwxyz{|}~.\n"
522"    3fffffffffffff80 8786858483828180 8f8e8d8c8b8a8988  ................\n"
523"    3fffffffffffff90 9796959493929190 9f9e9d9c9b9a9998  ................\n"
524"    3fffffffffffffa0 a7a6a5a4a3a2a1a0 afaeadacabaaa9a8  ................\n"
525"    3fffffffffffffb0 b7b6b5b4b3b2b1b0 bfbebdbcbbbab9b8  ................\n"
526"    3fffffffffffffc0 c7c6c5c4c3c2c1c0 cfcecdcccbcac9c8  ................\n"
527"    3fffffffffffffd0 d7d6d5d4d3d2d1d0 dfdedddcdbdad9d8  ................\n"
528"    3fffffffffffffe0 e7e6e5e4e3e2e1e0 efeeedecebeae9e8  ................\n"
529"    3ffffffffffffff0 f7f6f5f4f3f2f1f0 fffefdfcfbfaf9f8  ................\n";
530#else
531"    fffeff00 03020100 07060504 0b0a0908 0f0e0d0c  ................\n"
532"    fffeff10 13121110 17161514 1b1a1918 1f1e1d1c  ................\n"
533"    fffeff20 23222120 27262524 2b2a2928 2f2e2d2c   !\"#$%&'()*+,-./\n"
534"    fffeff30 33323130 37363534 3b3a3938 3f3e3d3c  0123456789:;<=>?\n"
535"    fffeff40 43424140 47464544 4b4a4948 4f4e4d4c  @ABCDEFGHIJKLMNO\n"
536"    fffeff50 53525150 57565554 5b5a5958 5f5e5d5c  PQRSTUVWXYZ[\\]^_\n"
537"    fffeff60 63626160 67666564 6b6a6968 6f6e6d6c  `abcdefghijklmno\n"
538"    fffeff70 73727170 77767574 7b7a7978 7f7e7d7c  pqrstuvwxyz{|}~.\n"
539"    fffeff80 83828180 87868584 8b8a8988 8f8e8d8c  ................\n"
540"    fffeff90 93929190 97969594 9b9a9998 9f9e9d9c  ................\n"
541"    fffeffa0 a3a2a1a0 a7a6a5a4 abaaa9a8 afaeadac  ................\n"
542"    fffeffb0 b3b2b1b0 b7b6b5b4 bbbab9b8 bfbebdbc  ................\n"
543"    fffeffc0 c3c2c1c0 c7c6c5c4 cbcac9c8 cfcecdcc  ................\n"
544"    fffeffd0 d3d2d1d0 d7d6d5d4 dbdad9d8 dfdedddc  ................\n"
545"    fffeffe0 e3e2e1e0 e7e6e5e4 ebeae9e8 efeeedec  ................\n"
546"    fffefff0 f3f2f1f0 f7f6f5f4 fbfaf9f8 fffefdfc  ................\n";
547#endif
548  ASSERT_STREQ(expected_dump, tombstone_contents.c_str());
549
550  // Verify that the log buf is empty, and no error messages.
551  ASSERT_STREQ("", getFakeLogBuf().c_str());
552  ASSERT_STREQ("", getFakeLogPrint().c_str());
553}
554
555TEST_F(DumpMemoryTest, first_read_empty) {
556  uint8_t buffer[256];
557  for (size_t i = 0; i < sizeof(buffer); i++) {
558    buffer[i] = i;
559  }
560  memory_mock_->SetReadData(buffer, sizeof(buffer));
561  memory_mock_->SetPartialReadAmount(0);
562
563  size_t page_size = sysconf(_SC_PAGE_SIZE);
564  uintptr_t addr = 0x10000020 + page_size - 120;
565  dump_memory(&log_, memory_mock_.get(), addr, "memory near r4");
566
567  std::string tombstone_contents;
568  ASSERT_TRUE(lseek(log_.tfd, 0, SEEK_SET) == 0);
569  ASSERT_TRUE(android::base::ReadFdToString(log_.tfd, &tombstone_contents));
570  const char* expected_dump = \
571"\nmemory near r4:\n"
572#if defined(__LP64__)
573"    0000000010000f88 ---------------- ----------------  ................\n"
574"    0000000010000f98 ---------------- ----------------  ................\n"
575"    0000000010000fa8 ---------------- ----------------  ................\n"
576"    0000000010000fb8 ---------------- ----------------  ................\n"
577"    0000000010000fc8 ---------------- ----------------  ................\n"
578"    0000000010000fd8 ---------------- ----------------  ................\n"
579"    0000000010000fe8 ---------------- ----------------  ................\n"
580"    0000000010000ff8 ---------------- 7f7e7d7c7b7a7978  ........xyz{|}~.\n"
581"    0000000010001008 8786858483828180 8f8e8d8c8b8a8988  ................\n"
582"    0000000010001018 9796959493929190 9f9e9d9c9b9a9998  ................\n"
583"    0000000010001028 a7a6a5a4a3a2a1a0 afaeadacabaaa9a8  ................\n"
584"    0000000010001038 b7b6b5b4b3b2b1b0 bfbebdbcbbbab9b8  ................\n"
585"    0000000010001048 c7c6c5c4c3c2c1c0 cfcecdcccbcac9c8  ................\n"
586"    0000000010001058 d7d6d5d4d3d2d1d0 dfdedddcdbdad9d8  ................\n"
587"    0000000010001068 e7e6e5e4e3e2e1e0 efeeedecebeae9e8  ................\n"
588"    0000000010001078 f7f6f5f4f3f2f1f0 fffefdfcfbfaf9f8  ................\n";
589#else
590"    10000f88 -------- -------- -------- --------  ................\n"
591"    10000f98 -------- -------- -------- --------  ................\n"
592"    10000fa8 -------- -------- -------- --------  ................\n"
593"    10000fb8 -------- -------- -------- --------  ................\n"
594"    10000fc8 -------- -------- -------- --------  ................\n"
595"    10000fd8 -------- -------- -------- --------  ................\n"
596"    10000fe8 -------- -------- -------- --------  ................\n"
597"    10000ff8 -------- -------- 7b7a7978 7f7e7d7c  ........xyz{|}~.\n"
598"    10001008 83828180 87868584 8b8a8988 8f8e8d8c  ................\n"
599"    10001018 93929190 97969594 9b9a9998 9f9e9d9c  ................\n"
600"    10001028 a3a2a1a0 a7a6a5a4 abaaa9a8 afaeadac  ................\n"
601"    10001038 b3b2b1b0 b7b6b5b4 bbbab9b8 bfbebdbc  ................\n"
602"    10001048 c3c2c1c0 c7c6c5c4 cbcac9c8 cfcecdcc  ................\n"
603"    10001058 d3d2d1d0 d7d6d5d4 dbdad9d8 dfdedddc  ................\n"
604"    10001068 e3e2e1e0 e7e6e5e4 ebeae9e8 efeeedec  ................\n"
605"    10001078 f3f2f1f0 f7f6f5f4 fbfaf9f8 fffefdfc  ................\n";
606#endif
607  ASSERT_STREQ(expected_dump, tombstone_contents.c_str());
608
609  // Verify that the log buf is empty, and no error messages.
610  ASSERT_STREQ("", getFakeLogBuf().c_str());
611  ASSERT_STREQ("", getFakeLogPrint().c_str());
612}
613
614TEST_F(DumpMemoryTest, first_read_empty_second_read_stops) {
615  uint8_t buffer[224];
616  for (size_t i = 0; i < sizeof(buffer); i++) {
617    buffer[i] = i;
618  }
619  memory_mock_->SetReadData(buffer, sizeof(buffer));
620  memory_mock_->SetPartialReadAmount(0);
621
622  size_t page_size = sysconf(_SC_PAGE_SIZE);
623  uintptr_t addr = 0x10000020 + page_size - 192;
624  dump_memory(&log_, memory_mock_.get(), addr, "memory near r4");
625
626  std::string tombstone_contents;
627  ASSERT_TRUE(lseek(log_.tfd, 0, SEEK_SET) == 0);
628  ASSERT_TRUE(android::base::ReadFdToString(log_.tfd, &tombstone_contents));
629  const char* expected_dump = \
630"\nmemory near r4:\n"
631#if defined(__LP64__)
632"    0000000010000f40 ---------------- ----------------  ................\n"
633"    0000000010000f50 ---------------- ----------------  ................\n"
634"    0000000010000f60 ---------------- ----------------  ................\n"
635"    0000000010000f70 ---------------- ----------------  ................\n"
636"    0000000010000f80 ---------------- ----------------  ................\n"
637"    0000000010000f90 ---------------- ----------------  ................\n"
638"    0000000010000fa0 ---------------- ----------------  ................\n"
639"    0000000010000fb0 ---------------- ----------------  ................\n"
640"    0000000010000fc0 ---------------- ----------------  ................\n"
641"    0000000010000fd0 ---------------- ----------------  ................\n"
642"    0000000010000fe0 ---------------- ----------------  ................\n"
643"    0000000010000ff0 ---------------- ----------------  ................\n"
644"    0000000010001000 c7c6c5c4c3c2c1c0 cfcecdcccbcac9c8  ................\n"
645"    0000000010001010 d7d6d5d4d3d2d1d0 dfdedddcdbdad9d8  ................\n"
646"    0000000010001020 ---------------- ----------------  ................\n"
647"    0000000010001030 ---------------- ----------------  ................\n";
648#else
649"    10000f40 -------- -------- -------- --------  ................\n"
650"    10000f50 -------- -------- -------- --------  ................\n"
651"    10000f60 -------- -------- -------- --------  ................\n"
652"    10000f70 -------- -------- -------- --------  ................\n"
653"    10000f80 -------- -------- -------- --------  ................\n"
654"    10000f90 -------- -------- -------- --------  ................\n"
655"    10000fa0 -------- -------- -------- --------  ................\n"
656"    10000fb0 -------- -------- -------- --------  ................\n"
657"    10000fc0 -------- -------- -------- --------  ................\n"
658"    10000fd0 -------- -------- -------- --------  ................\n"
659"    10000fe0 -------- -------- -------- --------  ................\n"
660"    10000ff0 -------- -------- -------- --------  ................\n"
661"    10001000 c3c2c1c0 c7c6c5c4 cbcac9c8 cfcecdcc  ................\n"
662"    10001010 d3d2d1d0 d7d6d5d4 dbdad9d8 dfdedddc  ................\n"
663"    10001020 -------- -------- -------- --------  ................\n"
664"    10001030 -------- -------- -------- --------  ................\n";
665#endif
666  ASSERT_STREQ(expected_dump, tombstone_contents.c_str());
667
668  // Verify that the log buf is empty, and no error messages.
669  ASSERT_STREQ("", getFakeLogBuf().c_str());
670  ASSERT_STREQ("", getFakeLogPrint().c_str());
671}
672
673TEST_F(DumpMemoryTest, first_read_empty_next_page_out_of_range) {
674  uint8_t buffer[256];
675  for (size_t i = 0; i < sizeof(buffer); i++) {
676    buffer[i] = i;
677  }
678  memory_mock_->SetReadData(buffer, sizeof(buffer));
679  memory_mock_->SetPartialReadAmount(0);
680
681  uintptr_t addr = 0x10000020;
682  dump_memory(&log_, memory_mock_.get(), addr, "memory near r4");
683
684  std::string tombstone_contents;
685  ASSERT_TRUE(lseek(log_.tfd, 0, SEEK_SET) == 0);
686  ASSERT_TRUE(android::base::ReadFdToString(log_.tfd, &tombstone_contents));
687  const char* expected_dump = \
688"\nmemory near r4:\n"
689#if defined(__LP64__)
690"    0000000010000000 ---------------- ----------------  ................\n"
691"    0000000010000010 ---------------- ----------------  ................\n"
692"    0000000010000020 ---------------- ----------------  ................\n"
693"    0000000010000030 ---------------- ----------------  ................\n"
694"    0000000010000040 ---------------- ----------------  ................\n"
695"    0000000010000050 ---------------- ----------------  ................\n"
696"    0000000010000060 ---------------- ----------------  ................\n"
697"    0000000010000070 ---------------- ----------------  ................\n"
698"    0000000010000080 ---------------- ----------------  ................\n"
699"    0000000010000090 ---------------- ----------------  ................\n"
700"    00000000100000a0 ---------------- ----------------  ................\n"
701"    00000000100000b0 ---------------- ----------------  ................\n"
702"    00000000100000c0 ---------------- ----------------  ................\n"
703"    00000000100000d0 ---------------- ----------------  ................\n"
704"    00000000100000e0 ---------------- ----------------  ................\n"
705"    00000000100000f0 ---------------- ----------------  ................\n";
706#else
707"    10000000 -------- -------- -------- --------  ................\n"
708"    10000010 -------- -------- -------- --------  ................\n"
709"    10000020 -------- -------- -------- --------  ................\n"
710"    10000030 -------- -------- -------- --------  ................\n"
711"    10000040 -------- -------- -------- --------  ................\n"
712"    10000050 -------- -------- -------- --------  ................\n"
713"    10000060 -------- -------- -------- --------  ................\n"
714"    10000070 -------- -------- -------- --------  ................\n"
715"    10000080 -------- -------- -------- --------  ................\n"
716"    10000090 -------- -------- -------- --------  ................\n"
717"    100000a0 -------- -------- -------- --------  ................\n"
718"    100000b0 -------- -------- -------- --------  ................\n"
719"    100000c0 -------- -------- -------- --------  ................\n"
720"    100000d0 -------- -------- -------- --------  ................\n"
721"    100000e0 -------- -------- -------- --------  ................\n"
722"    100000f0 -------- -------- -------- --------  ................\n";
723#endif
724  ASSERT_STREQ(expected_dump, tombstone_contents.c_str());
725
726  // Verify that the log buf is empty, and no error messages.
727  ASSERT_STREQ("", getFakeLogBuf().c_str());
728  ASSERT_STREQ("", getFakeLogPrint().c_str());
729}
730
731TEST_F(DumpMemoryTest, first_read_empty_next_page_out_of_range_fence_post) {
732  uint8_t buffer[256];
733  for (size_t i = 0; i < sizeof(buffer); i++) {
734    buffer[i] = i;
735  }
736  memory_mock_->SetReadData(buffer, sizeof(buffer));
737  memory_mock_->SetPartialReadAmount(0);
738
739  size_t page_size = sysconf(_SC_PAGE_SIZE);
740  uintptr_t addr = 0x10000020 + page_size - 256;
741
742  dump_memory(&log_, memory_mock_.get(), addr, "memory near r4");
743
744  std::string tombstone_contents;
745  ASSERT_TRUE(lseek(log_.tfd, 0, SEEK_SET) == 0);
746  ASSERT_TRUE(android::base::ReadFdToString(log_.tfd, &tombstone_contents));
747  const char* expected_dump = \
748"\nmemory near r4:\n"
749#if defined(__LP64__)
750"    0000000010000f00 ---------------- ----------------  ................\n"
751"    0000000010000f10 ---------------- ----------------  ................\n"
752"    0000000010000f20 ---------------- ----------------  ................\n"
753"    0000000010000f30 ---------------- ----------------  ................\n"
754"    0000000010000f40 ---------------- ----------------  ................\n"
755"    0000000010000f50 ---------------- ----------------  ................\n"
756"    0000000010000f60 ---------------- ----------------  ................\n"
757"    0000000010000f70 ---------------- ----------------  ................\n"
758"    0000000010000f80 ---------------- ----------------  ................\n"
759"    0000000010000f90 ---------------- ----------------  ................\n"
760"    0000000010000fa0 ---------------- ----------------  ................\n"
761"    0000000010000fb0 ---------------- ----------------  ................\n"
762"    0000000010000fc0 ---------------- ----------------  ................\n"
763"    0000000010000fd0 ---------------- ----------------  ................\n"
764"    0000000010000fe0 ---------------- ----------------  ................\n"
765"    0000000010000ff0 ---------------- ----------------  ................\n";
766#else
767"    10000f00 -------- -------- -------- --------  ................\n"
768"    10000f10 -------- -------- -------- --------  ................\n"
769"    10000f20 -------- -------- -------- --------  ................\n"
770"    10000f30 -------- -------- -------- --------  ................\n"
771"    10000f40 -------- -------- -------- --------  ................\n"
772"    10000f50 -------- -------- -------- --------  ................\n"
773"    10000f60 -------- -------- -------- --------  ................\n"
774"    10000f70 -------- -------- -------- --------  ................\n"
775"    10000f80 -------- -------- -------- --------  ................\n"
776"    10000f90 -------- -------- -------- --------  ................\n"
777"    10000fa0 -------- -------- -------- --------  ................\n"
778"    10000fb0 -------- -------- -------- --------  ................\n"
779"    10000fc0 -------- -------- -------- --------  ................\n"
780"    10000fd0 -------- -------- -------- --------  ................\n"
781"    10000fe0 -------- -------- -------- --------  ................\n"
782"    10000ff0 -------- -------- -------- --------  ................\n";
783#endif
784  ASSERT_STREQ(expected_dump, tombstone_contents.c_str());
785
786  // Verify that the log buf is empty, and no error messages.
787  ASSERT_STREQ("", getFakeLogBuf().c_str());
788  ASSERT_STREQ("", getFakeLogPrint().c_str());
789}
790