1c6c194ced095df5e777b8fa24527ebd29c8fef54Pavel Chupin/*
2c6c194ced095df5e777b8fa24527ebd29c8fef54Pavel Chupin** Copyright 2013, The Android Open Source Project
3c6c194ced095df5e777b8fa24527ebd29c8fef54Pavel Chupin**
4c6c194ced095df5e777b8fa24527ebd29c8fef54Pavel Chupin** Licensed under the Apache License, Version 2.0 (the "License");
5c6c194ced095df5e777b8fa24527ebd29c8fef54Pavel Chupin** you may not use this file except in compliance with the License.
6c6c194ced095df5e777b8fa24527ebd29c8fef54Pavel Chupin** You may obtain a copy of the License at
7c6c194ced095df5e777b8fa24527ebd29c8fef54Pavel Chupin**
8c6c194ced095df5e777b8fa24527ebd29c8fef54Pavel Chupin**     http://www.apache.org/licenses/LICENSE-2.0
9c6c194ced095df5e777b8fa24527ebd29c8fef54Pavel Chupin**
10c6c194ced095df5e777b8fa24527ebd29c8fef54Pavel Chupin** Unless required by applicable law or agreed to in writing, software
11c6c194ced095df5e777b8fa24527ebd29c8fef54Pavel Chupin** distributed under the License is distributed on an "AS IS" BASIS,
12c6c194ced095df5e777b8fa24527ebd29c8fef54Pavel Chupin** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c6c194ced095df5e777b8fa24527ebd29c8fef54Pavel Chupin** See the License for the specific language governing permissions and
14c6c194ced095df5e777b8fa24527ebd29c8fef54Pavel Chupin** limitations under the License.
15c6c194ced095df5e777b8fa24527ebd29c8fef54Pavel Chupin*/
16c6c194ced095df5e777b8fa24527ebd29c8fef54Pavel Chupin
17b36b5923386be8d74da2767dfc1dc62a0012a655Christopher Ferris#define LOG_TAG "DEBUG"
18b36b5923386be8d74da2767dfc1dc62a0012a655Christopher Ferris
19c6c194ced095df5e777b8fa24527ebd29c8fef54Pavel Chupin#include <errno.h>
20e8bc77eb845ab5557a4c98fe0da604d4a3740befChristopher Ferris#include <stdint.h>
21c6c194ced095df5e777b8fa24527ebd29c8fef54Pavel Chupin#include <sys/ptrace.h>
22e8bc77eb845ab5557a4c98fe0da604d4a3740befChristopher Ferris#include <string.h>
23c6c194ced095df5e777b8fa24527ebd29c8fef54Pavel Chupin#include <sys/user.h>
24c6c194ced095df5e777b8fa24527ebd29c8fef54Pavel Chupin
25e8bc77eb845ab5557a4c98fe0da604d4a3740befChristopher Ferris#include <backtrace/Backtrace.h>
26b36b5923386be8d74da2767dfc1dc62a0012a655Christopher Ferris#include <log/log.h>
27e8bc77eb845ab5557a4c98fe0da604d4a3740befChristopher Ferris
28e8bc77eb845ab5557a4c98fe0da604d4a3740befChristopher Ferris#include "machine.h"
29e8bc77eb845ab5557a4c98fe0da604d4a3740befChristopher Ferris#include "utility.h"
30c6c194ced095df5e777b8fa24527ebd29c8fef54Pavel Chupin
31e8bc77eb845ab5557a4c98fe0da604d4a3740befChristopher Ferrisvoid dump_memory_and_code(log_t* log, Backtrace* backtrace) {
32e8bc77eb845ab5557a4c98fe0da604d4a3740befChristopher Ferris  struct user_regs_struct r;
33e8bc77eb845ab5557a4c98fe0da604d4a3740befChristopher Ferris  if (ptrace(PTRACE_GETREGS, backtrace->Tid(), 0, &r) == -1) {
34b36b5923386be8d74da2767dfc1dc62a0012a655Christopher Ferris    ALOGE("cannot get registers: %s\n", strerror(errno));
35e8bc77eb845ab5557a4c98fe0da604d4a3740befChristopher Ferris    return;
36e8bc77eb845ab5557a4c98fe0da604d4a3740befChristopher Ferris  }
37e8bc77eb845ab5557a4c98fe0da604d4a3740befChristopher Ferris
38e8bc77eb845ab5557a4c98fe0da604d4a3740befChristopher Ferris  dump_memory(log, backtrace, static_cast<uintptr_t>(r.rax), "memory near rax:");
39e8bc77eb845ab5557a4c98fe0da604d4a3740befChristopher Ferris  dump_memory(log, backtrace, static_cast<uintptr_t>(r.rbx), "memory near rbx:");
40e8bc77eb845ab5557a4c98fe0da604d4a3740befChristopher Ferris  dump_memory(log, backtrace, static_cast<uintptr_t>(r.rcx), "memory near rcx:");
41e8bc77eb845ab5557a4c98fe0da604d4a3740befChristopher Ferris  dump_memory(log, backtrace, static_cast<uintptr_t>(r.rdx), "memory near rdx:");
42e8bc77eb845ab5557a4c98fe0da604d4a3740befChristopher Ferris  dump_memory(log, backtrace, static_cast<uintptr_t>(r.rsi), "memory near rsi:");
43e8bc77eb845ab5557a4c98fe0da604d4a3740befChristopher Ferris  dump_memory(log, backtrace, static_cast<uintptr_t>(r.rdi), "memory near rdi:");
44e8bc77eb845ab5557a4c98fe0da604d4a3740befChristopher Ferris
45e8bc77eb845ab5557a4c98fe0da604d4a3740befChristopher Ferris  dump_memory(log, backtrace, static_cast<uintptr_t>(r.rip), "code around rip:");
46c6c194ced095df5e777b8fa24527ebd29c8fef54Pavel Chupin}
47c6c194ced095df5e777b8fa24527ebd29c8fef54Pavel Chupin
4862ba489ba00a2689d4e257bc178cff87495f99d7Brigid Smithvoid dump_registers(log_t* log, pid_t tid) {
49e8bc77eb845ab5557a4c98fe0da604d4a3740befChristopher Ferris  struct user_regs_struct r;
50e8bc77eb845ab5557a4c98fe0da604d4a3740befChristopher Ferris  if (ptrace(PTRACE_GETREGS, tid, 0, &r) == -1) {
51b36b5923386be8d74da2767dfc1dc62a0012a655Christopher Ferris    ALOGE("cannot get registers: %s\n", strerror(errno));
52e8bc77eb845ab5557a4c98fe0da604d4a3740befChristopher Ferris    return;
53e8bc77eb845ab5557a4c98fe0da604d4a3740befChristopher Ferris  }
54e8bc77eb845ab5557a4c98fe0da604d4a3740befChristopher Ferris
55e8bc77eb845ab5557a4c98fe0da604d4a3740befChristopher Ferris  _LOG(log, logtype::REGISTERS, "    rax %016lx  rbx %016lx  rcx %016lx  rdx %016lx\n",
56e8bc77eb845ab5557a4c98fe0da604d4a3740befChristopher Ferris       r.rax, r.rbx, r.rcx, r.rdx);
57e8bc77eb845ab5557a4c98fe0da604d4a3740befChristopher Ferris  _LOG(log, logtype::REGISTERS, "    rsi %016lx  rdi %016lx\n",
58e8bc77eb845ab5557a4c98fe0da604d4a3740befChristopher Ferris       r.rsi, r.rdi);
59e8bc77eb845ab5557a4c98fe0da604d4a3740befChristopher Ferris  _LOG(log, logtype::REGISTERS, "    r8  %016lx  r9  %016lx  r10 %016lx  r11 %016lx\n",
60e8bc77eb845ab5557a4c98fe0da604d4a3740befChristopher Ferris       r.r8, r.r9, r.r10, r.r11);
61e8bc77eb845ab5557a4c98fe0da604d4a3740befChristopher Ferris  _LOG(log, logtype::REGISTERS, "    r12 %016lx  r13 %016lx  r14 %016lx  r15 %016lx\n",
62e8bc77eb845ab5557a4c98fe0da604d4a3740befChristopher Ferris       r.r12, r.r13, r.r14, r.r15);
63e8bc77eb845ab5557a4c98fe0da604d4a3740befChristopher Ferris  _LOG(log, logtype::REGISTERS, "    cs  %016lx  ss  %016lx\n",
64e8bc77eb845ab5557a4c98fe0da604d4a3740befChristopher Ferris       r.cs, r.ss);
65e8bc77eb845ab5557a4c98fe0da604d4a3740befChristopher Ferris  _LOG(log, logtype::REGISTERS, "    rip %016lx  rbp %016lx  rsp %016lx  eflags %016lx\n",
66e8bc77eb845ab5557a4c98fe0da604d4a3740befChristopher Ferris       r.rip, r.rbp, r.rsp, r.eflags);
67c6c194ced095df5e777b8fa24527ebd29c8fef54Pavel Chupin}
68