patches/ltrace/0.5.2/120-debian-ltrace-0.5.2-2.patch
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sun Jan 17 23:06:02 2010 +0100 (2010-01-17)
changeset 1740 c57458bb354d
permissions -rw-r--r--
configure: do not require hg when configuring in an hg clone

When configuring in an hg clone, we need hg to compute the version string.
It can happen that users do not have Mercurial (eg. if they got a snapshot
rather that they did a full clone). In this case, we can still run, of
course, so simply fill the version string with a sufficiently explicit
value, that does not require hg. The date is a good candidate.
yann@1437
     1
--- ltrace-0.5.2.orig/TODO
yann@1437
     2
+++ ltrace-0.5.2/TODO
yann@1437
     3
@@ -37,3 +37,4 @@
yann@1437
     4
 * debug: change "-d" option to be something like "-d elf,events", or "-d breakpoints"
yann@1437
     5
 * Find out if a process is sharing memory with its parent?
yann@1437
     6
 * When using -p, find out if that process is sharing memory with other procs
yann@1437
     7
+* After a clone(), syscalls may be seen as sysrets in s390 (see trace.c:syscall_p())
yann@1437
     8
--- ltrace-0.5.2.orig/process_event.c
yann@1437
     9
+++ ltrace-0.5.2/process_event.c
yann@1437
    10
@@ -170,7 +170,7 @@
yann@1437
    11
 			enable_breakpoint(proc->pid, proc->breakpoint_being_enabled);
yann@1437
    12
 			proc->breakpoint_being_enabled = NULL;
yann@1437
    13
 		}
yann@1437
    14
