1 /* 2 * Copyright (C) 2017 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 <elf.h> 18 #include <stdint.h> 19 #include <sys/mman.h> 20 21 #include <memory> 22 #include <set> 23 #include <string> 24 25 #include <gtest/gtest.h> 26 27 #include <unwindstack/Elf.h> 28 #include <unwindstack/Maps.h> 29 #include <unwindstack/Memory.h> 30 #include <unwindstack/Regs.h> 31 #include <unwindstack/RegsArm.h> 32 #include <unwindstack/RegsArm64.h> 33 #include <unwindstack/RegsX86.h> 34 #include <unwindstack/RegsX86_64.h> 35 #include <unwindstack/RegsMips.h> 36 #include <unwindstack/RegsMips64.h> 37 #include <unwindstack/Unwinder.h> 38 39 #include "ElfFake.h" 40 #include "MemoryFake.h" 41 #include "RegsFake.h" 42 43 namespace unwindstack { 44 45 class MapsFake : public Maps { 46 public: 47 MapsFake() = default; 48 virtual ~MapsFake() = default; 49 50 bool Parse() { return true; } 51 52 void FakeClear() { maps_.clear(); } 53 54 void FakeAddMapInfo(MapInfo* map_info) { maps_.push_back(map_info); } 55 }; 56 57 class UnwinderTest : public ::testing::Test { 58 protected: 59 static void SetUpTestCase() { 60 maps_.FakeClear(); 61 MapInfo* info = new MapInfo(0x1000, 0x8000, 0, PROT_READ | PROT_WRITE, "/system/fake/libc.so"); 62 ElfFake* elf = new ElfFake(new MemoryFake); 63 info->elf.reset(elf); 64 elf->FakeSetInterface(new ElfInterfaceFake(nullptr)); 65 maps_.FakeAddMapInfo(info); 66 67 info = new MapInfo(0x10000, 0x12000, 0, PROT_READ | PROT_WRITE, "[stack]"); 68 maps_.FakeAddMapInfo(info); 69 70 info = new MapInfo(0x13000, 0x15000, 0, PROT_READ | PROT_WRITE | MAPS_FLAGS_DEVICE_MAP, 71 "/dev/fake_device"); 72 maps_.FakeAddMapInfo(info); 73 74 info = new MapInfo(0x20000, 0x22000, 0, PROT_READ | PROT_WRITE, "/system/fake/libunwind.so"); 75 elf = new ElfFake(new MemoryFake); 76 info->elf.reset(elf); 77 elf->FakeSetInterface(new ElfInterfaceFake(nullptr)); 78 maps_.FakeAddMapInfo(info); 79 80 info = new MapInfo(0x23000, 0x24000, 0, PROT_READ | PROT_WRITE, "/fake/libanother.so"); 81 elf = new ElfFake(new MemoryFake); 82 info->elf.reset(elf); 83 elf->FakeSetInterface(new ElfInterfaceFake(nullptr)); 84 maps_.FakeAddMapInfo(info); 85 86 info = new MapInfo(0x33000, 0x34000, 0, PROT_READ | PROT_WRITE, "/fake/compressed.so"); 87 elf = new ElfFake(new MemoryFake); 88 info->elf.reset(elf); 89 elf->FakeSetInterface(new ElfInterfaceFake(nullptr)); 90 maps_.FakeAddMapInfo(info); 91 92 info = new MapInfo(0x43000, 0x44000, 0x1d000, PROT_READ | PROT_WRITE, "/fake/fake.apk"); 93 elf = new ElfFake(new MemoryFake); 94 info->elf.reset(elf); 95 elf->FakeSetInterface(new ElfInterfaceFake(nullptr)); 96 maps_.FakeAddMapInfo(info); 97 98 info = new MapInfo(0x53000, 0x54000, 0, PROT_READ | PROT_WRITE, "/fake/fake.oat"); 99 maps_.FakeAddMapInfo(info); 100 101 info = new MapInfo(0xa3000, 0xa4000, 0, PROT_READ | PROT_WRITE | PROT_EXEC, "/fake/fake.vdex"); 102 info->load_bias = 0; 103 maps_.FakeAddMapInfo(info); 104 105 info = new MapInfo(0xa5000, 0xa6000, 0, PROT_READ | PROT_WRITE | PROT_EXEC, 106 "/fake/fake_load_bias.so"); 107 elf = new ElfFake(new MemoryFake); 108 info->elf.reset(elf); 109 elf->FakeSetInterface(new ElfInterfaceFake(nullptr)); 110 elf->FakeSetLoadBias(0x5000); 111 maps_.FakeAddMapInfo(info); 112 113 info = new MapInfo(0xa7000, 0xa8000, 0, PROT_READ | PROT_WRITE | PROT_EXEC, 114 "/fake/fake_offset.oat"); 115 elf = new ElfFake(new MemoryFake); 116 info->elf.reset(elf); 117 elf->FakeSetInterface(new ElfInterfaceFake(nullptr)); 118 info->elf_offset = 0x8000; 119 maps_.FakeAddMapInfo(info); 120 121 process_memory_.reset(new MemoryFake); 122 } 123 124 void SetUp() override { 125 ElfInterfaceFake::FakeClear(); 126 regs_.FakeSetArch(ARCH_ARM); 127 regs_.FakeSetReturnAddressValid(false); 128 } 129 130 static MapsFake maps_; 131 static RegsFake regs_; 132 static std::shared_ptr<Memory> process_memory_; 133 }; 134 135 MapsFake UnwinderTest::maps_; 136 RegsFake UnwinderTest::regs_(5); 137 std::shared_ptr<Memory> UnwinderTest::process_memory_(nullptr); 138 139 TEST_F(UnwinderTest, multiple_frames) { 140 ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame0", 0)); 141 ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame1", 1)); 142 ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame2", 2)); 143 144 regs_.set_pc(0x1000); 145 regs_.set_sp(0x10000); 146 ElfInterfaceFake::FakePushStepData(StepData(0x1102, 0x10010, false)); 147 ElfInterfaceFake::FakePushStepData(StepData(0x1202, 0x10020, false)); 148 ElfInterfaceFake::FakePushStepData(StepData(0, 0, true)); 149 150 Unwinder unwinder(64, &maps_, ®s_, process_memory_); 151 unwinder.Unwind(); 152 EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode()); 153 154 ASSERT_EQ(3U, unwinder.NumFrames()); 155 156 auto* frame = &unwinder.frames()[0]; 157 EXPECT_EQ(0U, frame->num); 158 EXPECT_EQ(0U, frame->rel_pc); 159 EXPECT_EQ(0x1000U, frame->pc); 160 EXPECT_EQ(0x10000U, frame->sp); 161 EXPECT_EQ("Frame0", frame->function_name); 162 EXPECT_EQ(0U, frame->function_offset); 163 EXPECT_EQ("/system/fake/libc.so", frame->map_name); 164 EXPECT_EQ(0U, frame->map_offset); 165 EXPECT_EQ(0x1000U, frame->map_start); 166 EXPECT_EQ(0x8000U, frame->map_end); 167 EXPECT_EQ(0U, frame->map_load_bias); 168 EXPECT_EQ(PROT_READ | PROT_WRITE, frame->map_flags); 169 170 frame = &unwinder.frames()[1]; 171 EXPECT_EQ(1U, frame->num); 172 EXPECT_EQ(0x100U, frame->rel_pc); 173 EXPECT_EQ(0x1100U, frame->pc); 174 EXPECT_EQ(0x10010U, frame->sp); 175 EXPECT_EQ("Frame1", frame->function_name); 176 EXPECT_EQ(1U, frame->function_offset); 177 EXPECT_EQ("/system/fake/libc.so", frame->map_name); 178 EXPECT_EQ(0U, frame->map_offset); 179 EXPECT_EQ(0x1000U, frame->map_start); 180 EXPECT_EQ(0x8000U, frame->map_end); 181 EXPECT_EQ(0U, frame->map_load_bias); 182 EXPECT_EQ(PROT_READ | PROT_WRITE, frame->map_flags); 183 184 frame = &unwinder.frames()[2]; 185 EXPECT_EQ(2U, frame->num); 186 EXPECT_EQ(0x200U, frame->rel_pc); 187 EXPECT_EQ(0x1200U, frame->pc); 188 EXPECT_EQ(0x10020U, frame->sp); 189 EXPECT_EQ("Frame2", frame->function_name); 190 EXPECT_EQ(2U, frame->function_offset); 191 EXPECT_EQ("/system/fake/libc.so", frame->map_name); 192 EXPECT_EQ(0U, frame->map_offset); 193 EXPECT_EQ(0x1000U, frame->map_start); 194 EXPECT_EQ(0x8000U, frame->map_end); 195 EXPECT_EQ(0U, frame->map_load_bias); 196 EXPECT_EQ(PROT_READ | PROT_WRITE, frame->map_flags); 197 } 198 199 TEST_F(UnwinderTest, multiple_frames_dont_resolve_names) { 200 ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame0", 0)); 201 ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame1", 1)); 202 ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame2", 2)); 203 204 regs_.set_pc(0x1000); 205 regs_.set_sp(0x10000); 206 ElfInterfaceFake::FakePushStepData(StepData(0x1102, 0x10010, false)); 207 ElfInterfaceFake::FakePushStepData(StepData(0x1202, 0x10020, false)); 208 ElfInterfaceFake::FakePushStepData(StepData(0, 0, true)); 209 210 Unwinder unwinder(64, &maps_, ®s_, process_memory_); 211 unwinder.SetResolveNames(false); 212 unwinder.Unwind(); 213 EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode()); 214 215 ASSERT_EQ(3U, unwinder.NumFrames()); 216 217 auto* frame = &unwinder.frames()[0]; 218 EXPECT_EQ(0U, frame->num); 219 EXPECT_EQ(0U, frame->rel_pc); 220 EXPECT_EQ(0x1000U, frame->pc); 221 EXPECT_EQ(0x10000U, frame->sp); 222 EXPECT_EQ("", frame->function_name); 223 EXPECT_EQ(0U, frame->function_offset); 224 EXPECT_EQ("/system/fake/libc.so", frame->map_name); 225 EXPECT_EQ(0U, frame->map_offset); 226 EXPECT_EQ(0x1000U, frame->map_start); 227 EXPECT_EQ(0x8000U, frame->map_end); 228 EXPECT_EQ(0U, frame->map_load_bias); 229 EXPECT_EQ(PROT_READ | PROT_WRITE, frame->map_flags); 230 231 frame = &unwinder.frames()[1]; 232 EXPECT_EQ(1U, frame->num); 233 EXPECT_EQ(0x100U, frame->rel_pc); 234 EXPECT_EQ(0x1100U, frame->pc); 235 EXPECT_EQ(0x10010U, frame->sp); 236 EXPECT_EQ("", frame->function_name); 237 EXPECT_EQ(0U, frame->function_offset); 238 EXPECT_EQ("/system/fake/libc.so", frame->map_name); 239 EXPECT_EQ(0U, frame->map_offset); 240 EXPECT_EQ(0x1000U, frame->map_start); 241 EXPECT_EQ(0x8000U, frame->map_end); 242 EXPECT_EQ(0U, frame->map_load_bias); 243 EXPECT_EQ(PROT_READ | PROT_WRITE, frame->map_flags); 244 245 frame = &unwinder.frames()[2]; 246 EXPECT_EQ(2U, frame->num); 247 EXPECT_EQ(0x200U, frame->rel_pc); 248 EXPECT_EQ(0x1200U, frame->pc); 249 EXPECT_EQ(0x10020U, frame->sp); 250 EXPECT_EQ("", frame->function_name); 251 EXPECT_EQ(0U, frame->function_offset); 252 EXPECT_EQ("/system/fake/libc.so", frame->map_name); 253 EXPECT_EQ(0U, frame->map_offset); 254 EXPECT_EQ(0x1000U, frame->map_start); 255 EXPECT_EQ(0x8000U, frame->map_end); 256 EXPECT_EQ(0U, frame->map_load_bias); 257 EXPECT_EQ(PROT_READ | PROT_WRITE, frame->map_flags); 258 } 259 260 TEST_F(UnwinderTest, non_zero_load_bias) { 261 ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame0", 0)); 262 263 regs_.set_pc(0xa5500); 264 regs_.set_sp(0x10000); 265 ElfInterfaceFake::FakePushStepData(StepData(0, 0, true)); 266 267 Unwinder unwinder(64, &maps_, ®s_, process_memory_); 268 unwinder.Unwind(); 269 EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode()); 270 271 ASSERT_EQ(1U, unwinder.NumFrames()); 272 273 auto* frame = &unwinder.frames()[0]; 274 EXPECT_EQ(0U, frame->num); 275 EXPECT_EQ(0x5500U, frame->rel_pc); 276 EXPECT_EQ(0xa5500U, frame->pc); 277 EXPECT_EQ(0x10000U, frame->sp); 278 EXPECT_EQ("Frame0", frame->function_name); 279 EXPECT_EQ(0U, frame->function_offset); 280 EXPECT_EQ("/fake/fake_load_bias.so", frame->map_name); 281 EXPECT_EQ(0U, frame->map_offset); 282 EXPECT_EQ(0xa5000U, frame->map_start); 283 EXPECT_EQ(0xa6000U, frame->map_end); 284 EXPECT_EQ(0x5000U, frame->map_load_bias); 285 EXPECT_EQ(PROT_READ | PROT_WRITE | PROT_EXEC, frame->map_flags); 286 } 287 288 TEST_F(UnwinderTest, non_zero_elf_offset) { 289 ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame0", 0)); 290 291 regs_.set_pc(0xa7500); 292 regs_.set_sp(0x10000); 293 ElfInterfaceFake::FakePushStepData(StepData(0, 0, true)); 294 295 Unwinder unwinder(64, &maps_, ®s_, process_memory_); 296 unwinder.Unwind(); 297 EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode()); 298 299 ASSERT_EQ(1U, unwinder.NumFrames()); 300 301 auto* frame = &unwinder.frames()[0]; 302 EXPECT_EQ(0U, frame->num); 303 EXPECT_EQ(0x8500U, frame->rel_pc); 304 EXPECT_EQ(0xa7500U, frame->pc); 305 EXPECT_EQ(0x10000U, frame->sp); 306 EXPECT_EQ("Frame0", frame->function_name); 307 EXPECT_EQ(0U, frame->function_offset); 308 EXPECT_EQ("/fake/fake_offset.oat", frame->map_name); 309 EXPECT_EQ(0U, frame->map_offset); 310 EXPECT_EQ(0xa7000U, frame->map_start); 311 EXPECT_EQ(0xa8000U, frame->map_end); 312 EXPECT_EQ(0U, frame->map_load_bias); 313 EXPECT_EQ(PROT_READ | PROT_WRITE | PROT_EXEC, frame->map_flags); 314 } 315 316 TEST_F(UnwinderTest, non_zero_map_offset) { 317 ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame0", 0)); 318 319 regs_.set_pc(0x43000); 320 regs_.set_sp(0x10000); 321 ElfInterfaceFake::FakePushStepData(StepData(0, 0, true)); 322 323 Unwinder unwinder(64, &maps_, ®s_, process_memory_); 324 unwinder.Unwind(); 325 EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode()); 326 327 ASSERT_EQ(1U, unwinder.NumFrames()); 328 329 auto* frame = &unwinder.frames()[0]; 330 EXPECT_EQ(0U, frame->num); 331 EXPECT_EQ(0U, frame->rel_pc); 332 EXPECT_EQ(0x43000U, frame->pc); 333 EXPECT_EQ(0x10000U, frame->sp); 334 EXPECT_EQ("Frame0", frame->function_name); 335 EXPECT_EQ(0U, frame->function_offset); 336 EXPECT_EQ("/fake/fake.apk", frame->map_name); 337 EXPECT_EQ(0x1d000U, frame->map_offset); 338 EXPECT_EQ(0x43000U, frame->map_start); 339 EXPECT_EQ(0x44000U, frame->map_end); 340 EXPECT_EQ(0U, frame->map_load_bias); 341 EXPECT_EQ(PROT_READ | PROT_WRITE, frame->map_flags); 342 } 343 344 // Verify that no attempt to continue after the step indicates it is done. 345 TEST_F(UnwinderTest, no_frames_after_finished) { 346 ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame0", 0)); 347 ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame1", 1)); 348 ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame2", 2)); 349 ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame3", 3)); 350 ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame4", 4)); 351 352 regs_.set_pc(0x1000); 353 regs_.set_sp(0x10000); 354 ElfInterfaceFake::FakePushStepData(StepData(0x1000, 0x10000, true)); 355 ElfInterfaceFake::FakePushStepData(StepData(0x1102, 0x10010, false)); 356 ElfInterfaceFake::FakePushStepData(StepData(0x1202, 0x10020, false)); 357 358 Unwinder unwinder(64, &maps_, ®s_, process_memory_); 359 unwinder.Unwind(); 360 EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode()); 361 362 ASSERT_EQ(1U, unwinder.NumFrames()); 363 364 auto* frame = &unwinder.frames()[0]; 365 EXPECT_EQ(0U, frame->num); 366 EXPECT_EQ(0U, frame->rel_pc); 367 EXPECT_EQ(0x1000U, frame->pc); 368 EXPECT_EQ(0x10000U, frame->sp); 369 EXPECT_EQ("Frame0", frame->function_name); 370 EXPECT_EQ(0U, frame->function_offset); 371 EXPECT_EQ("/system/fake/libc.so", frame->map_name); 372 EXPECT_EQ(0U, frame->map_offset); 373 EXPECT_EQ(0x1000U, frame->map_start); 374 EXPECT_EQ(0x8000U, frame->map_end); 375 EXPECT_EQ(0U, frame->map_load_bias); 376 EXPECT_EQ(PROT_READ | PROT_WRITE, frame->map_flags); 377 } 378 379 // Verify the maximum frames to save. 380 TEST_F(UnwinderTest, max_frames) { 381 for (size_t i = 0; i < 30; i++) { 382 ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame" + std::to_string(i), i)); 383 ElfInterfaceFake::FakePushStepData(StepData(0x1102 + i * 0x100, 0x10010 + i * 0x10, false)); 384 } 385 386 regs_.set_pc(0x1000); 387 regs_.set_sp(0x10000); 388 389 Unwinder unwinder(20, &maps_, ®s_, process_memory_); 390 unwinder.Unwind(); 391 EXPECT_EQ(ERROR_MAX_FRAMES_EXCEEDED, unwinder.LastErrorCode()); 392 393 ASSERT_EQ(20U, unwinder.NumFrames()); 394 395 for (size_t i = 0; i < 20; i++) { 396 auto* frame = &unwinder.frames()[i]; 397 EXPECT_EQ(i, frame->num); 398 EXPECT_EQ(i * 0x100, frame->rel_pc) << "Failed at frame " << i; 399 EXPECT_EQ(0x1000 + i * 0x100, frame->pc) << "Failed at frame " << i; 400 EXPECT_EQ(0x10000 + 0x10 * i, frame->sp) << "Failed at frame " << i; 401 EXPECT_EQ("Frame" + std::to_string(i), frame->function_name) << "Failed at frame " << i; 402 EXPECT_EQ(i, frame->function_offset) << "Failed at frame " << i; 403 EXPECT_EQ("/system/fake/libc.so", frame->map_name) << "Failed at frame " << i; 404 EXPECT_EQ(0U, frame->map_offset) << "Failed at frame " << i; 405 EXPECT_EQ(0x1000U, frame->map_start) << "Failed at frame " << i; 406 EXPECT_EQ(0x8000U, frame->map_end) << "Failed at frame " << i; 407 EXPECT_EQ(0U, frame->map_load_bias) << "Failed at frame " << i; 408 EXPECT_EQ(PROT_READ | PROT_WRITE, frame->map_flags) << "Failed at frame " << i; 409 } 410 } 411 412 // Verify that initial map names frames are removed. 413 TEST_F(UnwinderTest, verify_frames_skipped) { 414 ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame0", 0)); 415 ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame1", 1)); 416 ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame2", 2)); 417 418 regs_.set_pc(0x20000); 419 regs_.set_sp(0x10000); 420 ElfInterfaceFake::FakePushStepData(StepData(0x23002, 0x10010, false)); 421 ElfInterfaceFake::FakePushStepData(StepData(0x23102, 0x10020, false)); 422 ElfInterfaceFake::FakePushStepData(StepData(0x20002, 0x10030, false)); 423 ElfInterfaceFake::FakePushStepData(StepData(0x21002, 0x10040, false)); 424 ElfInterfaceFake::FakePushStepData(StepData(0x1002, 0x10050, false)); 425 ElfInterfaceFake::FakePushStepData(StepData(0x21002, 0x10060, false)); 426 ElfInterfaceFake::FakePushStepData(StepData(0x23002, 0x10070, false)); 427 ElfInterfaceFake::FakePushStepData(StepData(0, 0, true)); 428 429 Unwinder unwinder(64, &maps_, ®s_, process_memory_); 430 std::vector<std::string> skip_libs{"libunwind.so", "libanother.so"}; 431 unwinder.Unwind(&skip_libs); 432 EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode()); 433 434 ASSERT_EQ(3U, unwinder.NumFrames()); 435 436 auto* frame = &unwinder.frames()[0]; 437 EXPECT_EQ(0U, frame->num); 438 EXPECT_EQ(0U, frame->rel_pc); 439 EXPECT_EQ(0x1000U, frame->pc); 440 EXPECT_EQ(0x10050U, frame->sp); 441 EXPECT_EQ("Frame0", frame->function_name); 442 EXPECT_EQ(0U, frame->function_offset); 443 EXPECT_EQ("/system/fake/libc.so", frame->map_name); 444 EXPECT_EQ(0U, frame->map_offset); 445 EXPECT_EQ(0x1000U, frame->map_start); 446 EXPECT_EQ(0x8000U, frame->map_end); 447 EXPECT_EQ(0U, frame->map_load_bias); 448 EXPECT_EQ(PROT_READ | PROT_WRITE, frame->map_flags); 449 450 frame = &unwinder.frames()[1]; 451 EXPECT_EQ(1U, frame->num); 452 EXPECT_EQ(0x1000U, frame->rel_pc); 453 EXPECT_EQ(0x21000U, frame->pc); 454 EXPECT_EQ(0x10060U, frame->sp); 455 EXPECT_EQ("Frame1", frame->function_name); 456 EXPECT_EQ(1U, frame->function_offset); 457 EXPECT_EQ("/system/fake/libunwind.so", frame->map_name); 458 EXPECT_EQ(0U, frame->map_offset); 459 EXPECT_EQ(0x20000U, frame->map_start); 460 EXPECT_EQ(0x22000U, frame->map_end); 461 EXPECT_EQ(0U, frame->map_load_bias); 462 EXPECT_EQ(PROT_READ | PROT_WRITE, frame->map_flags); 463 464 frame = &unwinder.frames()[2]; 465 EXPECT_EQ(2U, frame->num); 466 EXPECT_EQ(0U, frame->rel_pc); 467 EXPECT_EQ(0x23000U, frame->pc); 468 EXPECT_EQ(0x10070U, frame->sp); 469 EXPECT_EQ("Frame2", frame->function_name); 470 EXPECT_EQ(2U, frame->function_offset); 471 EXPECT_EQ("/fake/libanother.so", frame->map_name); 472 EXPECT_EQ(0U, frame->map_offset); 473 EXPECT_EQ(0x23000U, frame->map_start); 474 EXPECT_EQ(0x24000U, frame->map_end); 475 EXPECT_EQ(0U, frame->map_load_bias); 476 EXPECT_EQ(PROT_READ | PROT_WRITE, frame->map_flags); 477 } 478 479 // Verify SP in a non-existant map is okay. 480 TEST_F(UnwinderTest, sp_not_in_map) { 481 ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame0", 0)); 482 ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame1", 1)); 483 484 regs_.set_pc(0x1000); 485 regs_.set_sp(0x63000); 486 ElfInterfaceFake::FakePushStepData(StepData(0x21002, 0x50020, false)); 487 ElfInterfaceFake::FakePushStepData(StepData(0, 0, true)); 488 489 Unwinder unwinder(64, &maps_, ®s_, process_memory_); 490 unwinder.Unwind(); 491 EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode()); 492 493 ASSERT_EQ(2U, unwinder.NumFrames()); 494 495 auto* frame = &unwinder.frames()[0]; 496 EXPECT_EQ(0U, frame->num); 497 EXPECT_EQ(0U, frame->rel_pc); 498 EXPECT_EQ(0x1000U, frame->pc); 499 EXPECT_EQ(0x63000U, frame->sp); 500 EXPECT_EQ("Frame0", frame->function_name); 501 EXPECT_EQ(0U, frame->function_offset); 502 EXPECT_EQ("/system/fake/libc.so", frame->map_name); 503 EXPECT_EQ(0U, frame->map_offset); 504 EXPECT_EQ(0x1000U, frame->map_start); 505 EXPECT_EQ(0x8000U, frame->map_end); 506 EXPECT_EQ(0U, frame->map_load_bias); 507 EXPECT_EQ(PROT_READ | PROT_WRITE, frame->map_flags); 508 509 frame = &unwinder.frames()[1]; 510 EXPECT_EQ(1U, frame->num); 511 EXPECT_EQ(0x1000U, frame->rel_pc); 512 EXPECT_EQ(0x21000U, frame->pc); 513 EXPECT_EQ(0x50020U, frame->sp); 514 EXPECT_EQ("Frame1", frame->function_name); 515 EXPECT_EQ(1U, frame->function_offset); 516 EXPECT_EQ("/system/fake/libunwind.so", frame->map_name); 517 EXPECT_EQ(0U, frame->map_offset); 518 EXPECT_EQ(0x20000U, frame->map_start); 519 EXPECT_EQ(0x22000U, frame->map_end); 520 EXPECT_EQ(0U, frame->map_load_bias); 521 EXPECT_EQ(PROT_READ | PROT_WRITE, frame->map_flags); 522 } 523 524 // Verify PC in a device stops the unwind. 525 TEST_F(UnwinderTest, pc_in_device_stops_unwind) { 526 ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame0", 0)); 527 ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame1", 1)); 528 ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame2", 2)); 529 530 regs_.set_pc(0x13000); 531 regs_.set_sp(0x10000); 532 ElfInterfaceFake::FakePushStepData(StepData(0x23002, 0x10010, false)); 533 ElfInterfaceFake::FakePushStepData(StepData(0x23102, 0x10020, false)); 534 ElfInterfaceFake::FakePushStepData(StepData(0, 0, true)); 535 536 Unwinder unwinder(64, &maps_, ®s_, process_memory_); 537 unwinder.Unwind(); 538 EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode()); 539 540 ASSERT_EQ(1U, unwinder.NumFrames()); 541 } 542 543 // Verify SP in a device stops the unwind. 544 TEST_F(UnwinderTest, sp_in_device_stops_unwind) { 545 ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame0", 0)); 546 ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame1", 1)); 547 ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame2", 2)); 548 549 regs_.set_pc(0x1000); 550 regs_.set_sp(0x13000); 551 ElfInterfaceFake::FakePushStepData(StepData(0x23002, 0x10010, false)); 552 ElfInterfaceFake::FakePushStepData(StepData(0x23102, 0x10020, false)); 553 ElfInterfaceFake::FakePushStepData(StepData(0, 0, true)); 554 555 Unwinder unwinder(64, &maps_, ®s_, process_memory_); 556 unwinder.Unwind(); 557 EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode()); 558 559 ASSERT_EQ(1U, unwinder.NumFrames()); 560 } 561 562 // Verify a no map info frame gets a frame. 563 TEST_F(UnwinderTest, pc_without_map) { 564 ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame0", 0)); 565 566 regs_.set_pc(0x41000); 567 regs_.set_sp(0x13000); 568 569 Unwinder unwinder(64, &maps_, ®s_, process_memory_); 570 unwinder.Unwind(); 571 EXPECT_EQ(ERROR_INVALID_MAP, unwinder.LastErrorCode()); 572 573 ASSERT_EQ(1U, unwinder.NumFrames()); 574 575 auto* frame = &unwinder.frames()[0]; 576 EXPECT_EQ(0U, frame->num); 577 EXPECT_EQ(0x41000U, frame->rel_pc); 578 EXPECT_EQ(0x41000U, frame->pc); 579 EXPECT_EQ(0x13000U, frame->sp); 580 EXPECT_EQ("", frame->function_name); 581 EXPECT_EQ(0U, frame->function_offset); 582 EXPECT_EQ("", frame->map_name); 583 EXPECT_EQ(0U, frame->map_offset); 584 EXPECT_EQ(0U, frame->map_start); 585 EXPECT_EQ(0U, frame->map_end); 586 EXPECT_EQ(0U, frame->map_load_bias); 587 EXPECT_EQ(0, frame->map_flags); 588 } 589 590 // Verify that a speculative frame is added. 591 TEST_F(UnwinderTest, speculative_frame) { 592 ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame0", 0)); 593 ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame1", 1)); 594 595 // Fake as if code called a nullptr function. 596 regs_.set_pc(0); 597 regs_.set_sp(0x10000); 598 regs_.FakeSetReturnAddress(0x1202); 599 regs_.FakeSetReturnAddressValid(true); 600 601 ElfInterfaceFake::FakePushStepData(StepData(0x23102, 0x10020, false)); 602 ElfInterfaceFake::FakePushStepData(StepData(0, 0, true)); 603 604 Unwinder unwinder(64, &maps_, ®s_, process_memory_); 605 unwinder.Unwind(); 606 EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode()); 607 608 ASSERT_EQ(3U, unwinder.NumFrames()); 609 610 auto* frame = &unwinder.frames()[0]; 611 EXPECT_EQ(0U, frame->num); 612 EXPECT_EQ(0U, frame->rel_pc); 613 EXPECT_EQ(0U, frame->pc); 614 EXPECT_EQ(0x10000U, frame->sp); 615 EXPECT_EQ("", frame->function_name); 616 EXPECT_EQ(0U, frame->function_offset); 617 EXPECT_EQ("", frame->map_name); 618 EXPECT_EQ(0U, frame->map_offset); 619 EXPECT_EQ(0U, frame->map_start); 620 EXPECT_EQ(0U, frame->map_end); 621 EXPECT_EQ(0U, frame->map_load_bias); 622 EXPECT_EQ(0, frame->map_flags); 623 624 frame = &unwinder.frames()[1]; 625 EXPECT_EQ(1U, frame->num); 626 EXPECT_EQ(0x200U, frame->rel_pc); 627 EXPECT_EQ(0x1200U, frame->pc); 628 EXPECT_EQ(0x10000U, frame->sp); 629 EXPECT_EQ("Frame0", frame->function_name); 630 EXPECT_EQ(0U, frame->function_offset); 631 EXPECT_EQ("/system/fake/libc.so", frame->map_name); 632 EXPECT_EQ(0U, frame->map_offset); 633 EXPECT_EQ(0x1000U, frame->map_start); 634 EXPECT_EQ(0x8000U, frame->map_end); 635 EXPECT_EQ(0U, frame->map_load_bias); 636 EXPECT_EQ(PROT_READ | PROT_WRITE, frame->map_flags); 637 638 frame = &unwinder.frames()[2]; 639 EXPECT_EQ(2U, frame->num); 640 EXPECT_EQ(0x100U, frame->rel_pc); 641 EXPECT_EQ(0x23100U, frame->pc); 642 EXPECT_EQ(0x10020U, frame->sp); 643 EXPECT_EQ("Frame1", frame->function_name); 644 EXPECT_EQ(1U, frame->function_offset); 645 EXPECT_EQ("/fake/libanother.so", frame->map_name); 646 EXPECT_EQ(0U, frame->map_offset); 647 EXPECT_EQ(0x23000U, frame->map_start); 648 EXPECT_EQ(0x24000U, frame->map_end); 649 EXPECT_EQ(0U, frame->map_load_bias); 650 EXPECT_EQ(PROT_READ | PROT_WRITE, frame->map_flags); 651 } 652 653 // Verify that a speculative frame is added then removed because no other 654 // frames are added. 655 TEST_F(UnwinderTest, speculative_frame_removed) { 656 ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame0", 0)); 657 ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame1", 1)); 658 659 // Fake as if code called a nullptr function. 660 regs_.set_pc(0); 661 regs_.set_sp(0x10000); 662 regs_.FakeSetReturnAddress(0x1202); 663 regs_.FakeSetReturnAddressValid(true); 664 665 Unwinder unwinder(64, &maps_, ®s_, process_memory_); 666 unwinder.Unwind(); 667 EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode()); 668 669 ASSERT_EQ(1U, unwinder.NumFrames()); 670 671 auto* frame = &unwinder.frames()[0]; 672 EXPECT_EQ(0U, frame->num); 673 EXPECT_EQ(0U, frame->rel_pc); 674 EXPECT_EQ(0U, frame->pc); 675 EXPECT_EQ(0x10000U, frame->sp); 676 EXPECT_EQ("", frame->function_name); 677 EXPECT_EQ(0U, frame->function_offset); 678 EXPECT_EQ("", frame->map_name); 679 EXPECT_EQ(0U, frame->map_offset); 680 EXPECT_EQ(0U, frame->map_start); 681 EXPECT_EQ(0U, frame->map_end); 682 EXPECT_EQ(0U, frame->map_load_bias); 683 EXPECT_EQ(0, frame->map_flags); 684 } 685 686 // Verify that an unwind stops when a frame is in given suffix. 687 TEST_F(UnwinderTest, map_ignore_suffixes) { 688 ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame0", 0)); 689 ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame1", 1)); 690 ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame2", 2)); 691 ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame3", 3)); 692 693 // Fake as if code called a nullptr function. 694 regs_.set_pc(0x1000); 695 regs_.set_sp(0x10000); 696 ElfInterfaceFake::FakePushStepData(StepData(0x43402, 0x10010, false)); 697 ElfInterfaceFake::FakePushStepData(StepData(0x53502, 0x10020, false)); 698 ElfInterfaceFake::FakePushStepData(StepData(0, 0, true)); 699 700 Unwinder unwinder(64, &maps_, ®s_, process_memory_); 701 std::vector<std::string> suffixes{"oat"}; 702 unwinder.Unwind(nullptr, &suffixes); 703 EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode()); 704 705 ASSERT_EQ(2U, unwinder.NumFrames()); 706 // Make sure the elf was not initialized. 707 MapInfo* map_info = maps_.Find(0x53000); 708 ASSERT_TRUE(map_info != nullptr); 709 EXPECT_TRUE(map_info->elf == nullptr); 710 711 auto* frame = &unwinder.frames()[0]; 712 EXPECT_EQ(0U, frame->num); 713 EXPECT_EQ(0U, frame->rel_pc); 714 EXPECT_EQ(0x1000U, frame->pc); 715 EXPECT_EQ(0x10000U, frame->sp); 716 EXPECT_EQ("Frame0", frame->function_name); 717 EXPECT_EQ(0U, frame->function_offset); 718 EXPECT_EQ("/system/fake/libc.so", frame->map_name); 719 EXPECT_EQ(0U, frame->map_offset); 720 EXPECT_EQ(0x1000U, frame->map_start); 721 EXPECT_EQ(0x8000U, frame->map_end); 722 EXPECT_EQ(0U, frame->map_load_bias); 723 EXPECT_EQ(PROT_READ | PROT_WRITE, frame->map_flags); 724 725 frame = &unwinder.frames()[1]; 726 EXPECT_EQ(1U, frame->num); 727 EXPECT_EQ(0x400U, frame->rel_pc); 728 EXPECT_EQ(0x43400U, frame->pc); 729 EXPECT_EQ(0x10010U, frame->sp); 730 EXPECT_EQ("Frame1", frame->function_name); 731 EXPECT_EQ(1U, frame->function_offset); 732 EXPECT_EQ("/fake/fake.apk", frame->map_name); 733 EXPECT_EQ(0x1d000U, frame->map_offset); 734 EXPECT_EQ(0x43000U, frame->map_start); 735 EXPECT_EQ(0x44000U, frame->map_end); 736 EXPECT_EQ(0U, frame->map_load_bias); 737 EXPECT_EQ(PROT_READ | PROT_WRITE, frame->map_flags); 738 } 739 740 // Verify that an unwind stops when the sp and pc don't change. 741 TEST_F(UnwinderTest, sp_pc_do_not_change) { 742 ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame0", 0)); 743 ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame1", 1)); 744 ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame2", 2)); 745 ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame3", 3)); 746 ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame4", 4)); 747 748 regs_.set_pc(0x1000); 749 regs_.set_sp(0x10000); 750 ElfInterfaceFake::FakePushStepData(StepData(0x33402, 0x10010, false)); 751 ElfInterfaceFake::FakePushStepData(StepData(0x33502, 0x10020, false)); 752 ElfInterfaceFake::FakePushStepData(StepData(0x33502, 0x10020, false)); 753 ElfInterfaceFake::FakePushStepData(StepData(0x33502, 0x10020, false)); 754 ElfInterfaceFake::FakePushStepData(StepData(0x33502, 0x10020, false)); 755 ElfInterfaceFake::FakePushStepData(StepData(0, 0, true)); 756 757 Unwinder unwinder(64, &maps_, ®s_, process_memory_); 758 unwinder.Unwind(); 759 EXPECT_EQ(ERROR_REPEATED_FRAME, unwinder.LastErrorCode()); 760 761 ASSERT_EQ(3U, unwinder.NumFrames()); 762 763 auto* frame = &unwinder.frames()[0]; 764 EXPECT_EQ(0U, frame->num); 765 EXPECT_EQ(0U, frame->rel_pc); 766 EXPECT_EQ(0x1000U, frame->pc); 767 EXPECT_EQ(0x10000U, frame->sp); 768 EXPECT_EQ("Frame0", frame->function_name); 769 EXPECT_EQ(0U, frame->function_offset); 770 EXPECT_EQ("/system/fake/libc.so", frame->map_name); 771 EXPECT_EQ(0U, frame->map_offset); 772 EXPECT_EQ(0x1000U, frame->map_start); 773 EXPECT_EQ(0x8000U, frame->map_end); 774 EXPECT_EQ(0U, frame->map_load_bias); 775 EXPECT_EQ(PROT_READ | PROT_WRITE, frame->map_flags); 776 777 frame = &unwinder.frames()[1]; 778 EXPECT_EQ(1U, frame->num); 779 EXPECT_EQ(0x400U, frame->rel_pc); 780 EXPECT_EQ(0x33400U, frame->pc); 781 EXPECT_EQ(0x10010U, frame->sp); 782 EXPECT_EQ("Frame1", frame->function_name); 783 EXPECT_EQ(1U, frame->function_offset); 784 EXPECT_EQ("/fake/compressed.so", frame->map_name); 785 EXPECT_EQ(0U, frame->map_offset); 786 EXPECT_EQ(0x33000U, frame->map_start); 787 EXPECT_EQ(0x34000U, frame->map_end); 788 EXPECT_EQ(0U, frame->map_load_bias); 789 EXPECT_EQ(PROT_READ | PROT_WRITE, frame->map_flags); 790 791 frame = &unwinder.frames()[2]; 792 EXPECT_EQ(2U, frame->num); 793 EXPECT_EQ(0x500U, frame->rel_pc); 794 EXPECT_EQ(0x33500U, frame->pc); 795 EXPECT_EQ(0x10020U, frame->sp); 796 EXPECT_EQ("Frame2", frame->function_name); 797 EXPECT_EQ(2U, frame->function_offset); 798 EXPECT_EQ("/fake/compressed.so", frame->map_name); 799 EXPECT_EQ(0U, frame->map_offset); 800 EXPECT_EQ(0x33000U, frame->map_start); 801 EXPECT_EQ(0x34000U, frame->map_end); 802 EXPECT_EQ(0U, frame->map_load_bias); 803 EXPECT_EQ(PROT_READ | PROT_WRITE, frame->map_flags); 804 } 805 806 TEST_F(UnwinderTest, dex_pc_in_map) { 807 ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame0", 0)); 808 regs_.set_pc(0x1000); 809 regs_.set_sp(0x10000); 810 regs_.FakeSetDexPc(0xa3400); 811 812 Unwinder unwinder(64, &maps_, ®s_, process_memory_); 813 unwinder.Unwind(); 814 EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode()); 815 816 ASSERT_EQ(2U, unwinder.NumFrames()); 817 818 auto* frame = &unwinder.frames()[0]; 819 EXPECT_EQ(0U, frame->num); 820 EXPECT_EQ(0x400U, frame->rel_pc); 821 EXPECT_EQ(0xa3400U, frame->pc); 822 EXPECT_EQ(0x10000U, frame->sp); 823 EXPECT_EQ("", frame->function_name); 824 EXPECT_EQ(0U, frame->function_offset); 825 EXPECT_EQ("/fake/fake.vdex", frame->map_name); 826 EXPECT_EQ(0U, frame->map_offset); 827 EXPECT_EQ(0xa3000U, frame->map_start); 828 EXPECT_EQ(0xa4000U, frame->map_end); 829 EXPECT_EQ(0U, frame->map_load_bias); 830 EXPECT_EQ(PROT_READ | PROT_WRITE | PROT_EXEC, frame->map_flags); 831 832 frame = &unwinder.frames()[1]; 833 EXPECT_EQ(1U, frame->num); 834 EXPECT_EQ(0U, frame->rel_pc); 835 EXPECT_EQ(0x1000U, frame->pc); 836 EXPECT_EQ(0x10000U, frame->sp); 837 EXPECT_EQ("Frame0", frame->function_name); 838 EXPECT_EQ(0U, frame->function_offset); 839 EXPECT_EQ("/system/fake/libc.so", frame->map_name); 840 EXPECT_EQ(0U, frame->map_offset); 841 EXPECT_EQ(0x1000U, frame->map_start); 842 EXPECT_EQ(0x8000U, frame->map_end); 843 EXPECT_EQ(0U, frame->map_load_bias); 844 EXPECT_EQ(PROT_READ | PROT_WRITE, frame->map_flags); 845 } 846 847 TEST_F(UnwinderTest, dex_pc_not_in_map) { 848 ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame0", 0)); 849 regs_.set_pc(0x1000); 850 regs_.set_sp(0x10000); 851 regs_.FakeSetDexPc(0x50000); 852 853 Unwinder unwinder(64, &maps_, ®s_, process_memory_); 854 unwinder.Unwind(); 855 EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode()); 856 857 ASSERT_EQ(2U, unwinder.NumFrames()); 858 859 auto* frame = &unwinder.frames()[0]; 860 EXPECT_EQ(0U, frame->num); 861 EXPECT_EQ(0x50000U, frame->rel_pc); 862 EXPECT_EQ(0x50000U, frame->pc); 863 EXPECT_EQ(0x10000U, frame->sp); 864 EXPECT_EQ("", frame->function_name); 865 EXPECT_EQ(0U, frame->function_offset); 866 EXPECT_EQ("", frame->map_name); 867 EXPECT_EQ(0U, frame->map_offset); 868 EXPECT_EQ(0U, frame->map_start); 869 EXPECT_EQ(0U, frame->map_end); 870 EXPECT_EQ(0U, frame->map_load_bias); 871 EXPECT_EQ(0, frame->map_flags); 872 873 frame = &unwinder.frames()[1]; 874 EXPECT_EQ(1U, frame->num); 875 EXPECT_EQ(0U, frame->rel_pc); 876 EXPECT_EQ(0x1000U, frame->pc); 877 EXPECT_EQ(0x10000U, frame->sp); 878 EXPECT_EQ("Frame0", frame->function_name); 879 EXPECT_EQ(0U, frame->function_offset); 880 EXPECT_EQ("/system/fake/libc.so", frame->map_name); 881 EXPECT_EQ(0U, frame->map_offset); 882 EXPECT_EQ(0x1000U, frame->map_start); 883 EXPECT_EQ(0x8000U, frame->map_end); 884 EXPECT_EQ(0U, frame->map_load_bias); 885 EXPECT_EQ(PROT_READ | PROT_WRITE, frame->map_flags); 886 } 887 888 TEST_F(UnwinderTest, dex_pc_multiple_frames) { 889 ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame0", 0)); 890 ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame1", 1)); 891 regs_.set_pc(0x1000); 892 regs_.set_sp(0x10000); 893 regs_.FakeSetDexPc(0xa3400); 894 ElfInterfaceFake::FakePushStepData(StepData(0x33402, 0x10010, false)); 895 ElfInterfaceFake::FakePushStepData(StepData(0, 0, true)); 896 897 Unwinder unwinder(64, &maps_, ®s_, process_memory_); 898 unwinder.Unwind(); 899 EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode()); 900 901 ASSERT_EQ(3U, unwinder.NumFrames()); 902 903 auto* frame = &unwinder.frames()[0]; 904 EXPECT_EQ(0U, frame->num); 905 EXPECT_EQ(0x400U, frame->rel_pc); 906 EXPECT_EQ(0xa3400U, frame->pc); 907 EXPECT_EQ(0x10000U, frame->sp); 908 EXPECT_EQ("", frame->function_name); 909 EXPECT_EQ(0U, frame->function_offset); 910 EXPECT_EQ("/fake/fake.vdex", frame->map_name); 911 EXPECT_EQ(0U, frame->map_offset); 912 EXPECT_EQ(0xa3000U, frame->map_start); 913 EXPECT_EQ(0xa4000U, frame->map_end); 914 EXPECT_EQ(0U, frame->map_load_bias); 915 EXPECT_EQ(PROT_READ | PROT_WRITE | PROT_EXEC, frame->map_flags); 916 917 frame = &unwinder.frames()[1]; 918 EXPECT_EQ(1U, frame->num); 919 EXPECT_EQ(0U, frame->rel_pc); 920 EXPECT_EQ(0x1000U, frame->pc); 921 EXPECT_EQ(0x10000U, frame->sp); 922 EXPECT_EQ("Frame0", frame->function_name); 923 EXPECT_EQ(0U, frame->function_offset); 924 EXPECT_EQ("/system/fake/libc.so", frame->map_name); 925 EXPECT_EQ(0U, frame->map_offset); 926 EXPECT_EQ(0x1000U, frame->map_start); 927 EXPECT_EQ(0x8000U, frame->map_end); 928 EXPECT_EQ(0U, frame->map_load_bias); 929 EXPECT_EQ(PROT_READ | PROT_WRITE, frame->map_flags); 930 931 frame = &unwinder.frames()[2]; 932 EXPECT_EQ(2U, frame->num); 933 EXPECT_EQ(0x400U, frame->rel_pc); 934 EXPECT_EQ(0x33400U, frame->pc); 935 EXPECT_EQ(0x10010U, frame->sp); 936 EXPECT_EQ("Frame1", frame->function_name); 937 EXPECT_EQ(1U, frame->function_offset); 938 EXPECT_EQ("/fake/compressed.so", frame->map_name); 939 EXPECT_EQ(0U, frame->map_offset); 940 EXPECT_EQ(0x33000U, frame->map_start); 941 EXPECT_EQ(0x34000U, frame->map_end); 942 EXPECT_EQ(0U, frame->map_load_bias); 943 EXPECT_EQ(PROT_READ | PROT_WRITE, frame->map_flags); 944 } 945 946 // Verify format frame code. 947 TEST_F(UnwinderTest, format_frame_static) { 948 FrameData frame; 949 frame.num = 1; 950 frame.rel_pc = 0x1000; 951 frame.pc = 0x4000; 952 frame.sp = 0x1000; 953 frame.function_name = "function"; 954 frame.function_offset = 100; 955 frame.map_name = "/fake/libfake.so"; 956 frame.map_offset = 0x2000; 957 frame.map_start = 0x3000; 958 frame.map_end = 0x6000; 959 frame.map_flags = PROT_READ; 960 961 EXPECT_EQ(" #01 pc 0000000000001000 (offset 0x2000) /fake/libfake.so (function+100)", 962 Unwinder::FormatFrame(frame, false)); 963 EXPECT_EQ(" #01 pc 00001000 (offset 0x2000) /fake/libfake.so (function+100)", 964 Unwinder::FormatFrame(frame, true)); 965 966 frame.map_offset = 0; 967 EXPECT_EQ(" #01 pc 0000000000001000 /fake/libfake.so (function+100)", 968 Unwinder::FormatFrame(frame, false)); 969 EXPECT_EQ(" #01 pc 00001000 /fake/libfake.so (function+100)", 970 Unwinder::FormatFrame(frame, true)); 971 972 frame.function_offset = 0; 973 EXPECT_EQ(" #01 pc 0000000000001000 /fake/libfake.so (function)", 974 Unwinder::FormatFrame(frame, false)); 975 EXPECT_EQ(" #01 pc 00001000 /fake/libfake.so (function)", Unwinder::FormatFrame(frame, true)); 976 977 frame.function_name = ""; 978 EXPECT_EQ(" #01 pc 0000000000001000 /fake/libfake.so", Unwinder::FormatFrame(frame, false)); 979 EXPECT_EQ(" #01 pc 00001000 /fake/libfake.so", Unwinder::FormatFrame(frame, true)); 980 981 frame.map_name = ""; 982 EXPECT_EQ(" #01 pc 0000000000001000 <anonymous:3000>", Unwinder::FormatFrame(frame, false)); 983 EXPECT_EQ(" #01 pc 00001000 <anonymous:3000>", Unwinder::FormatFrame(frame, true)); 984 985 frame.map_start = 0; 986 frame.map_end = 0; 987 EXPECT_EQ(" #01 pc 0000000000001000 <unknown>", Unwinder::FormatFrame(frame, false)); 988 EXPECT_EQ(" #01 pc 00001000 <unknown>", Unwinder::FormatFrame(frame, true)); 989 } 990 991 static std::string ArchToString(ArchEnum arch) { 992 if (arch == ARCH_ARM) { 993 return "Arm"; 994 } else if (arch == ARCH_ARM64) { 995 return "Arm64"; 996 } else if (arch == ARCH_X86) { 997 return "X86"; 998 } else if (arch == ARCH_X86_64) { 999 return "X86_64"; 1000 } else { 1001 return "Unknown"; 1002 } 1003 } 1004 1005 // Verify format frame code. 1006 TEST_F(UnwinderTest, format_frame) { 1007 std::vector<Regs*> reg_list; 1008 RegsArm* arm = new RegsArm; 1009 arm->set_pc(0x2300); 1010 arm->set_sp(0x10000); 1011 reg_list.push_back(arm); 1012 1013 RegsArm64* arm64 = new RegsArm64; 1014 arm64->set_pc(0x2300); 1015 arm64->set_sp(0x10000); 1016 reg_list.push_back(arm64); 1017 1018 RegsX86* x86 = new RegsX86; 1019 x86->set_pc(0x2300); 1020 x86->set_sp(0x10000); 1021 reg_list.push_back(x86); 1022 1023 RegsX86_64* x86_64 = new RegsX86_64; 1024 x86_64->set_pc(0x2300); 1025 x86_64->set_sp(0x10000); 1026 reg_list.push_back(x86_64); 1027 1028 RegsMips* mips = new RegsMips; 1029 mips->set_pc(0x2300); 1030 mips->set_sp(0x10000); 1031 reg_list.push_back(mips); 1032 1033 RegsMips64* mips64 = new RegsMips64; 1034 mips64->set_pc(0x2300); 1035 mips64->set_sp(0x10000); 1036 reg_list.push_back(mips64); 1037 1038 for (auto regs : reg_list) { 1039 ElfInterfaceFake::FakePushFunctionData(FunctionData("Frame0", 10)); 1040 1041 Unwinder unwinder(64, &maps_, regs, process_memory_); 1042 unwinder.Unwind(); 1043 1044 ASSERT_EQ(1U, unwinder.NumFrames()); 1045 std::string expected; 1046 switch (regs->Arch()) { 1047 case ARCH_ARM: 1048 case ARCH_X86: 1049 case ARCH_MIPS: 1050 expected = " #00 pc 00001300 /system/fake/libc.so (Frame0+10)"; 1051 break; 1052 case ARCH_ARM64: 1053 case ARCH_X86_64: 1054 case ARCH_MIPS64: 1055 expected = " #00 pc 0000000000001300 /system/fake/libc.so (Frame0+10)"; 1056 break; 1057 default: 1058 expected = ""; 1059 } 1060 EXPECT_EQ(expected, unwinder.FormatFrame(0)) 1061 << "Mismatch of frame format for regs arch " << ArchToString(regs->Arch()); 1062 delete regs; 1063 } 1064 } 1065 1066 } // namespace unwindstack 1067