diff options
Diffstat (limited to 'debugger.c')
| -rw-r--r-- | debugger.c | 19 | 
1 files changed, 10 insertions, 9 deletions
@@ -79,6 +79,7 @@ static void install_breakpoints(struct thread *th) {              word = (word & ~0xff) | BREAKPOINT_INSN;              ptrace(PTRACE_POKETEXT, th->id, b->address, word);              b->installed = 1; +            b->previously_installed = 1;          }      }  } @@ -89,16 +90,15 @@ static void uninstall_breakpoints(struct thread *th) {          if (b->installed) {              ptrace(PTRACE_POKETEXT, th->id, b->address, b->text);              b->installed = 0; +        } -            if (b->enabled < 0) { -                struct thread *t; -                if (b->tid == 0 || -                        ((t = thread_by_id(th->proc, b->tid)) && !t->doing)) { -                    struct breakpoint *del = b; -                    b = b->next; -                    list_remove(del); -                    free(del); -                } +        if (b->previously_installed && b->enabled < 0) { +            struct thread *t = NULL; +            if (b->tid == 0 || ((t = thread_by_id(th->proc, b->tid)) && !t->doing)) { +                struct breakpoint *del = b; +                b = b->next; +                list_remove(del); +                free(del);              }          }      } @@ -434,6 +434,7 @@ struct breakpoint *add_breakpoint(struct process *proc, unsigned long address) {      b->address = address;      b->text = 0;      b->installed = 0; +    b->previously_installed = 0;      b->hits = 0;      b->user = 1;      b->stack = 0;  | 
