breakpoint.c revision 5c3fe0697b202cc7d95e90459de0fb312b297b27
1#if HAVE_CONFIG_H 2#include "config.h" 3#endif 4 5#include <sys/ptrace.h> 6#include "arch.h" 7#include "options.h" 8#include "output.h" 9 10static unsigned char break_insn[] = BREAKPOINT_VALUE; 11 12void 13enable_breakpoint(pid_t pid, struct breakpoint * sbp) { 14 int i,j; 15 16 if (opt_d>1) { 17 output_line(0, "enable_breakpoint(%d,%p)", pid, sbp->addr); 18 } 19 20 for(i=0; i < 1+((BREAKPOINT_LENGTH-1)/sizeof(long)); i++) { 21 long a = ptrace(PTRACE_PEEKTEXT, pid, sbp->addr + i*sizeof(long), 0); 22 for(j=0; j<sizeof(long) && i*sizeof(long)+j < BREAKPOINT_LENGTH; j++) { 23 unsigned char * bytes = (unsigned char *)&a; 24 25 sbp->orig_value[i*sizeof(long)+j] = bytes[+j]; 26 bytes[j] = break_insn[i*sizeof(long)+j]; 27 } 28 ptrace(PTRACE_POKETEXT, pid, sbp->addr + i*sizeof(long), a); 29 } 30} 31 32void 33disable_breakpoint(pid_t pid, const struct breakpoint * sbp) { 34 int i,j; 35 36 if (opt_d>1) { 37 output_line(0, "disable_breakpoint(%d,%p)", pid, sbp->addr); 38 } 39 40 for(i=0; i < 1+((BREAKPOINT_LENGTH-1)/sizeof(long)); i++) { 41 long a = ptrace(PTRACE_PEEKTEXT, pid, sbp->addr + i*sizeof(long), 0); 42 for(j=0; j<sizeof(long) && i*sizeof(long)+j < BREAKPOINT_LENGTH; j++) { 43 unsigned char * bytes = (unsigned char *)&a; 44 45 bytes[j] = sbp->orig_value[i*sizeof(long)+j]; 46 } 47 ptrace(PTRACE_POKETEXT, pid, sbp->addr + i*sizeof(long), a); 48 } 49} 50