Merge "Set warning for dex pc not in map." am: 278f11b574
Original change: https://android-review.googlesource.com/c/platform/system/core/+/1396068 Change-Id: I6fa6270c8cafce8b8e03e1b8f8de6e9e61999bca
This commit is contained in:
commit
e694f34b3c
4 changed files with 39 additions and 1 deletions
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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.
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -168,6 +168,7 @@ TEST_F(UnwinderTest, multiple_frames) {
|
|||
Unwinder unwinder(64, maps_.get(), ®s_, 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(), ®s_, 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(), ®s_, 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(), ®s_, 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(), ®s_, 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(), ®s_, 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(), ®s_, 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(), ®s_, 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(), ®s_, 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(), ®s_, 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(), ®s_, 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(), ®s_, 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(), ®s_, 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(), ®s_, 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(), ®s_, 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(), ®s_, 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(), ®s_, 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(), ®s_, 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(), ®s_, 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(), ®s_, 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(), ®s_, 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(), ®s_, 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(), ®s_, 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());
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue