The Android Open Source Project | f6c3871 | 2009-03-03 19:28:47 -0800 | [diff] [blame^] | 1 | #include <inttypes.h> |
| 2 | |
| 3 | /* |
| 4 | * Dump the fixed-purpose ARM registers, along with some other info. |
| 5 | * |
| 6 | * This function MUST be compiled in ARM mode -- THUMB will yield bogus |
| 7 | * results. |
| 8 | * |
| 9 | * This will NOT preserve r0-r3/ip. |
| 10 | */ |
| 11 | void dvmMterpDumpArmRegs(uint32_t r0, uint32_t r1, uint32_t r2, uint32_t r3) |
| 12 | { |
| 13 | register uint32_t rPC asm("r4"); |
| 14 | register uint32_t rFP asm("r5"); |
| 15 | register uint32_t rGLUE asm("r6"); |
| 16 | register uint32_t rIBASE asm("r7"); |
| 17 | register uint32_t rINST asm("r8"); |
| 18 | register uint32_t r9 asm("r9"); |
| 19 | register uint32_t r10 asm("r10"); |
| 20 | |
| 21 | extern char dvmAsmInstructionStart[]; |
| 22 | |
| 23 | printf("REGS: r0=%08x r1=%08x r2=%08x r3=%08x\n", r0, r1, r2, r3); |
| 24 | printf(" : rPC=%08x rFP=%08x rGLUE=%08x rIBASE=%08x\n", |
| 25 | rPC, rFP, rGLUE, rIBASE); |
| 26 | printf(" : rINST=%08x r9=%08x r10=%08x\n", rINST, r9, r10); |
| 27 | |
| 28 | MterpGlue* glue = (MterpGlue*) rGLUE; |
| 29 | const Method* method = glue->method; |
| 30 | printf(" + self is %p\n", dvmThreadSelf()); |
| 31 | //printf(" + currently in %s.%s %s\n", |
| 32 | // method->clazz->descriptor, method->name, method->signature); |
| 33 | //printf(" + dvmAsmInstructionStart = %p\n", dvmAsmInstructionStart); |
| 34 | //printf(" + next handler for 0x%02x = %p\n", |
| 35 | // rINST & 0xff, dvmAsmInstructionStart + (rINST & 0xff) * 64); |
| 36 | } |
| 37 | |
| 38 | /* |
| 39 | * Dump the StackSaveArea for the specified frame pointer. |
| 40 | */ |
| 41 | void dvmDumpFp(void* fp, StackSaveArea* otherSaveArea) |
| 42 | { |
| 43 | StackSaveArea* saveArea = SAVEAREA_FROM_FP(fp); |
| 44 | printf("StackSaveArea for fp %p [%p/%p]:\n", fp, saveArea, otherSaveArea); |
| 45 | #ifdef EASY_GDB |
| 46 | printf(" prevSave=%p, prevFrame=%p savedPc=%p meth=%p curPc=%p\n", |
| 47 | saveArea->prevSave, saveArea->prevFrame, saveArea->savedPc, |
| 48 | saveArea->method, saveArea->xtra.currentPc); |
| 49 | #else |
| 50 | printf(" prevFrame=%p savedPc=%p meth=%p curPc=%p fp[0]=0x%08x\n", |
| 51 | saveArea->prevFrame, saveArea->savedPc, |
| 52 | saveArea->method, saveArea->xtra.currentPc, |
| 53 | *(u4*)fp); |
| 54 | #endif |
| 55 | } |
| 56 | |
| 57 | /* |
| 58 | * Does the bulk of the work for common_printMethod(). |
| 59 | */ |
| 60 | void dvmMterpPrintMethod(Method* method) |
| 61 | { |
| 62 | /* |
| 63 | * It is a direct (non-virtual) method if it is static, private, |
| 64 | * or a constructor. |
| 65 | */ |
| 66 | bool isDirect = |
| 67 | ((method->accessFlags & (ACC_STATIC|ACC_PRIVATE)) != 0) || |
| 68 | (method->name[0] == '<'); |
| 69 | |
| 70 | char* desc = dexProtoCopyMethodDescriptor(&method->prototype); |
| 71 | |
| 72 | printf("<%c:%s.%s %s> ", |
| 73 | isDirect ? 'D' : 'V', |
| 74 | method->clazz->descriptor, |
| 75 | method->name, |
| 76 | desc); |
| 77 | |
| 78 | free(desc); |
| 79 | } |