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

Commit d8f93cdd 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

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

Change-Id: Ibd627acfa8781256a00504e51b3881ba83fe75d4
parents ef7a045d e694f34b
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());