summaryrefslogtreecommitdiffstats
path: root/debuggerd/x86
diff options
context:
space:
mode:
authorBruce Beare <bruce.j.beare@intel.com>2010-10-13 16:11:15 -0700
committerBruce Beare <bruce.j.beare@intel.com>2010-11-29 11:28:11 -0800
commit6cc492308712613cd23bee9240b1757428841a2f (patch)
treef56f88008f920abb91942a1045625a9e346227b5 /debuggerd/x86
parent849249064cae9c1bb23b0204b5d35b832567801e (diff)
downloadcore-6cc492308712613cd23bee9240b1757428841a2f.tar.gz
core-6cc492308712613cd23bee9240b1757428841a2f.tar.bz2
core-6cc492308712613cd23bee9240b1757428841a2f.zip
debuggerd: IA version
Change-Id: I0c0d9c2d7e476b8d117aaf505a9480a47c0b5c05 Signed-off-by: Lei Li <lei.l.li@intel.com> Signed-off-by: Bruce Beare <bruce.j.beare@intel.com>
Diffstat (limited to 'debuggerd/x86')
-rw-r--r--debuggerd/x86/crashglue.S15
-rw-r--r--debuggerd/x86/machine.c61
-rw-r--r--debuggerd/x86/unwind.c85
-rw-r--r--debuggerd/x86/x86_utility.h40
4 files changed, 201 insertions, 0 deletions
diff --git a/debuggerd/x86/crashglue.S b/debuggerd/x86/crashglue.S
new file mode 100644
index 000000000..59df43250
--- /dev/null
+++ b/debuggerd/x86/crashglue.S
@@ -0,0 +1,15 @@
+.globl crash1
+.globl crashnostack
+
+crash1:
+ movl $0xa5a50000, %eax
+ movl $0xa5a50001, %ebx
+ movl $0xa5a50002, %ecx
+
+ movl $0, %edx
+ jmp *%edx
+
+
+crashnostack:
+ movl $0, %ebp
+ jmp *%ebp
diff --git a/debuggerd/x86/machine.c b/debuggerd/x86/machine.c
new file mode 100644
index 000000000..9d418cf61
--- /dev/null
+++ b/debuggerd/x86/machine.c
@@ -0,0 +1,61 @@
+/* system/debuggerd/debuggerd.c
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+
+#include <stdio.h>
+#include <errno.h>
+#include <signal.h>
+#include <pthread.h>
+#include <fcntl.h>
+#include <sys/types.h>
+#include <dirent.h>
+
+#include <sys/ptrace.h>
+#include <sys/wait.h>
+#include <sys/exec_elf.h>
+#include <sys/stat.h>
+
+#include <cutils/sockets.h>
+#include <cutils/properties.h>
+
+#include <linux/input.h>
+
+#include "../utility.h"
+#include "x86_utility.h"
+
+void dump_registers(int tfd, int pid, bool at_fault)
+{
+ struct pt_regs_x86 r;
+ bool only_in_tombstone = !at_fault;
+
+ if(ptrace(PTRACE_GETREGS, pid, 0, &r)) {
+ _LOG(tfd, only_in_tombstone,
+ "cannot get registers: %s\n", strerror(errno));
+ return;
+ }
+//if there is no stack, no print just like arm
+ if(!r.ebp)
+ return;
+ _LOG(tfd, only_in_tombstone, " eax %08x ebx %08x ecx %08x edx %08x\n",
+ r.eax, r.ebx, r.ecx, r.edx);
+ _LOG(tfd, only_in_tombstone, " esi %08x edi %08x\n",
+ r.esi, r.edi);
+ _LOG(tfd, only_in_tombstone, " xcs %08x xds %08x xes %08x xfs %08x xss %08x\n",
+ r.xcs, r.xds, r.xes, r.xfs, r.xss);
+ _LOG(tfd, only_in_tombstone,
+ " eip %08x ebp %08x esp %08x flags %08x\n",
+ r.eip, r.ebp, r.esp, r.eflags);
+}
diff --git a/debuggerd/x86/unwind.c b/debuggerd/x86/unwind.c
new file mode 100644
index 000000000..8f84e0149
--- /dev/null
+++ b/debuggerd/x86/unwind.c
@@ -0,0 +1,85 @@
+#include <cutils/logd.h>
+#include <sys/ptrace.h>
+#include "../utility.h"
+#include "x86_utility.h"
+
+
+int unwind_backtrace_with_ptrace_x86(int tfd, pid_t pid, mapinfo *map,
+ bool at_fault)
+{
+ struct pt_regs_x86 r;
+ unsigned int stack_level = 0;
+ unsigned int stack_depth = 0;
+ unsigned int rel_pc;
+ unsigned int stack_ptr;
+ unsigned int stack_content;
+
+ if(ptrace(PTRACE_GETREGS, pid, 0, &r)) return 0;
+ unsigned int eip = (unsigned int)r.eip;
+ unsigned int ebp = (unsigned int)r.ebp;
+ unsigned int cur_sp = (unsigned int)r.esp;
+ const mapinfo *mi;
+ const struct symbol* sym = 0;
+
+
+//ebp==0, it indicates that the stack is poped to the bottom or there is no stack at all.
+ while (ebp) {
+ _LOG(tfd, !at_fault, "#0%d ",stack_level);
+ mi = pc_to_mapinfo(map, eip, &rel_pc);
+
+ /* See if we can determine what symbol this stack frame resides in */
+ if (mi != 0 && mi->symbols != 0) {
+ sym = symbol_table_lookup(mi->symbols, rel_pc);
+ }
+ if (sym) {
+ _LOG(tfd, !at_fault, " eip: %08x %s (%s)\n", eip, mi ? mi->name : "", sym->name);
+ } else {
+ _LOG(tfd, !at_fault, " eip: %08x %s\n", eip, mi ? mi->name : "");
+ }
+
+ stack_level++;
+ if (stack_level >= STACK_DEPTH || eip == 0)
+ break;
+ eip = ptrace(PTRACE_PEEKTEXT, pid, (void*)(ebp + 4), NULL);
+ ebp = ptrace(PTRACE_PEEKTEXT, pid, (void*)ebp, NULL);
+ }
+ ebp = (unsigned int)r.ebp;
+ stack_depth = stack_level;
+ stack_level = 0;
+ if (ebp)
+ _LOG(tfd, !at_fault, "stack: \n");
+ while (ebp) {
+ _LOG(tfd, !at_fault, "#0%d \n",stack_level);
+ stack_ptr = cur_sp;
+ while((int)(ebp - stack_ptr) >= 0) {
+ stack_content = ptrace(PTRACE_PEEKTEXT, pid, (void*)stack_ptr, NULL);
+ mi = pc_to_mapinfo(map, stack_content, &rel_pc);
+
+ /* See if we can determine what symbol this stack frame resides in */
+ if (mi != 0 && mi->symbols != 0) {
+ sym = symbol_table_lookup(mi->symbols, rel_pc);
+ }
+ if (sym) {
+ _LOG(tfd, !at_fault, " %08x %08x %s (%s)\n",
+ stack_ptr, stack_content, mi ? mi->name : "", sym->name);
+ } else {
+ _LOG(tfd, !at_fault, " %08x %08x %s\n", stack_ptr, stack_content, mi ? mi->name : "");
+ }
+
+ stack_ptr = stack_ptr + 4;
+ //the stack frame may be very deep.
+ if((int)(stack_ptr - cur_sp) >= STACK_FRAME_DEPTH) {
+ _LOG(tfd, !at_fault, " ...... ...... \n");
+ break;
+ }
+ }
+ cur_sp = ebp + 4;
+ stack_level++;
+ if (stack_level >= STACK_DEPTH || stack_level >= stack_depth)
+ break;
+ ebp = ptrace(PTRACE_PEEKTEXT, pid, (void*)ebp, NULL);
+ }
+
+ return stack_depth;
+}
+
diff --git a/debuggerd/x86/x86_utility.h b/debuggerd/x86/x86_utility.h
new file mode 100644
index 000000000..ac6a885c0
--- /dev/null
+++ b/debuggerd/x86/x86_utility.h
@@ -0,0 +1,40 @@
+/*
+**
+** Copyright 2006, The Android Open Source Project
+**
+** Licensed under the Apache License, Version 2.0 (the "License");
+** you may not use this file except in compliance with the License.
+** You may obtain a copy of the License at
+**
+** http://www.apache.org/licenses/LICENSE-2.0
+**
+** Unless required by applicable law or agreed to in writing, software
+** distributed under the License is distributed on an "AS IS" BASIS,
+** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+** See the License for the specific language governing permissions and
+** limitations under the License.
+*/
+
+#define STACK_DEPTH 8
+#define STACK_FRAME_DEPTH 64
+
+typedef struct pt_regs_x86 {
+ long ebx;
+ long ecx;
+ long edx;
+ long esi;
+ long edi;
+ long ebp;
+ long eax;
+ int xds;
+ int xes;
+ int xfs;
+ int xgs;
+ long orig_eax;
+ long eip;
+ int xcs;
+ long eflags;
+ long esp;
+ int xss;
+}pt_regs_x86;
+