summaryrefslogtreecommitdiffstats
path: root/debugger.c
diff options
context:
space:
mode:
Diffstat (limited to 'debugger.c')
-rw-r--r--debugger.c19
1 files changed, 10 insertions, 9 deletions
diff --git a/debugger.c b/debugger.c
index bacd09c..fdff032 100644
--- a/debugger.c
+++ b/debugger.c
@@ -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;