16cc492308712613cd23bee9240b1757428841a2fBruce Beare/* system/debuggerd/debuggerd.c
26cc492308712613cd23bee9240b1757428841a2fBruce Beare**
36cc492308712613cd23bee9240b1757428841a2fBruce Beare** Copyright 2006, The Android Open Source Project
46cc492308712613cd23bee9240b1757428841a2fBruce Beare**
56cc492308712613cd23bee9240b1757428841a2fBruce Beare** Licensed under the Apache License, Version 2.0 (the "License");
66cc492308712613cd23bee9240b1757428841a2fBruce Beare** you may not use this file except in compliance with the License.
76cc492308712613cd23bee9240b1757428841a2fBruce Beare** You may obtain a copy of the License at
86cc492308712613cd23bee9240b1757428841a2fBruce Beare**
96cc492308712613cd23bee9240b1757428841a2fBruce Beare**     http://www.apache.org/licenses/LICENSE-2.0
106cc492308712613cd23bee9240b1757428841a2fBruce Beare**
116cc492308712613cd23bee9240b1757428841a2fBruce Beare** Unless required by applicable law or agreed to in writing, software
126cc492308712613cd23bee9240b1757428841a2fBruce Beare** distributed under the License is distributed on an "AS IS" BASIS,
136cc492308712613cd23bee9240b1757428841a2fBruce Beare** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
146cc492308712613cd23bee9240b1757428841a2fBruce Beare** See the License for the specific language governing permissions and
156cc492308712613cd23bee9240b1757428841a2fBruce Beare** limitations under the License.
166cc492308712613cd23bee9240b1757428841a2fBruce Beare*/
176cc492308712613cd23bee9240b1757428841a2fBruce Beare
18053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown#include <stddef.h>
19053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown#include <stdbool.h>
20053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown#include <stdlib.h>
21053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown#include <string.h>
226cc492308712613cd23bee9240b1757428841a2fBruce Beare#include <stdio.h>
236cc492308712613cd23bee9240b1757428841a2fBruce Beare#include <errno.h>
246cc492308712613cd23bee9240b1757428841a2fBruce Beare#include <sys/types.h>
256cc492308712613cd23bee9240b1757428841a2fBruce Beare#include <sys/ptrace.h>
266cc492308712613cd23bee9240b1757428841a2fBruce Beare
2713e715b491e876865e752a3a69dd6f347049a488Jeff Brown#include <corkscrew/ptrace.h>
2813e715b491e876865e752a3a69dd6f347049a488Jeff Brown
29053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown#include <linux/user.h>
306cc492308712613cd23bee9240b1757428841a2fBruce Beare
316cc492308712613cd23bee9240b1757428841a2fBruce Beare#include "../utility.h"
32053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown#include "../machine.h"
33053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown
34053b865412d1982ad1dc0e840898d82527deeb99Jeff Brownvoid dump_memory_and_code(const ptrace_context_t* context __attribute((unused)),
35053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown        log_t* log, pid_t tid, bool at_fault) {
36053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown}
376cc492308712613cd23bee9240b1757428841a2fBruce Beare
38053b865412d1982ad1dc0e840898d82527deeb99Jeff Brownvoid dump_registers(const ptrace_context_t* context __attribute((unused)),
39053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown        log_t* log, pid_t tid, bool at_fault) {
406cc492308712613cd23bee9240b1757428841a2fBruce Beare    struct pt_regs_x86 r;
416cc492308712613cd23bee9240b1757428841a2fBruce Beare    bool only_in_tombstone = !at_fault;
426cc492308712613cd23bee9240b1757428841a2fBruce Beare
43f0c5872637a63e28e3cd314cfc915c07f76df9c6Jeff Brown    if(ptrace(PTRACE_GETREGS, tid, 0, &r)) {
44053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown        _LOG(log, only_in_tombstone, "cannot get registers: %s\n", strerror(errno));
456cc492308712613cd23bee9240b1757428841a2fBruce Beare        return;
466cc492308712613cd23bee9240b1757428841a2fBruce Beare    }
4713e715b491e876865e752a3a69dd6f347049a488Jeff Brown    //if there is no stack, no print just like arm
486cc492308712613cd23bee9240b1757428841a2fBruce Beare    if(!r.ebp)
496cc492308712613cd23bee9240b1757428841a2fBruce Beare        return;
50053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown    _LOG(log, only_in_tombstone, "    eax %08x  ebx %08x  ecx %08x  edx %08x\n",
516cc492308712613cd23bee9240b1757428841a2fBruce Beare         r.eax, r.ebx, r.ecx, r.edx);
52053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown    _LOG(log, only_in_tombstone, "    esi %08x  edi %08x\n",
536cc492308712613cd23bee9240b1757428841a2fBruce Beare         r.esi, r.edi);
54053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown    _LOG(log, only_in_tombstone, "    xcs %08x  xds %08x  xes %08x  xfs %08x  xss %08x\n",
556cc492308712613cd23bee9240b1757428841a2fBruce Beare         r.xcs, r.xds, r.xes, r.xfs, r.xss);
56053b865412d1982ad1dc0e840898d82527deeb99Jeff Brown    _LOG(log, only_in_tombstone, "    eip %08x  ebp %08x  esp %08x  flags %08x\n",
576cc492308712613cd23bee9240b1757428841a2fBruce Beare         r.eip, r.ebp, r.esp, r.eflags);
586cc492308712613cd23bee9240b1757428841a2fBruce Beare}
59