#include #include /* memset */ #include #include #include /* exit */ #include /* execl */ #include /* mmap */ #include /* open */ #include /* open */ #include /* open */ #include #include #include #include #include #include #include pid_t wait3(int *status, int options, struct rusage *rusage); struct user_regs_struct regs; #define MUST(X) { if (!(X)) { fprintf(stderr, "FAILURE AT %s:%d\n", __FILE__, __LINE__ ); perror("perror"); exit(13); } } int main() { int pid = fork(); if ( pid ) { // parent while (1) { int status= 0; int e = wait4( pid, &status, 0, NULL ); fprintf(stderr, "waited for pid %d got %d status %d\n", pid, e, status ); e= ptrace( PTRACE_GETREGS, pid, NULL, ®s ); fprintf(stderr, "got regs e=%d pc=%ld\n", e, regs.eip ); e= ptrace( PTRACE_SINGLESTEP, pid, NULL, 0 ); //e= ptrace( PTRACE_SYSCALL, pid, NULL, 0 ); fprintf(stderr, "stepped e=%d/%d pc=%ld\n", e, errno, regs.eip ); } } else { // child long x= ptrace( PTRACE_TRACEME, 0, NULL, NULL ); execl( "/bin/ls", "ls", NULL); } return 0; }