/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- * * The contents of this file are subject to the Netscape Public * License Version 1.1 (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.mozilla.org/NPL/ * * Software distributed under the License is distributed on an "AS * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or * implied. See the License for the specific language governing * rights and limitations under the License. * * The Original Code is mozilla.org code. * * The Initial Developer of the Original Code is Netscape * Communications Corporation. Portions created by Netscape are * Copyright (C) 1998 Netscape Communications Corporation. All * Rights Reserved. * * Contributor(s): */ #include #include "Fundamentals.h" #include unsigned char old_instruction; extern "C" int SetBreakPoint(void *pc) { old_instruction = (*((unsigned char *) pc)); *((unsigned char *) pc) = 0xcc; /* break point opcode */ fprintf(stderr, "breakpoint at: %x\n", pc); fprintf(stderr, "value: %x\n", &old_instruction); /* Need to flush icache here */ return 0; } __declspec(dllexport) EXCEPTION_DISPOSITION __cdecl _arun_handler(struct _EXCEPTION_RECORD *ExceptionRecord, void * EstablisherFrame, struct _CONTEXT *ContextRecord, void * DispatcherContext ) { // Indicate that we made it to our exception handler fprintf(stderr, "Faulted with: 0x%x\n",ExceptionRecord->ExceptionCode); // Change EIP in the context record so that it points to someplace // where we can successfully continue switch (ExceptionRecord->ExceptionCode) { case STATUS_BREAKPOINT: fprintf(stderr, "Restoring the instruction at %x\n", ContextRecord->Eip); (*(unsigned char *) (ContextRecord->Eip)) = old_instruction; fprintf(stderr, "Restored: %x\n", old_instruction); // Reexecute the same instruction return ExceptionContinueExecution; default: return ExceptionContinueSearch; } }