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 */ 11void dvmMterpDumpArmRegs(uint32_t r0, uint32_t r1, uint32_t r2, uint32_t r3) 12{ 13 // TODO: Clang does not support asm declaration syntax. 14#ifndef __clang__ 15 register uint32_t rPC asm("r4"); 16 register uint32_t rFP asm("r5"); 17 register uint32_t rSELF asm("r6"); 18 register uint32_t rINST asm("r7"); 19 register uint32_t rIBASE asm("r8"); 20 register uint32_t r9 asm("r9"); 21 register uint32_t r10 asm("r10"); 22 23 //extern char dvmAsmInstructionStart[]; 24 25 printf("REGS: r0=%08x r1=%08x r2=%08x r3=%08x\n", r0, r1, r2, r3); 26 printf(" : rPC=%08x rFP=%08x rSELF=%08x rINST=%08x\n", 27 rPC, rFP, rSELF, rINST); 28 printf(" : rIBASE=%08x r9=%08x r10=%08x\n", rIBASE, r9, r10); 29#endif 30 31 //Thread* self = (Thread*) rSELF; 32 //const Method* method = self->method; 33 printf(" + self is %p\n", dvmThreadSelf()); 34 //printf(" + currently in %s.%s %s\n", 35 // method->clazz->descriptor, method->name, method->shorty); 36 //printf(" + dvmAsmInstructionStart = %p\n", dvmAsmInstructionStart); 37 //printf(" + next handler for 0x%02x = %p\n", 38 // rINST & 0xff, dvmAsmInstructionStart + (rINST & 0xff) * 64); 39} 40 41/* 42 * Dump the StackSaveArea for the specified frame pointer. 43 */ 44void dvmDumpFp(void* fp, StackSaveArea* otherSaveArea) 45{ 46 StackSaveArea* saveArea = SAVEAREA_FROM_FP(fp); 47 printf("StackSaveArea for fp %p [%p/%p]:\n", fp, saveArea, otherSaveArea); 48#ifdef EASY_GDB 49 printf(" prevSave=%p, prevFrame=%p savedPc=%p meth=%p curPc=%p\n", 50 saveArea->prevSave, saveArea->prevFrame, saveArea->savedPc, 51 saveArea->method, saveArea->xtra.currentPc); 52#else 53 printf(" prevFrame=%p savedPc=%p meth=%p curPc=%p fp[0]=0x%08x\n", 54 saveArea->prevFrame, saveArea->savedPc, 55 saveArea->method, saveArea->xtra.currentPc, 56 *(u4*)fp); 57#endif 58} 59 60/* 61 * Does the bulk of the work for common_printMethod(). 62 */ 63void dvmMterpPrintMethod(Method* method) 64{ 65 /* 66 * It is a direct (non-virtual) method if it is static, private, 67 * or a constructor. 68 */ 69 bool isDirect = 70 ((method->accessFlags & (ACC_STATIC|ACC_PRIVATE)) != 0) || 71 (method->name[0] == '<'); 72 73 char* desc = dexProtoCopyMethodDescriptor(&method->prototype); 74 75 printf("<%c:%s.%s %s> ", 76 isDirect ? 'D' : 'V', 77 method->clazz->descriptor, 78 method->name, 79 desc); 80 81 free(desc); 82} 83