Refactor dump_memory function.
- Add dumping memory around registers for x86/x86_64.
- Add unit tests for new dump_memory function.
- Cleanup all of the machine.cpp files.
- Increase the high address check for 32 bit, and decrease the high
address allowed for 64 bit slightly to match mips64.
Bug: 21206576
Change-Id: I6f75141f3282db48b10f7c695a1cf2eb75a08351
diff --git a/debuggerd/arm64/machine.cpp b/debuggerd/arm64/machine.cpp
index 8b17d53..2e097da 100644
--- a/debuggerd/arm64/machine.cpp
+++ b/debuggerd/arm64/machine.cpp
@@ -17,50 +17,37 @@
#include <elf.h>
#include <errno.h>
-#include <inttypes.h>
+#include <stdint.h>
#include <string.h>
-#include <sys/types.h>
#include <sys/ptrace.h>
-#include <sys/user.h>
#include <sys/uio.h>
-#include "../utility.h"
-#include "../machine.h"
+#include <backtrace/Backtrace.h>
-void dump_memory_and_code(log_t* log, pid_t tid) {
- struct user_pt_regs regs;
- struct iovec io;
- io.iov_base = ®s;
- io.iov_len = sizeof(regs);
+#include "machine.h"
+#include "utility.h"
- if (ptrace(PTRACE_GETREGSET, tid, (void*)NT_PRSTATUS, &io) == -1) {
- _LOG(log, logtype::ERROR, "%s: ptrace failed to get registers: %s\n",
- __func__, strerror(errno));
- return;
- }
+void dump_memory_and_code(log_t* log, Backtrace* backtrace) {
+ struct user_pt_regs regs;
+ struct iovec io;
+ io.iov_base = ®s;
+ io.iov_len = sizeof(regs);
- for (int reg = 0; reg < 31; reg++) {
- uintptr_t addr = regs.regs[reg];
+ if (ptrace(PTRACE_GETREGSET, backtrace->Tid(), reinterpret_cast<void*>(NT_PRSTATUS), &io) == -1) {
+ _LOG(log, logtype::ERROR, "%s: ptrace failed to get registers: %s",
+ __func__, strerror(errno));
+ return;
+ }
- /*
- * Don't bother if it looks like a small int or ~= null, or if
- * it's in the kernel area.
- */
- if (addr < 4096 || addr >= (1UL<<63)) {
- continue;
- }
+ for (int reg = 0; reg < 31; reg++) {
+ dump_memory(log, backtrace, regs.regs[reg], "memory near x%d:", reg);
+ }
- _LOG(log, logtype::MEMORY, "\nmemory near x%d:\n", reg);
- dump_memory(log, tid, addr);
- }
+ dump_memory(log, backtrace, static_cast<uintptr_t>(regs.pc), "code around pc:");
- _LOG(log, logtype::MEMORY, "\ncode around pc:\n");
- dump_memory(log, tid, (uintptr_t)regs.pc);
-
- if (regs.pc != regs.sp) {
- _LOG(log, logtype::MEMORY, "\ncode around sp:\n");
- dump_memory(log, tid, (uintptr_t)regs.sp);
- }
+ if (regs.pc != regs.sp) {
+ dump_memory(log, backtrace, static_cast<uintptr_t>(regs.sp), "code around sp:");
+ }
}
void dump_registers(log_t* log, pid_t tid) {