-		if (proc->parent->state == STATE_ATTACHED && options.follow) {
yann@1437
    15
+		if (options.follow) {
yann@1437
    16
 			proc->state = STATE_ATTACHED;
yann@1437
    17
 		} else {
yann@1437
    18
 			proc->state = STATE_IGNORED;
yann@1437
    19
--- ltrace-0.5.2.orig/sysdeps/linux-gnu/ppc/trace.c
yann@1437
    20
+++ ltrace-0.5.2/sysdeps/linux-gnu/ppc/trace.c
yann@1437
    21
@@ -50,9 +50,9 @@
yann@1437
    22
 			*sysnum =
yann@1437
    23
 			    (int)ptrace(PTRACE_PEEKUSER, proc->pid,
yann@1437
    24
 					sizeof(long) * PT_R0, 0);
yann@1437
    25
-			if (proc->callstack_depth > 0
yann@1437
    26
-			    && proc->callstack[proc->callstack_depth -
yann@1437
    27
-					       1].is_syscall) {
yann@1437
    28
+			if (proc->callstack_depth > 0 &&
yann@1437
    29
+					proc->callstack[proc->callstack_depth - 1].is_syscall &&
yann@1437
    30
+					proc->callstack[proc->callstack_depth - 1].c_un.syscall == *sysnum) {
yann@1437
    31
 				return 2;
yann@1437
    32
 			}
yann@1437
    33
 			return 1;
yann@1437
    34
--- ltrace-0.5.2.orig/sysdeps/linux-gnu/i386/trace.c
yann@1437
    35
+++ ltrace-0.5.2/sysdeps/linux-gnu/i386/trace.c
yann@1437
    36
@@ -32,7 +32,8 @@
yann@1437
    37
 		*sysnum = ptrace(PTRACE_PEEKUSER, proc->pid, 4 * ORIG_EAX, 0);
yann@1437
    38
 
yann@1437
    39
 		if (proc->callstack_depth > 0 &&
yann@1437
    40
-		    proc->callstack[proc->callstack_depth - 1].is_syscall) {
yann@1437
    41
+				proc->callstack[proc->callstack_depth - 1].is_syscall &&
yann@1437
    42
+				proc->callstack[proc->callstack_depth - 1].c_un.syscall == *sysnum) {
yann@1437
    43
 			return 2;
yann@1437
    44
 		}
yann@1437
    45
 
yann@1437
    46
--- ltrace-0.5.2.orig/sysdeps/linux-gnu/ia64/trace.c
yann@1437
    47
+++ ltrace-0.5.2/sysdeps/linux-gnu/ia64/trace.c
yann@1437
    48
@@ -106,8 +106,8 @@
yann@1437
    49
 		if (insn == 0x1000000000 || insn == 0x1ffffffffff) {
yann@1437
    50
 			*sysnum = r15;
yann@1437
    51
 			if (proc->callstack_depth > 0 &&
yann@1437
    52
-			    proc->callstack[proc->callstack_depth -
yann@1437
    53
-					    1].is_syscall) {
yann@1437
    54
+				proc->callstack[proc->callstack_depth - 1].is_syscall &&
yann@1437
    55
+				proc->callstack[proc->callstack_depth - 1].c_un.syscall == *sysnum) {
yann@1437
    56
 				return 2;
yann@1437
    57
 			}
yann@1437
    58
 			return 1;
yann@1437
    59
--- ltrace-0.5.2.orig/sysdeps/linux-gnu/m68k/trace.c
yann@1437
    60
+++ ltrace-0.5.2/sysdeps/linux-gnu/m68k/trace.c
yann@1437
    61
@@ -36,9 +36,8 @@
yann@1437
    62
 		if (*sysnum >= 0) {
yann@1437
    63
 			depth = proc->callstack_depth;
yann@1437
    64
 			if (depth > 0 &&
yann@1437
    65
-			    proc->callstack[depth - 1].is_syscall &&
yann@1437
    66
-			    proc->callstack[depth - 1].c_un.syscall ==
yann@1437
    67
-			    *sysnum) {
yann@1437
    68
+					proc->callstack[depth - 1].is_syscall &&
yann@1437
    69
+					proc->callstack[depth - 1].c_un.syscall == *sysnum) {
yann@1437
    70
 				return 2;
yann@1437
    71
 			} else {
yann@1437
    72
 				return 1;
yann@1437
    73
--- ltrace-0.5.2.orig/sysdeps/linux-gnu/alpha/trace.c
yann@1437
    74
+++ ltrace-0.5.2/sysdeps/linux-gnu/alpha/trace.c
yann@1437
    75
@@ -36,8 +36,9 @@
yann@1437
    76
 			return 0;
yann@1437
    77
 		*sysnum =
yann@1437
    78
 		    ptrace(PTRACE_PEEKUSER, proc->pid, 0 /* REG_R0 */ , 0);
yann@1437
    79
-		if (proc->callstack_depth > 0
yann@1437
    80
-		    && proc->callstack[proc->callstack_depth - 1].is_syscall) {
yann@1437
    81
+		if (proc->callstack_depth > 0 &&
yann@1437
    82
+		    proc->callstack[proc->callstack_depth - 1].is_syscall &&
yann@1437
    83
+			proc->callstack[proc->callstack_depth - 1].c_un.syscall == *sysnum) {
yann@1437
    84
 			return 2;
yann@1437
    85
 		}
yann@1437
    86
 		if (*sysnum >= 0 && *sysnum < 500) {
yann@1437
    87
--- ltrace-0.5.2.orig/sysdeps/linux-gnu/sparc/trace.c
yann@1437
    88
+++ ltrace-0.5.2/sysdeps/linux-gnu/sparc/trace.c
yann@1437
    89
@@ -33,9 +33,9 @@
yann@1437
    90
 		insn = ptrace(PTRACE_PEEKTEXT, proc->pid, ip, 0);
yann@1437
    91
 		if ((insn & 0xc1f8007f) == 0x81d00010) {
yann@1437
    92
 			*sysnum = ((proc_archdep *) proc->arch_ptr)->regs.r_g1;
yann@1437
    93
-			if ((proc->callstack_depth > 0)
yann@1437
    94
-			    && proc->callstack[proc->callstack_depth -
yann@1437
    95
-					       1].is_syscall) {
yann@1437
    96
+			if (proc->callstack_depth > 0 &&
yann@1437
    97
+					proc->callstack[proc->callstack_depth - 1].is_syscall &&
yann@1437
    98
+					proc->callstack[proc->callstack_depth - 1].c_un.syscall == *sysnum) {
yann@1437
    99
 				return 2;
yann@1437
   100
 			} else if (*sysnum >= 0) {
yann@1437
   101
 				return 1;
yann@1437
   102
--- ltrace-0.5.2.orig/sysdeps/linux-gnu/mipsel/trace.c
yann@1437
   103
+++ ltrace-0.5.2/sysdeps/linux-gnu/mipsel/trace.c
yann@1437
   104
@@ -60,33 +60,34 @@
yann@1437
   105
 int
yann@1437
   106
 syscall_p(Process *proc, int status, int *sysnum) {
yann@1437
   107
 	if (WIFSTOPPED(status)
yann@1437
   108
-	    && WSTOPSIG(status) == (SIGTRAP | proc->tracesysgood)) {
yann@1437
   109
-       /* get the user's pc (plus 8) */
yann@1437
   110
-       long pc = (long)get_instruction_pointer(proc);
yann@1437
   111
-       /* fetch the SWI instruction */
yann@1437
   112
-       int insn = ptrace(PTRACE_PEEKTEXT, proc->pid, pc - 4, 0);
yann@1437
   113
-       int num = ptrace(PTRACE_PEEKTEXT, proc->pid, pc - 8, 0);
yann@1437
   114
-       
yann@1437
   115
-/*
yann@1437
   116
-  On a mipsel,  syscall looks like:
yann@1437
   117
-  24040fa1    li v0, 0x0fa1   # 4001 --> _exit syscall
yann@1437
   118
-  0000000c    syscall
yann@1437
   119
- */
yann@1437
   120
-      if(insn!=0x0000000c){
yann@1437
   121
-          return 0;
yann@1437
   122
-      }
yann@1437
   123
-
yann@1437
   124
-      *sysnum = (num & 0xFFFF) - 4000;
yann@1437
   125
-      /* if it is a syscall, return 1 or 2 */
yann@1437
   126
-      if (proc->callstack_depth > 0 &&
yann@1437
   127
-          proc->callstack[proc->callstack_depth - 1].is_syscall) {
yann@1437
   128
-          return 2;
yann@1437
   129
-      }
yann@1437
   130
-      
yann@1437
   131
-      if (*sysnum >= 0) {
yann@1437
   132
-          return 1;
yann@1437
   133
-      }
yann@1437
   134
-   }
yann@1437
   135
+			&& WSTOPSIG(status) == (SIGTRAP | proc->tracesysgood)) {
yann@1437
   136
+		/* get the user's pc (plus 8) */
yann@1437
   137
+		long pc = (long)get_instruction_pointer(proc);
yann@1437
   138
+		/* fetch the SWI instruction */
yann@1437
   139
+		int insn = ptrace(PTRACE_PEEKTEXT, proc->pid, pc - 4, 0);
yann@1437
   140
+		int num = ptrace(PTRACE_PEEKTEXT, proc->pid, pc - 8, 0);
yann@1437
   141
+
yann@1437
   142
+		/*
yann@1437
   143
+		   On a mipsel,  syscall looks like:
yann@1437
   144
+		   24040fa1    li v0, 0x0fa1   # 4001 --> _exit syscall
yann@1437
   145
+		   0000000c    syscall
yann@1437
   146
+		 */
yann@1437
   147
+		if(insn!=0x0000000c){
yann@1437
   148
+			return 0;
yann@1437
   149
+		}
yann@1437
   150
+
yann@1437
   151
+		*sysnum = (num & 0xFFFF) - 4000;
yann@1437
   152
+		/* if it is a syscall, return 1 or 2 */
yann@1437
   153
+		if (proc->callstack_depth > 0 &&
yann@1437
   154
+				proc->callstack[proc->callstack_depth - 1].is_syscall &&
yann@1437
   155
+				proc->callstack[proc->callstack_depth - 1].c_un.syscall == *sysnum) {
yann@1437
   156
+			return 2;
yann@1437
   157
+		}
yann@1437
   158
+
yann@1437
   159
+		if (*sysnum >= 0) {
yann@1437
   160
+			return 1;
yann@1437
   161
+		}
yann@1437
   162
+	}
yann@1437
   163
 	return 0;
yann@1437
   164
 }
yann@1437
   165
 /**
yann@1437
   166
@@ -119,34 +120,34 @@
yann@1437
   167
 */
yann@1437
   168
 long
yann@1437
   169
 gimme_arg(enum tof type, Process *proc, int arg_num, arg_type_info *info) {
yann@1437
   170
-    long ret;
yann@1437
   171
-    debug(2,"type %d arg %d",type,arg_num);
yann@1437
   172
-    if (type == LT_TOF_FUNCTION || type == LT_TOF_SYSCALL){
yann@1437
   173
-        if(arg_num <4){
yann@1437
   174
-            ret=ptrace(PTRACE_PEEKUSER,proc->pid,off_a0+arg_num,0);
yann@1437
   175
-            debug(2,"ret = %#lx",ret);
yann@1437
   176
-            return ret;
yann@1437
   177
-        } else {
yann@1437
   178
-            // If we need this, I think we can look at [sp+16] for arg_num==4.
yann@1437
   179
-            CP;
yann@1437
   180
-            return 0;
yann@1437
   181
-        }
yann@1437
   182
-    } 
yann@1437
   183
-    if(arg_num>=0){
yann@1437
   184
-       fprintf(stderr,"args on return?");
yann@1437
   185
-    }
yann@1437
   186
-    if(type == LT_TOF_FUNCTIONR) {
yann@1437
   187
-        return  ptrace(PTRACE_PEEKUSER,proc->pid,off_v0,0);
yann@1437
   188
-    }
yann@1437
   189
-    if (type == LT_TOF_SYSCALLR) {
yann@1437
   190
-        unsigned a3=ptrace(PTRACE_PEEKUSER, proc->pid,off_a3,0);
yann@1437
   191
-        unsigned v0=ptrace(PTRACE_PEEKUSER, proc->pid,off_v0,0);
yann@1437
   192
-        if(!a3){
yann@1437
   193
-            return v0;
yann@1437
   194
-        }
yann@1437
   195
-        return -1;
yann@1437
   196
-    }
yann@1437
   197
-    fprintf(stderr, "gimme_arg called with wrong arguments\n");
yann@1437
   198
+	long ret;
yann@1437
   199
+	debug(2,"type %d arg %d",type,arg_num);
yann@1437
   200
+	if (type == LT_TOF_FUNCTION || type == LT_TOF_SYSCALL){
yann@1437
   201
+		if(arg_num <4){
yann@1437
   202
+			ret=ptrace(PTRACE_PEEKUSER,proc->pid,off_a0+arg_num,0);
yann@1437
   203
+			debug(2,"ret = %#lx",ret);
yann@1437
   204
+			return ret;
yann@1437
   205
+		} else {
yann@1437
   206
+			// If we need this, I think we can look at [sp+16] for arg_num==4.
yann@1437
   207
+			CP;
yann@1437
   208
+			return 0;
yann@1437
   209
+		}
yann@1437
   210
+	} 
yann@1437
   211
+	if(arg_num>=0){
yann@1437
   212
+		fprintf(stderr,"args on return?");
yann@1437
   213
+	}
yann@1437
   214
+	if(type == LT_TOF_FUNCTIONR) {
yann@1437
   215
+		return  ptrace(PTRACE_PEEKUSER,proc->pid,off_v0,0);
yann@1437
   216
+	}
yann@1437
   217
+	if (type == LT_TOF_SYSCALLR) {
yann@1437
   218
+		unsigned a3=ptrace(PTRACE_PEEKUSER, proc->pid,off_a3,0);
yann@1437
   219
+		unsigned v0=ptrace(PTRACE_PEEKUSER, proc->pid,off_v0,0);
yann@1437
   220
+		if(!a3){
yann@1437
   221
+			return v0;
yann@1437
   222
+		}
yann@1437
   223
+		return -1;
yann@1437
   224
+	}
yann@1437
   225
+	fprintf(stderr, "gimme_arg called with wrong arguments\n");
yann@1437
   226
 	return 0;
yann@1437
   227
 }
yann@1437
   228
 
yann@1437
   229
--- ltrace-0.5.2.orig/sysdeps/linux-gnu/x86_64/trace.c
yann@1437
   230
+++ ltrace-0.5.2/sysdeps/linux-gnu/x86_64/trace.c
yann@1437
   231
@@ -41,7 +41,8 @@
yann@1437
   232
 		*sysnum = ptrace(PTRACE_PEEKUSER, proc->pid, 8 * ORIG_RAX, 0);
yann@1437
   233
 
yann@1437
   234
 		if (proc->callstack_depth > 0 &&
yann@1437
   235
-		    proc->callstack[proc->callstack_depth - 1].is_syscall) {
yann@1437
   236
+				proc->callstack[proc->callstack_depth - 1].is_syscall &&
yann@1437
   237
+				proc->callstack[proc->callstack_depth - 1].c_un.syscall == *sysnum) {
yann@1437
   238
 			return 2;
yann@1437
   239
 		}
yann@1437
   240