#include #include #include #include #include #include #include #define DONT_CARE 0 int stats; struct user_regs_struct regs; void continue_execution(pid_t pid) { ptrace(PTRACE_CONT, pid, DONT_CARE, DONT_CARE); int wait_status; int options = 0; waitpid(pid, &wait_status, options); return; } void print_rax(pid_t pid) { ptrace(PTRACE_GETREGS, pid, DONT_CARE, ®s); printf("rax = %llu\n", regs.rax); return; } void step(pid_t pid) { ptrace(PTRACE_SINGLESTEP, pid, DONT_CARE, DONT_CARE); return; } int main() { printf("procces is run "); pid_t pid; pid = fork(); if (pid==0) { printf(" -- child\n"); ptrace(PTRACE_TRACEME, 0, 0, 0); execl("./testee", "testee", NULL); printf("____AFTER_TRACE_CHILD____\n"); } else if(pid > 0) { char buff; printf(" -- parrent\n"); continue_execution(pid); do { waitpid(pid, &stats, 0); printf("stats - %d", stats); print_rax(pid); ptrace(PTRACE_SINGLESTEP, pid, DONT_CARE, DONT_CARE); printf("enter any: "); read(0, &buff, 1); printf("\n"); } while(stats); printf("____AFTER_TRACE_PARRENT____\n"); } return 0; }