Hi,
I am the author of "ltrace" and unfortunatelly it does not work in 2.4
kernels, due to a bug in the kernel. Unfortunately, I don't know when
did this behaviour started and what could have caused it...
Summary: if I use ptrace() witth a process that does fork(), and after
the fork I modify with PTRACE_POKETEXT some of the code in the parent,
the same modification is observed in the child.
I need to modify the .text in order to introduce breakpoints, but with
this bug ltrace does not work with any process which forks.
The attached little program shows the bug: the child should not see the
content of "sync" modified after it is alive.
Thanks for your help,
--
.+'''+. .+'''+. .+'''+. .+'''+. .+''
Juan Cespedes / \ / \ cespedes@debian.org
.+' `+...+' `+...+' `+...+' `+...+'
--dDRMvlgZJXvWKvBx
Content-Type: text/x-csrc; charset=us-ascii
Content-Disposition: attachment; filename="test.c"
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/ptrace.h>
#include <signal.h>
void
traced_process(void) {
if (ptrace(PTRACE_TRACEME, 0, 0, 0) < 0)
exit(1);
kill(getpid(), SIGCONT);
if (fork()) {
sleep(2);
/* printf("parent: *sync=%d\n", *(unsigned char*)sync); */
} else {
printf("child is alive (*sync=%d)\n", *(unsigned char*)sync);
sleep(1);
printf("child: *sync=%d\n", *(unsigned char*)sync);
}
exit(0);
}
int
main(void) {
pid_t pid;
int status;
int i=0;
pid = fork();
if (!pid) traced_process();
while(1) {
if (wait(&status)==-1) {
break;
}
printf("ptrace(PTRACE_POKETEXT, %d, sync, %d)...\n", pid, ++i);
ptrace(PTRACE_POKETEXT, pid, sync, i);
ptrace(PTRACE_SYSCALL, pid, 0, 0);
}
exit(0);
}
--dDRMvlgZJXvWKvBx--
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/