| --- ltrace-0.5.2.orig/TODO |
| +++ ltrace-0.5.2/TODO |
| @@ -37,3 +37,4 @@ |
| * debug: change "-d" option to be something like "-d elf,events", or "-d breakpoints" |
| * Find out if a process is sharing memory with its parent? |
| * When using -p, find out if that process is sharing memory with other procs |
| +* After a clone(), syscalls may be seen as sysrets in s390 (see trace.c:syscall_p()) |
| --- ltrace-0.5.2.orig/process_event.c |
| +++ ltrace-0.5.2/process_event.c |
| @@ -170,7 +170,7 @@ |
| enable_breakpoint(proc->pid, proc->breakpoint_being_enabled); |
| proc->breakpoint_being_enabled = NULL; |
| } |
| - if (proc->parent->state == STATE_ATTACHED && options.follow) { |
| + if (options.follow) { |
| proc->state = STATE_ATTACHED; |
| } else { |
| proc->state = STATE_IGNORED; |
| --- ltrace-0.5.2.orig/sysdeps/linux-gnu/ppc/trace.c |
| +++ ltrace-0.5.2/sysdeps/linux-gnu/ppc/trace.c |
| @@ -50,9 +50,9 @@ |
| *sysnum = |
| (int)ptrace(PTRACE_PEEKUSER, proc->pid, |
| sizeof(long) * PT_R0, 0); |
| - if (proc->callstack_depth > 0 |
| - && proc->callstack[proc->callstack_depth - |
| - 1].is_syscall) { |
| + if (proc->callstack_depth > 0 && |
| + proc->callstack[proc->callstack_depth - 1].is_syscall && |
| + proc->callstack[proc->callstack_depth - 1].c_un.syscall == *sysnum) { |
| return 2; |
| } |
| return 1; |
| --- ltrace-0.5.2.orig/sysdeps/linux-gnu/i386/trace.c |
| +++ ltrace-0.5.2/sysdeps/linux-gnu/i386/trace.c |
| @@ -32,7 +32,8 @@ |
| *sysnum = ptrace(PTRACE_PEEKUSER, proc->pid, 4 * ORIG_EAX, 0); |
| |
| if (proc->callstack_depth > 0 && |
| - proc->callstack[proc->callstack_depth - 1].is_syscall) { |
| + proc->callstack[proc->callstack_depth - 1].is_syscall && |
| + proc->callstack[proc->callstack_depth - 1].c_un.syscall == *sysnum) { |
| return 2; |
| } |
| |
| --- ltrace-0.5.2.orig/sysdeps/linux-gnu/ia64/trace.c |
| +++ ltrace-0.5.2/sysdeps/linux-gnu/ia64/trace.c |
| @@ -106,8 +106,8 @@ |
| if (insn == 0x1000000000 || insn == 0x1ffffffffff) { |
| *sysnum = r15; |
| if (proc->callstack_depth > 0 && |
| - proc->callstack[proc->callstack_depth - |
| - 1].is_syscall) { |
| + proc->callstack[proc->callstack_depth - 1].is_syscall && |
| + proc->callstack[proc->callstack_depth - 1].c_un.syscall == *sysnum) { |
| return 2; |
| } |
| return 1; |
| --- ltrace-0.5.2.orig/sysdeps/linux-gnu/m68k/trace.c |
| +++ ltrace-0.5.2/sysdeps/linux-gnu/m68k/trace.c |
| @@ -36,9 +36,8 @@ |
| if (*sysnum >= 0) { |
| depth = proc->callstack_depth; |
| if (depth > 0 && |
| - proc->callstack[depth - 1].is_syscall && |
| - proc->callstack[depth - 1].c_un.syscall == |
| - *sysnum) { |
| + proc->callstack[depth - 1].is_syscall && |
| + proc->callstack[depth - 1].c_un.syscall == *sysnum) { |
| return 2; |
| } else { |
| return 1; |
| --- ltrace-0.5.2.orig/sysdeps/linux-gnu/alpha/trace.c |
| +++ ltrace-0.5.2/sysdeps/linux-gnu/alpha/trace.c |
| @@ -36,8 +36,9 @@ |
| return 0; |
| *sysnum = |
| ptrace(PTRACE_PEEKUSER, proc->pid, 0 /* REG_R0 */ , 0); |
| - if (proc->callstack_depth > 0 |
| - && proc->callstack[proc->callstack_depth - 1].is_syscall) { |
| + if (proc->callstack_depth > 0 && |
| + proc->callstack[proc->callstack_depth - 1].is_syscall && |
| + proc->callstack[proc->callstack_depth - 1].c_un.syscall == *sysnum) { |
| return 2; |
| } |
| if (*sysnum >= 0 && *sysnum < 500) { |
| --- ltrace-0.5.2.orig/sysdeps/linux-gnu/sparc/trace.c |
| +++ ltrace-0.5.2/sysdeps/linux-gnu/sparc/trace.c |
| @@ -33,9 +33,9 @@ |
| insn = ptrace(PTRACE_PEEKTEXT, proc->pid, ip, 0); |
| if ((insn & 0xc1f8007f) == 0x81d00010) { |
| *sysnum = ((proc_archdep *) proc->arch_ptr)->regs.r_g1; |
| - if ((proc->callstack_depth > 0) |
| - && proc->callstack[proc->callstack_depth - |
| - 1].is_syscall) { |
| + if (proc->callstack_depth > 0 && |
| + proc->callstack[proc->callstack_depth - 1].is_syscall && |
| + proc->callstack[proc->callstack_depth - 1].c_un.syscall == *sysnum) { |
| return 2; |
| } else if (*sysnum >= 0) { |
| return 1; |
| --- ltrace-0.5.2.orig/sysdeps/linux-gnu/mipsel/trace.c |
| +++ ltrace-0.5.2/sysdeps/linux-gnu/mipsel/trace.c |
| @@ -60,33 +60,34 @@ |
| int |
| syscall_p(Process *proc, int status, int *sysnum) { |
| if (WIFSTOPPED(status) |
| - && WSTOPSIG(status) == (SIGTRAP | proc->tracesysgood)) { |
| - /* get the user's pc (plus 8) */ |
| - long pc = (long)get_instruction_pointer(proc); |
| - /* fetch the SWI instruction */ |
| - int insn = ptrace(PTRACE_PEEKTEXT, proc->pid, pc - 4, 0); |
| - int num = ptrace(PTRACE_PEEKTEXT, proc->pid, pc - 8, 0); |
| - |
| -/* |
| - On a mipsel, syscall looks like: |
| - 24040fa1 li v0, 0x0fa1 # 4001 --> _exit syscall |
| - 0000000c syscall |
| - */ |
| - if(insn!=0x0000000c){ |
| - return 0; |
| - } |
| - |
| - *sysnum = (num & 0xFFFF) - 4000; |
| - /* if it is a syscall, return 1 or 2 */ |
| - if (proc->callstack_depth > 0 && |
| - proc->callstack[proc->callstack_depth - 1].is_syscall) { |
| - return 2; |
| - } |
| - |
| - if (*sysnum >= 0) { |
| - return 1; |
| - } |
| - } |
| + && WSTOPSIG(status) == (SIGTRAP | proc->tracesysgood)) { |
| + /* get the user's pc (plus 8) */ |
| + long pc = (long)get_instruction_pointer(proc); |
| + /* fetch the SWI instruction */ |
| + int insn = ptrace(PTRACE_PEEKTEXT, proc->pid, pc - 4, 0); |
| + int num = ptrace(PTRACE_PEEKTEXT, proc->pid, pc - 8, 0); |
| + |
| + /* |
| + On a mipsel, syscall looks like: |
| + 24040fa1 li v0, 0x0fa1 # 4001 --> _exit syscall |
| + 0000000c syscall |
| + */ |
| + if(insn!=0x0000000c){ |
| + return 0; |
| + } |
| + |
| + *sysnum = (num & 0xFFFF) - 4000; |
| + /* if it is a syscall, return 1 or 2 */ |
| + if (proc->callstack_depth > 0 && |
| + proc->callstack[proc->callstack_depth - 1].is_syscall && |
| + proc->callstack[proc->callstack_depth - 1].c_un.syscall == *sysnum) { |
| + return 2; |
| + } |
| + |
| + if (*sysnum >= 0) { |
| + return 1; |
| + } |
| + } |
| return 0; |
| } |
| /** |
| @@ -119,34 +120,34 @@ |
| */ |
| long |
| gimme_arg(enum tof type, Process *proc, int arg_num, arg_type_info *info) { |
| - long ret; |
| - debug(2,"type %d arg %d",type,arg_num); |
| - if (type == LT_TOF_FUNCTION || type == LT_TOF_SYSCALL){ |
| - if(arg_num <4){ |
| - ret=ptrace(PTRACE_PEEKUSER,proc->pid,off_a0+arg_num,0); |
| - debug(2,"ret = %#lx",ret); |
| - return ret; |
| - } else { |
| - // If we need this, I think we can look at [sp+16] for arg_num==4. |
| - CP; |
| - return 0; |
| - } |
| - } |
| - if(arg_num>=0){ |
| - fprintf(stderr,"args on return?"); |
| - } |
| - if(type == LT_TOF_FUNCTIONR) { |
| - return ptrace(PTRACE_PEEKUSER,proc->pid,off_v0,0); |
| - } |
| - if (type == LT_TOF_SYSCALLR) { |
| - unsigned a3=ptrace(PTRACE_PEEKUSER, proc->pid,off_a3,0); |
| - unsigned v0=ptrace(PTRACE_PEEKUSER, proc->pid,off_v0,0); |
| - if(!a3){ |
| - return v0; |
| - } |
| - return -1; |
| - } |
| - fprintf(stderr, "gimme_arg called with wrong arguments\n"); |
| + long ret; |
| + debug(2,"type %d arg %d",type,arg_num); |
| + if (type == LT_TOF_FUNCTION || type == LT_TOF_SYSCALL){ |
| + if(arg_num <4){ |
| + ret=ptrace(PTRACE_PEEKUSER,proc->pid,off_a0+arg_num,0); |
| + debug(2,"ret = %#lx",ret); |
| + return ret; |
| + } else { |
| + // If we need this, I think we can look at [sp+16] for arg_num==4. |
| + CP; |
| + return 0; |
| + } |
| + } |
| + if(arg_num>=0){ |
| + fprintf(stderr,"args on return?"); |
| + } |
| + if(type == LT_TOF_FUNCTIONR) { |
| + return ptrace(PTRACE_PEEKUSER,proc->pid,off_v0,0); |
| + } |
| + if (type == LT_TOF_SYSCALLR) { |
| + unsigned a3=ptrace(PTRACE_PEEKUSER, proc->pid,off_a3,0); |
| + unsigned v0=ptrace(PTRACE_PEEKUSER, proc->pid,off_v0,0); |
| + if(!a3){ |
| + return v0; |
| + } |
| + return -1; |
| + } |
| + fprintf(stderr, "gimme_arg called with wrong arguments\n"); |
| return 0; |
| } |
| |
| --- ltrace-0.5.2.orig/sysdeps/linux-gnu/x86_64/trace.c |
| +++ ltrace-0.5.2/sysdeps/linux-gnu/x86_64/trace.c |
| @@ -41,7 +41,8 @@ |
| *sysnum = ptrace(PTRACE_PEEKUSER, proc->pid, 8 * ORIG_RAX, 0); |
| |
| if (proc->callstack_depth > 0 && |
| - proc->callstack[proc->callstack_depth - 1].is_syscall) { |
| + proc->callstack[proc->callstack_depth - 1].is_syscall && |
| + proc->callstack[proc->callstack_depth - 1].c_un.syscall == *sysnum) { |
| return 2; |
| } |
| |