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