diff -urp ltrace-0.5/breakpoints.c ltrace-0.5-pm/breakpoints.c
--- ltrace-0.5/breakpoints.c 2009-03-02 19:43:27.000000000 -0500
+++ ltrace-0.5-pm/breakpoints.c 2009-03-02 18:46:25.000000000 -0500
@@ -98,8 +101,11 @@ void enable_all_breakpoints(struct proce
a = ptrace(PTRACE_PEEKTEXT, proc->pid,
sym2addr(proc, proc->list_of_symbols),
0);
- if (a == 0x0)
+ if (a == 0x0) {
+ debug(2, "Not enabling breakpoints for pid %u "
+ "yet, PLT is not populated.", proc->pid);
return;
+ }
}
#endif
@@ -178,6 +178,7 @@ void breakpoints_init(struct process *pr
}
proc->callstack_depth = 0;
proc->breakpoints_enabled = -1;
+ proc->old = 0;
}
void reinitialize_breakpoints(struct process *proc)
diff -urp ltrace-0.5/ltrace.h ltrace-0.5-pm/ltrace.h
--- ltrace-0.5/ltrace.h 2009-03-02 19:43:27.000000000 -0500
+++ ltrace-0.5-pm/ltrace.h 2009-03-02 19:06:43.000000000 -0500
@@ -110,6 +110,7 @@ struct process {
int early; /* for consistency checks, this is true for
* children whose TRAP was delivered before
* the fork message of the parent. */
+ int old;
int callstack_depth;
struct callstack_element callstack[MAX_CALLDEPTH];
diff -urp ltrace-0.5/proc.c ltrace-0.5-pm/proc.c
--- ltrace-0.5/proc.c 2009-03-02 19:43:27.000000000 -0500
+++ ltrace-0.5-pm/proc.c 2009-03-02 19:07:50.000000000 -0500
@@ -22,11 +22,8 @@ struct process *open_program(char *filen
}
proc->filename = filename;
proc->breakpoints_enabled = -1;
- proc->pid = 0;
breakpoints_init(proc);
- if (pid) {
- proc->pid = pid;
- }
+ proc->pid = pid;
proc->next = list_of_processes;
list_of_processes = proc;
@@ -63,6 +60,9 @@ void open_forked_pid(pid_t pid, int earl
char *filename = pid2name(pid);
struct process *proc = open_program(filename, 0);
proc->pid = pid;
- proc->breakpoints_enabled = -1;
+#ifdef __powerpc__
+ breakpoints_init(proc);
+ proc->breakpoints_enabled = 1;
+#endif
proc->early = early;
}
diff -urp ltrace-0.5/wait_for_something.c ltrace-0.5-pm/wait_for_something.c
--- ltrace-0.5/wait_for_something.c 2009-03-02 19:43:27.000000000 -0500
+++ ltrace-0.5-pm/wait_for_something.c 2009-03-02 19:07:21.000000000 -0500
@@ -46,6 +46,7 @@ struct event *wait_for_something(void)
exit(1);
}
+ debug(3, "signal from pid %u, status %#x", pid, status);
event.proc = pid2proc(pid);
if (!event.proc) {
if(!opt_f) {
@@ -66,9 +67,13 @@ struct event *wait_for_something(void)
}
get_arch_dep(event.proc);
event.proc->instruction_pointer = NULL;
- debug(3, "signal from pid %u", pid);
- if (event.proc->breakpoints_enabled == -1) {
- enable_all_breakpoints(event.proc);
+ if (!event.proc->old) {
+ event.proc->old = 1;
+ if (event.proc->breakpoints_enabled == -1) {
+ debug (2, "BRANCH: enable breakpoints for the first time");
+ enable_all_breakpoints(event.proc);
+ debug (2, "BRANCH: done enabling breakpoints for the first time");
+ }
event.thing = LT_EV_NONE;
if(opt_f){
trace_set_options(event.proc, event.proc->pid, TRACE_FORK);