diff -urp ltrace-0.5-1/ltrace.h ltrace-0.5/ltrace.h --- ltrace-0.5-1/ltrace.h 2008-10-07 12:05:57.000000000 +0200 +++ ltrace-0.5/ltrace.h 2008-10-07 12:06:20.000000000 +0200 @@ -173,6 +173,7 @@ extern void reinitialize_breakpoints(str extern struct process *open_program(char *filename, pid_t pid); extern void open_pid(pid_t pid, int verbose); +extern void open_forked_pid(pid_t pid); extern void show_summary(void); /* Arch-dependent stuff: */ diff -urp ltrace-0.5-1/ltrace.h.orig ltrace-0.5/ltrace.h.orig --- ltrace-0.5-1/ltrace.h.orig 2006-06-14 06:55:21.000000000 +0200 +++ ltrace-0.5/ltrace.h.orig 2008-10-07 12:06:19.000000000 +0200 @@ -12,6 +12,7 @@ #include "sysdep.h" #define MAX_LIBRARY 30 +#define TRACE_FORK 1 #if defined HAVE_LIBIBERTY || defined HAVE_LIBSUPC__ # define USE_DEMANGLE @@ -176,7 +177,7 @@ extern void show_summary(void); /* Arch-dependent stuff: */ extern char *pid2name(pid_t pid); -extern void trace_set_options(struct process *proc, pid_t pid); +extern void trace_set_options(struct process *proc, pid_t pid, int option); extern void trace_me(void); extern int trace_pid(pid_t pid); extern void untrace_pid(pid_t pid); @@ -204,5 +205,5 @@ extern void *sym2addr(struct process *, #if 0 /* not yet */ extern int umoven(struct process *proc, void *addr, int len, void *laddr); #endif - +extern ulong get_child_pid(pid_t pid); #endif diff -urp ltrace-0.5-1/proc.c ltrace-0.5/proc.c --- ltrace-0.5-1/proc.c 2008-10-07 12:05:58.000000000 +0200 +++ ltrace-0.5/proc.c 2008-10-07 12:06:20.000000000 +0200 @@ -58,3 +58,11 @@ void open_pid(pid_t pid, int verbose) proc = open_program(filename, 0); proc->pid = pid; } + +void open_forked_pid(pid_t pid) +{ + char *filename = pid2name(pid); + struct process *proc = open_program(filename, 0); + proc->pid = pid; + proc->breakpoints_enabled = -1; +} Only in ltrace-0.5: proc.c.orig diff -urp ltrace-0.5-1/testsuite/lib/ltrace.exp ltrace-0.5/testsuite/lib/ltrace.exp --- ltrace-0.5-1/testsuite/lib/ltrace.exp 2006-03-14 00:12:01.000000000 +0100 +++ ltrace-0.5/testsuite/lib/ltrace.exp 2008-10-07 12:06:20.000000000 +0200 @@ -260,7 +260,7 @@ proc ltrace_saveoutput { args } { proc ltrace_verify_output { file_to_search pattern {instance_no 0}} { # compute the number of PATTERN in FILE_TO_SEARCH by grep and wc. - catch "exec sh -c {grep $pattern $file_to_search | wc -l ;exit}" output + catch "exec sh -c {egrep $pattern $file_to_search | wc -l ;exit}" output verbose "output = $output" if { $instance_no == 0 } then { diff -urp ltrace-0.5-1/testsuite/ltrace.minor/trace-fork.exp ltrace-0.5/testsuite/ltrace.minor/trace-fork.exp --- ltrace-0.5-1/testsuite/ltrace.minor/trace-fork.exp 2006-03-14 00:12:01.000000000 +0100 +++ ltrace-0.5/testsuite/ltrace.minor/trace-fork.exp 2008-10-07 12:06:20.000000000 +0200 @@ -35,6 +35,19 @@ if [regexp {ELF from incompatible archit ltrace_saveoutput "${exec_output}" ${srcdir}/${subdir}/${testfile}.ltrace -set pattern "fork" +if [ regexp {Cannot attach} $exec_output ] { + fail "Couldn't attach to forked process!" + return +} + +set pattern "^fork" ltrace_verify_output ${srcdir}/${subdir}/${testfile}.ltrace $pattern 1 +set pattern {'^\[pid [0-9]*\][ \t]*(printf|puts)'} +ltrace_verify_output ${srcdir}/${subdir}/${testfile}.ltrace $pattern 2 + +set pattern {'^\[pid [0-9]*\][ \t]*wait'} +ltrace_verify_output ${srcdir}/${subdir}/${testfile}.ltrace $pattern 1 + +set pattern {'^\[pid [0-9]*\][ \t]*sleep'} +ltrace_verify_output ${srcdir}/${subdir}/${testfile}.ltrace $pattern 1 diff -urp ltrace-0.5-1/wait_for_something.c ltrace-0.5/wait_for_something.c --- ltrace-0.5-1/wait_for_something.c 2008-10-07 12:05:57.000000000 +0200 +++ ltrace-0.5/wait_for_something.c 2008-10-07 12:06:20.000000000 +0200 @@ -103,7 +103,8 @@ struct event *wait_for_something(void) event.e_un.signum = WSTOPSIG(status); child_pid = (pid_t) get_child_pid(event.proc->pid); if (child_pid){ - open_pid(child_pid,0); + debug (3, "fork: get_child_pid gave us %d", child_pid); + open_forked_pid(child_pid); } enable_all_breakpoints(event.proc); continue_after_signal(event.proc->pid, event.e_un.signum);