HANDLE_OPCODE(OP_BREAKPOINT) #if (INTERP_TYPE == INTERP_DBG) && defined(WITH_DEBUGGER) { /* * Restart this instruction with the original opcode. We do * this by simply jumping to the handler. * * It's probably not necessary to update "inst", but we do it * for the sake of anything that needs to do disambiguation in a * common handler with INST_INST. * * The breakpoint itself is handled over in updateDebugger(), * because we need to detect other events (method entry, single * step) and report them in the same event packet, and we're not * yet handling those through breakpoint instructions. By the * time we get here, the breakpoint has already been handled and * the thread resumed. */ u1 originalOpCode = dvmGetOriginalOpCode(pc); LOGV("+++ break 0x%02x (0x%04x -> 0x%04x)\n", originalOpCode, inst, INST_REPLACE_OP(inst, originalOpCode)); inst = INST_REPLACE_OP(inst, originalOpCode); FINISH_BKPT(originalOpCode); } #else LOGE("Breakpoint hit in non-debug interpreter\n"); dvmAbort(); #endif OP_END