diff -r 000000000000 -r b37804bfeba6 patches/ltrace/0.5.2/120-debian-ltrace-0.5.2-2.patch --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/patches/ltrace/0.5.2/120-debian-ltrace-0.5.2-2.patch Sun Aug 02 23:33:36 2009 +0200 @@ -0,0 +1,240 @@ +--- 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; + } +