Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3caf1413 authored by Christopher Ferris's avatar Christopher Ferris Committed by Automerger Merge Worker
Browse files

Merge "Set warning for dex pc not in map." am: 278f11b5 am: e694f34b am: d8f93cdd

Original change: https://android-review.googlesource.com/c/platform/system/core/+/1396068

Change-Id: I9a60e5579c6760f748b82d2b4c82eb521623bc6c
parents 77ce15e1 d8f93cdd
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -75,7 +75,7 @@ void Unwinder::FillInDexFrame() {
    frame->rel_pc = dex_pc - info->start;
  } else {
    frame->rel_pc = dex_pc;
    return;
    warnings_ |= WARNING_DEX_PC_NOT_IN_MAP;
  }

  if (!resolve_names_) {
@@ -142,6 +142,7 @@ static bool ShouldStop(const std::vector<std::string>* map_suffixes_to_ignore,
void Unwinder::Unwind(const std::vector<std::string>* initial_map_names_to_skip,
                      const std::vector<std::string>* map_suffixes_to_ignore) {
  frames_.clear();
  warnings_ = WARNING_NONE;
  last_error_.code = ERROR_NONE;
  last_error_.address = 0;
  elf_from_memory_not_file_ = false;
+7 −0
Original line number Diff line number Diff line
@@ -21,6 +21,13 @@

namespace unwindstack {

// A bit map of warnings, multiple warnings can be set at the same time.
enum WarningCode : uint64_t {
  WARNING_NONE = 0,
  WARNING_DEX_PC_NOT_IN_MAP = 0x1,  // A dex pc was found, but it doesn't exist
                                    // in any valid map.
};

enum ErrorCode : uint8_t {
  ERROR_NONE,                 // No error.
  ERROR_MEMORY_INVALID,       // Memory read failed.
+2 −0
Original line number Diff line number Diff line
@@ -113,6 +113,7 @@ class Unwinder {

  ErrorCode LastErrorCode() { return last_error_.code; }
  uint64_t LastErrorAddress() { return last_error_.address; }
  uint64_t warnings() { return warnings_; }

  // Builds a frame for symbolization using the maps from this unwinder. The
  // constructed frame contains just enough information to be used to symbolize
@@ -141,6 +142,7 @@ class Unwinder {
  // file. This is only true if there is an actual file backing up the elf.
  bool elf_from_memory_not_file_ = false;
  ErrorData last_error_;
  uint64_t warnings_;
};

class UnwinderFromPid : public Unwinder {
+28 −0
Original line number Diff line number Diff line
@@ -168,6 +168,7 @@ TEST_F(UnwinderTest, multiple_frames) {
  Unwinder unwinder(64, maps_.get(), &regs_, process_memory_);
  unwinder.Unwind();
  EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode());
  EXPECT_EQ(WARNING_NONE, unwinder.warnings());
  EXPECT_FALSE(unwinder.elf_from_memory_not_file());

  ASSERT_EQ(3U, unwinder.NumFrames());
@@ -233,6 +234,7 @@ TEST_F(UnwinderTest, multiple_frames_dont_resolve_names) {
  unwinder.SetResolveNames(false);
  unwinder.Unwind();
  EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode());
  EXPECT_EQ(WARNING_NONE, unwinder.warnings());
  EXPECT_FALSE(unwinder.elf_from_memory_not_file());

  ASSERT_EQ(3U, unwinder.NumFrames());
@@ -293,6 +295,7 @@ TEST_F(UnwinderTest, non_zero_load_bias) {
  Unwinder unwinder(64, maps_.get(), &regs_, process_memory_);
  unwinder.Unwind();
  EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode());
  EXPECT_EQ(WARNING_NONE, unwinder.warnings());
  EXPECT_FALSE(unwinder.elf_from_memory_not_file());

  ASSERT_EQ(1U, unwinder.NumFrames());
@@ -323,6 +326,7 @@ TEST_F(UnwinderTest, non_zero_elf_offset) {
  Unwinder unwinder(64, maps_.get(), &regs_, process_memory_);
  unwinder.Unwind();
  EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode());
  EXPECT_EQ(WARNING_NONE, unwinder.warnings());
  EXPECT_FALSE(unwinder.elf_from_memory_not_file());

  ASSERT_EQ(1U, unwinder.NumFrames());
@@ -353,6 +357,7 @@ TEST_F(UnwinderTest, non_zero_map_offset) {
  Unwinder unwinder(64, maps_.get(), &regs_, process_memory_);
  unwinder.Unwind();
  EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode());
  EXPECT_EQ(WARNING_NONE, unwinder.warnings());
  EXPECT_FALSE(unwinder.elf_from_memory_not_file());

  ASSERT_EQ(1U, unwinder.NumFrames());
@@ -384,6 +389,7 @@ TEST_F(UnwinderTest, disable_embedded_soname) {
  unwinder.SetEmbeddedSoname(false);
  unwinder.Unwind();
  EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode());
  EXPECT_EQ(WARNING_NONE, unwinder.warnings());
  EXPECT_FALSE(unwinder.elf_from_memory_not_file());

  ASSERT_EQ(1U, unwinder.NumFrames());
@@ -421,6 +427,7 @@ TEST_F(UnwinderTest, no_frames_after_finished) {
  Unwinder unwinder(64, maps_.get(), &regs_, process_memory_);
  unwinder.Unwind();
  EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode());
  EXPECT_EQ(WARNING_NONE, unwinder.warnings());
  EXPECT_FALSE(unwinder.elf_from_memory_not_file());

  ASSERT_EQ(1U, unwinder.NumFrames());
@@ -454,6 +461,7 @@ TEST_F(UnwinderTest, max_frames) {
  Unwinder unwinder(20, maps_.get(), &regs_, process_memory_);
  unwinder.Unwind();
  EXPECT_EQ(ERROR_MAX_FRAMES_EXCEEDED, unwinder.LastErrorCode());
  EXPECT_EQ(WARNING_NONE, unwinder.warnings());
  EXPECT_FALSE(unwinder.elf_from_memory_not_file());

  ASSERT_EQ(20U, unwinder.NumFrames());
@@ -497,6 +505,7 @@ TEST_F(UnwinderTest, verify_frames_skipped) {
  std::vector<std::string> skip_libs{"libunwind.so", "libanother.so"};
  unwinder.Unwind(&skip_libs);
  EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode());
  EXPECT_EQ(WARNING_NONE, unwinder.warnings());
  EXPECT_FALSE(unwinder.elf_from_memory_not_file());

  ASSERT_EQ(3U, unwinder.NumFrames());
@@ -559,6 +568,7 @@ TEST_F(UnwinderTest, sp_not_in_map) {
  Unwinder unwinder(64, maps_.get(), &regs_, process_memory_);
  unwinder.Unwind();
  EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode());
  EXPECT_EQ(WARNING_NONE, unwinder.warnings());
  EXPECT_FALSE(unwinder.elf_from_memory_not_file());

  ASSERT_EQ(2U, unwinder.NumFrames());
@@ -607,6 +617,7 @@ TEST_F(UnwinderTest, pc_in_device_stops_unwind) {
  Unwinder unwinder(64, maps_.get(), &regs_, process_memory_);
  unwinder.Unwind();
  EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode());
  EXPECT_EQ(WARNING_NONE, unwinder.warnings());
  EXPECT_FALSE(unwinder.elf_from_memory_not_file());

  ASSERT_EQ(1U, unwinder.NumFrames());
@@ -627,6 +638,7 @@ TEST_F(UnwinderTest, sp_in_device_stops_unwind) {
  Unwinder unwinder(64, maps_.get(), &regs_, process_memory_);
  unwinder.Unwind();
  EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode());
  EXPECT_EQ(WARNING_NONE, unwinder.warnings());
  EXPECT_FALSE(unwinder.elf_from_memory_not_file());

  ASSERT_EQ(1U, unwinder.NumFrames());
@@ -642,6 +654,7 @@ TEST_F(UnwinderTest, pc_without_map) {
  Unwinder unwinder(64, maps_.get(), &regs_, process_memory_);
  unwinder.Unwind();
  EXPECT_EQ(ERROR_INVALID_MAP, unwinder.LastErrorCode());
  EXPECT_EQ(WARNING_NONE, unwinder.warnings());
  EXPECT_FALSE(unwinder.elf_from_memory_not_file());

  ASSERT_EQ(1U, unwinder.NumFrames());
@@ -679,6 +692,7 @@ TEST_F(UnwinderTest, speculative_frame) {
  Unwinder unwinder(64, maps_.get(), &regs_, process_memory_);
  unwinder.Unwind();
  EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode());
  EXPECT_EQ(WARNING_NONE, unwinder.warnings());
  EXPECT_FALSE(unwinder.elf_from_memory_not_file());

  ASSERT_EQ(3U, unwinder.NumFrames());
@@ -745,6 +759,7 @@ TEST_F(UnwinderTest, speculative_frame_removed) {
  Unwinder unwinder(64, maps_.get(), &regs_, process_memory_);
  unwinder.Unwind();
  EXPECT_EQ(ERROR_INVALID_MAP, unwinder.LastErrorCode());
  EXPECT_EQ(WARNING_NONE, unwinder.warnings());
  EXPECT_FALSE(unwinder.elf_from_memory_not_file());

  ASSERT_EQ(2U, unwinder.NumFrames());
@@ -795,6 +810,7 @@ TEST_F(UnwinderTest, speculative_frame_not_removed_pc_bad) {
  Unwinder unwinder(64, maps_.get(), &regs_, process_memory_);
  unwinder.Unwind();
  EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode());
  EXPECT_EQ(WARNING_NONE, unwinder.warnings());
  EXPECT_FALSE(unwinder.elf_from_memory_not_file());

  ASSERT_EQ(2U, unwinder.NumFrames());
@@ -843,6 +859,7 @@ TEST_F(UnwinderTest, speculative_frame_check_with_no_frames) {
  std::vector<std::string> skip_names{"libanother.so"};
  unwinder.Unwind(&skip_names);
  EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode());
  EXPECT_EQ(WARNING_NONE, unwinder.warnings());
  EXPECT_FALSE(unwinder.elf_from_memory_not_file());

  ASSERT_EQ(0U, unwinder.NumFrames());
@@ -866,6 +883,7 @@ TEST_F(UnwinderTest, map_ignore_suffixes) {
  std::vector<std::string> suffixes{"oat"};
  unwinder.Unwind(nullptr, &suffixes);
  EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode());
  EXPECT_EQ(WARNING_NONE, unwinder.warnings());
  EXPECT_FALSE(unwinder.elf_from_memory_not_file());

  ASSERT_EQ(2U, unwinder.NumFrames());
@@ -925,6 +943,7 @@ TEST_F(UnwinderTest, sp_pc_do_not_change) {
  Unwinder unwinder(64, maps_.get(), &regs_, process_memory_);
  unwinder.Unwind();
  EXPECT_EQ(ERROR_REPEATED_FRAME, unwinder.LastErrorCode());
  EXPECT_EQ(WARNING_NONE, unwinder.warnings());
  EXPECT_FALSE(unwinder.elf_from_memory_not_file());

  ASSERT_EQ(3U, unwinder.NumFrames());
@@ -984,6 +1003,7 @@ TEST_F(UnwinderTest, dex_pc_in_map) {
  Unwinder unwinder(64, maps_.get(), &regs_, process_memory_);
  unwinder.Unwind();
  EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode());
  EXPECT_EQ(WARNING_NONE, unwinder.warnings());
  EXPECT_FALSE(unwinder.elf_from_memory_not_file());

  ASSERT_EQ(2U, unwinder.NumFrames());
@@ -1028,6 +1048,7 @@ TEST_F(UnwinderTest, dex_pc_in_map_non_zero_offset) {
  Unwinder unwinder(64, maps_.get(), &regs_, process_memory_);
  unwinder.Unwind();
  EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode());
  EXPECT_EQ(WARNING_NONE, unwinder.warnings());
  EXPECT_FALSE(unwinder.elf_from_memory_not_file());

  ASSERT_EQ(2U, unwinder.NumFrames());
@@ -1072,6 +1093,7 @@ TEST_F(UnwinderTest, dex_pc_not_in_map) {
  Unwinder unwinder(64, maps_.get(), &regs_, process_memory_);
  unwinder.Unwind();
  EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode());
  EXPECT_EQ(WARNING_DEX_PC_NOT_IN_MAP, unwinder.warnings());
  EXPECT_FALSE(unwinder.elf_from_memory_not_file());

  ASSERT_EQ(2U, unwinder.NumFrames());
@@ -1119,6 +1141,7 @@ TEST_F(UnwinderTest, dex_pc_multiple_frames) {
  Unwinder unwinder(64, maps_.get(), &regs_, process_memory_);
  unwinder.Unwind();
  EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode());
  EXPECT_EQ(WARNING_NONE, unwinder.warnings());
  EXPECT_FALSE(unwinder.elf_from_memory_not_file());

  ASSERT_EQ(3U, unwinder.NumFrames());
@@ -1178,6 +1201,7 @@ TEST_F(UnwinderTest, dex_pc_max_frames) {
  Unwinder unwinder(1, maps_.get(), &regs_, process_memory_);
  unwinder.Unwind();
  EXPECT_EQ(ERROR_MAX_FRAMES_EXCEEDED, unwinder.LastErrorCode());
  EXPECT_EQ(WARNING_NONE, unwinder.warnings());
  EXPECT_FALSE(unwinder.elf_from_memory_not_file());

  ASSERT_EQ(1U, unwinder.NumFrames());
@@ -1208,6 +1232,7 @@ TEST_F(UnwinderTest, elf_from_memory_not_file) {
  Unwinder unwinder(64, maps_.get(), &regs_, process_memory_);
  unwinder.Unwind();
  EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode());
  EXPECT_EQ(WARNING_NONE, unwinder.warnings());
  EXPECT_TRUE(unwinder.elf_from_memory_not_file());

  ASSERT_EQ(1U, unwinder.NumFrames());
@@ -1238,6 +1263,7 @@ TEST_F(UnwinderTest, elf_from_memory_but_no_valid_file_with_bracket) {
  Unwinder unwinder(64, maps_.get(), &regs_, process_memory_);
  unwinder.Unwind();
  EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode());
  EXPECT_EQ(WARNING_NONE, unwinder.warnings());
  EXPECT_FALSE(unwinder.elf_from_memory_not_file());

  ASSERT_EQ(1U, unwinder.NumFrames());
@@ -1268,6 +1294,7 @@ TEST_F(UnwinderTest, elf_from_memory_but_empty_filename) {
  Unwinder unwinder(64, maps_.get(), &regs_, process_memory_);
  unwinder.Unwind();
  EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode());
  EXPECT_EQ(WARNING_NONE, unwinder.warnings());
  EXPECT_FALSE(unwinder.elf_from_memory_not_file());

  ASSERT_EQ(1U, unwinder.NumFrames());
@@ -1298,6 +1325,7 @@ TEST_F(UnwinderTest, elf_from_memory_but_from_memfd) {
  Unwinder unwinder(64, maps_.get(), &regs_, process_memory_);
  unwinder.Unwind();
  EXPECT_EQ(ERROR_NONE, unwinder.LastErrorCode());
  EXPECT_EQ(WARNING_NONE, unwinder.warnings());
  EXPECT_FALSE(unwinder.elf_from_memory_not_file());

  ASSERT_EQ(1U, unwinder.NumFrames());