Merge changes I4b017701,I28aff510 am: 3e378800b8

am: d3e2121d8a

Change-Id: I8abdadeab10f232c41250163fb109bd3ca005569
This commit is contained in:
Josh Gao 2018-04-20 21:07:51 -07:00 committed by android-build-merger
commit 15045aa79f
16 changed files with 80 additions and 1 deletions

View File

@ -422,8 +422,10 @@ static bool dump_thread(log_t* log, BacktraceMap* map, Memory* process_memory,
dump_registers(log, thread_info.registers.get());
// Unwind will mutate the registers, so make a copy first.
std::unique_ptr<Regs> regs_copy(thread_info.registers->Clone());
std::vector<backtrace_frame_data_t> frames;
if (!Backtrace::Unwind(thread_info.registers.get(), map, &frames, 0, nullptr)) {
if (!Backtrace::Unwind(regs_copy.get(), map, &frames, 0, nullptr)) {
_LOG(log, logtype::THREAD, "Failed to unwind");
return false;
}

View File

@ -197,4 +197,8 @@ bool RegsArm::StepIfSignalHandler(uint64_t rel_pc, Elf* elf, Memory* process_mem
return true;
}
Regs* RegsArm::Clone() {
return new RegsArm(*this);
}
} // namespace unwindstack

View File

@ -148,4 +148,8 @@ bool RegsArm64::StepIfSignalHandler(uint64_t rel_pc, Elf* elf, Memory* process_m
return true;
}
Regs* RegsArm64::Clone() {
return new RegsArm64(*this);
}
} // namespace unwindstack

View File

@ -173,4 +173,8 @@ bool RegsMips::StepIfSignalHandler(uint64_t rel_pc, Elf* elf, Memory* process_me
return true;
}
Regs* RegsMips::Clone() {
return new RegsMips(*this);
}
} // namespace unwindstack

View File

@ -160,4 +160,8 @@ bool RegsMips64::StepIfSignalHandler(uint64_t rel_pc, Elf* elf, Memory* process_
return true;
}
Regs* RegsMips64::Clone() {
return new RegsMips64(*this);
}
} // namespace unwindstack

View File

@ -179,4 +179,8 @@ bool RegsX86::StepIfSignalHandler(uint64_t rel_pc, Elf* elf, Memory* process_mem
return false;
}
Regs* RegsX86::Clone() {
return new RegsX86(*this);
}
} // namespace unwindstack

View File

@ -168,4 +168,8 @@ bool RegsX86_64::StepIfSignalHandler(uint64_t rel_pc, Elf* elf, Memory* process_
return true;
}
Regs* RegsX86_64::Clone() {
return new RegsX86_64(*this);
}
} // namespace unwindstack

View File

@ -73,6 +73,8 @@ class Regs {
uint16_t total_regs() { return total_regs_; }
virtual Regs* Clone() = 0;
static ArchEnum CurrentArch();
static Regs* RemoteGet(pid_t pid);
static Regs* CreateFromUcontext(ArchEnum arch, void* ucontext);

View File

@ -50,6 +50,8 @@ class RegsArm : public RegsImpl<uint32_t> {
void set_pc(uint64_t pc) override;
void set_sp(uint64_t sp) override;
Regs* Clone() override final;
static Regs* Read(void* data);
static Regs* CreateFromUcontext(void* ucontext);

View File

@ -50,6 +50,8 @@ class RegsArm64 : public RegsImpl<uint64_t> {
void set_pc(uint64_t pc) override;
void set_sp(uint64_t sp) override;
Regs* Clone() override final;
static Regs* Read(void* data);
static Regs* CreateFromUcontext(void* ucontext);

View File

@ -50,6 +50,8 @@ class RegsMips : public RegsImpl<uint32_t> {
void set_pc(uint64_t pc) override;
void set_sp(uint64_t sp) override;
Regs* Clone() override final;
static Regs* Read(void* data);
static Regs* CreateFromUcontext(void* ucontext);

View File

@ -50,6 +50,8 @@ class RegsMips64 : public RegsImpl<uint64_t> {
void set_pc(uint64_t pc) override;
void set_sp(uint64_t sp) override;
Regs* Clone() override final;
static Regs* Read(void* data);
static Regs* CreateFromUcontext(void* ucontext);

View File

@ -53,6 +53,8 @@ class RegsX86 : public RegsImpl<uint32_t> {
void set_pc(uint64_t pc) override;
void set_sp(uint64_t sp) override;
Regs* Clone() override final;
static Regs* Read(void* data);
static Regs* CreateFromUcontext(void* ucontext);

View File

@ -53,6 +53,8 @@ class RegsX86_64 : public RegsImpl<uint64_t> {
void set_pc(uint64_t pc) override;
void set_sp(uint64_t sp) override;
Regs* Clone() override final;
static Regs* Read(void* data);
static Regs* CreateFromUcontext(void* ucontext);

View File

@ -58,6 +58,8 @@ class RegsFake : public Regs {
void FakeSetReturnAddress(uint64_t return_address) { fake_return_address_ = return_address; }
void FakeSetReturnAddressValid(bool valid) { fake_return_address_valid_ = valid; }
Regs* Clone() override { return nullptr; }
private:
ArchEnum fake_arch_ = ARCH_UNKNOWN;
uint64_t fake_pc_ = 0;
@ -83,6 +85,8 @@ class RegsImplFake : public RegsImpl<TypeParam> {
bool SetPcFromReturnAddress(Memory*) override { return false; }
bool StepIfSignalHandler(uint64_t, Elf*, Memory*) override { return false; }
Regs* Clone() override { return nullptr; }
private:
uint64_t fake_pc_ = 0;
uint64_t fake_sp_ = 0;

View File

@ -286,4 +286,39 @@ TEST_F(RegsTest, machine_type) {
EXPECT_EQ(ARCH_MIPS64, mips64_regs.Arch());
}
template <typename RegisterType>
void clone_test(Regs* regs) {
RegisterType* register_values = reinterpret_cast<RegisterType*>(regs->RawData());
int num_regs = regs->total_regs();
for (int i = 0; i < num_regs; ++i) {
register_values[i] = i;
}
std::unique_ptr<Regs> clone(regs->Clone());
ASSERT_EQ(regs->total_regs(), clone->total_regs());
RegisterType* clone_values = reinterpret_cast<RegisterType*>(clone->RawData());
for (int i = 0; i < num_regs; ++i) {
EXPECT_EQ(register_values[i], clone_values[i]);
EXPECT_NE(&register_values[i], &clone_values[i]);
}
}
TEST_F(RegsTest, clone) {
std::vector<std::unique_ptr<Regs>> regs;
regs.emplace_back(new RegsArm());
regs.emplace_back(new RegsArm64());
regs.emplace_back(new RegsX86());
regs.emplace_back(new RegsX86_64());
regs.emplace_back(new RegsMips());
regs.emplace_back(new RegsMips64());
for (auto& r : regs) {
if (r->Is32Bit()) {
clone_test<uint32_t>(r.get());
} else {
clone_test<uint64_t>(r.get());
}
}
}
} // namespace unwindstack