[Ltrace-devel] r58 - in ltrace/trunk: . etc sysdeps sysdeps/linux-gnu

Ian Wienand ianw-guest at costa.debian.org
Mon Aug 7 02:50:43 UTC 2006


Author: ianw-guest
Date: 2006-08-07 02:50:42 +0000 (Mon, 07 Aug 2006)
New Revision: 58

Modified:
   ltrace/trunk/ChangeLog
   ltrace/trunk/display_args.c
   ltrace/trunk/etc/ltrace.conf
   ltrace/trunk/ltrace.h
   ltrace/trunk/read_config_file.c
   ltrace/trunk/sysdeps/README
   ltrace/trunk/sysdeps/linux-gnu/trace.c
Log:
pointer parameters


Modified: ltrace/trunk/ChangeLog
===================================================================
--- ltrace/trunk/ChangeLog	2006-08-07 02:37:33 UTC (rev 57)
+++ ltrace/trunk/ChangeLog	2006-08-07 02:50:42 UTC (rev 58)
@@ -1,3 +1,10 @@
+2006-08-07  Steve Fink  <sphink at gmail.com>
+
+	* display_args.c, etc/ltrace.conf, ltrace.h, read_config_file.c,
+	sysdeps/README, sysdeps/linux-gnu-trace.c : switch to passing
+	around values rather than argument numbers that need to be fetched
+	(needed for pointer params)
+
 2006-08-07  Steve Fink <sphink at gmail.com>
 
 	* display_args.c, etc/ltrace.conf, ltrace.h, read_config_file.c:

Modified: ltrace/trunk/display_args.c
===================================================================
--- ltrace/trunk/display_args.c	2006-08-07 02:37:33 UTC (rev 57)
+++ ltrace/trunk/display_args.c	2006-08-07 02:50:42 UTC (rev 58)
@@ -2,6 +2,7 @@
 #include "config.h"
 #endif
 
+#include <ctype.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -12,9 +13,10 @@
 
 static int display_char(int what);
 static int display_string(enum tof type, struct process *proc,
-			  int arg_num, arg_type_info *info,
-			  size_t maxlen);
-static int display_unknown(enum tof type, struct process *proc, int arg_num);
+			  void* addr, size_t maxlen);
+static int display_value(enum tof type, struct process *proc,
+			 long value, arg_type_info *info);
+static int display_unknown(enum tof type, struct process *proc, long value);
 static int display_format(enum tof type, struct process *proc, int arg_num);
 
 static int string_maxlength = INT_MAX;
@@ -26,12 +28,30 @@
     return gimme_arg(type, proc, -len_spec - 1);
 }
 
-int
-display_arg(enum tof type, struct process *proc,
-	    int arg_num, arg_type_info *info)
+static int display_pointer(enum tof type, struct process *proc, long value,
+			   arg_type_info * info)
 {
+    long pointed_to;
+    arg_type_info *inner = info->u.ptr_info.info;
+
+    if (value == 0)
+      return fprintf(output, "NULL");
+    else if (umovelong(proc, (void *) value, &pointed_to) < 0)
+      return fprintf(output, "?");
+    else
+      return display_value(type, proc, pointed_to, inner);
+}
+
+/* Args:
+   type - syscall or shared library function or memory
+   proc - information about the traced process
+   value - the value to display
+   info - the description of the type to display
+*/
+int display_value(enum tof type, struct process *proc,
+                  long value, arg_type_info *info)
+{
 	int tmp;
-	long arg;
 
 	switch (info->type) {
 	case ARGTYPE_VOID:
@@ -39,54 +59,64 @@
         case ARGTYPE_IGNORE:
         	return 0; /* Empty gap between commas */
 	case ARGTYPE_INT:
-		return fprintf(output, "%d",
-			       (int)gimme_arg(type, proc, arg_num));
+          return fprintf(output, "%d", (int) value);
 	case ARGTYPE_UINT:
-		return fprintf(output, "%u",
-			       (unsigned)gimme_arg(type, proc, arg_num));
+          return fprintf(output, "%u", (unsigned) value);
 	case ARGTYPE_LONG:
 		if (proc->mask_32bit)
-			return fprintf(output, "%d",
-				       (int)gimme_arg(type, proc, arg_num));
-		return fprintf(output, "%ld", gimme_arg(type, proc, arg_num));
+			return fprintf(output, "%d", (int) value);
+		else
+			return fprintf(output, "%ld", value);
 	case ARGTYPE_ULONG:
 		if (proc->mask_32bit)
-			return fprintf(output, "%u",
-				       (unsigned)gimme_arg(type, proc,
-							   arg_num));
-		return fprintf(output, "%lu",
-			       (unsigned long)gimme_arg(type, proc, arg_num));
+			return fprintf(output, "%u", (unsigned) value);
+		else
+			return fprintf(output, "%lu", (unsigned long) value);
 	case ARGTYPE_OCTAL:
-		return fprintf(output, "0%o",
-			       (unsigned)gimme_arg(type, proc, arg_num));
+		return fprintf(output, "0%o", (unsigned) value);
 	case ARGTYPE_CHAR:
 		tmp = fprintf(output, "'");
-		tmp += display_char((int)gimme_arg(type, proc, arg_num));
+		tmp += display_char(value == -1 ? value : (char) value);
 		tmp += fprintf(output, "'");
 		return tmp;
 	case ARGTYPE_ADDR:
-		arg = gimme_arg(type, proc, arg_num);
-		if (!arg) {
+		if (!value)
 			return fprintf(output, "NULL");
-		} else {
-			return fprintf(output, "%p", (void *)arg);
-		}
+		else
+			return fprintf(output, "0x%08lx", value);
 	case ARGTYPE_FORMAT:
-		return display_format(type, proc, arg_num);
+		fprintf(stderr, "Should never encounter a format anywhere but at the top level (for now?)\n");
+		exit(1);
 	case ARGTYPE_STRING:
-		return display_string(type, proc, arg_num, info,
+		return display_string(type, proc, (void*) value,
 				      string_maxlength);
 	case ARGTYPE_STRING_N:
-		return display_string(type, proc, arg_num, info,
+		return display_string(type, proc, (void*) value,
 				      get_length(type, proc,
 						 info->u.string_n_info.size_spec));
-	case ARGTYPE_UNKNOWN:
+	case ARGTYPE_POINTER:
+		return display_pointer(type, proc, value, info);
+ 	case ARGTYPE_UNKNOWN:
 	default:
-		return display_unknown(type, proc, arg_num);
+		return display_unknown(type, proc, value);
 	}
-	return fprintf(output, "?");
 }
 
+int display_arg(enum tof type, struct process *proc, int arg_num,
+		arg_type_info * info)
+{
+    long arg;
+
+    if (info->type == ARGTYPE_VOID) {
+	return 0;
+    } else if (info->type == ARGTYPE_FORMAT) {
+	return display_format(type, proc, arg_num);
+    } else {
+	arg = gimme_arg(type, proc, arg_num);
+	return display_value(type, proc, arg, info);
+    }
+}
+
 static int display_char(int what)
 {
 	switch (what) {
@@ -103,25 +133,23 @@
 	case '\\':
 		return fprintf(output, "\\\\");
 	default:
-		if ((what < 32) || (what > 126)) {
+		if (isprint(what)) {
+			return fprintf(output, "%c", what);
+		} else {
 			return fprintf(output, "\\%03o", (unsigned char)what);
-		} else {
-			return fprintf(output, "%c", what);
 		}
 	}
 }
 
 #define MIN(a,b) (((a)<(b)) ? (a) : (b))
 
-static int display_string(enum tof type, struct process *proc,
-			  int arg_num, arg_type_info *info, size_t maxlength)
+static int display_string(enum tof type, struct process *proc, void *addr,
+			  size_t maxlength)
 {
-	void *addr;
 	unsigned char *str1;
 	int i;
 	int len = 0;
 
-	addr = (void *)gimme_arg(type, proc, arg_num);
 	if (!addr) {
 		return fprintf(output, "NULL");
 	}
@@ -147,21 +175,17 @@
 	return len;
 }
 
-static int display_unknown(enum tof type, struct process *proc, int arg_num)
+static int display_unknown(enum tof type, struct process *proc, long value)
 {
-	long tmp;
-
-	tmp = gimme_arg(type, proc, arg_num);
-
 	if (proc->mask_32bit) {
-		if ((int)tmp < 1000000 && (int)tmp > -1000000)
-			return fprintf(output, "%d", (int)tmp);
+		if ((int)value < 1000000 && (int)value > -1000000)
+			return fprintf(output, "%d", (int)value);
 		else
-			return fprintf(output, "%p", (void *)tmp);
-	} else if (tmp < 1000000 && tmp > -1000000) {
-		return fprintf(output, "%ld", tmp);
+			return fprintf(output, "%p", (void *)value);
+	} else if (value < 1000000 && value > -1000000) {
+		return fprintf(output, "%ld", value);
 	} else {
-		return fprintf(output, "%p", (void *)tmp);
+		return fprintf(output, "%p", (void *)value);
 	}
 }
 
@@ -285,12 +309,12 @@
 					len += fprintf(output, "'");
 					break;
 				} else if (c == 's') {
-					arg_type_info *info =
-					    lookup_singleton(ARGTYPE_STRING);
 					len += fprintf(output, ", ");
 					len +=
 					    display_string(type, proc,
-							   ++arg_num, info,
+							   (void *)gimme_arg(type,
+									     proc,
+									     ++arg_num),
 							   string_maxlength);
 					break;
 				} else if (c == 'p' || c == 'n') {

Modified: ltrace/trunk/etc/ltrace.conf
===================================================================
--- ltrace/trunk/etc/ltrace.conf	2006-08-07 02:37:33 UTC (rev 57)
+++ ltrace/trunk/etc/ltrace.conf	2006-08-07 02:50:42 UTC (rev 58)
@@ -23,6 +23,7 @@
 ; string[arg0]	== (char *)			[same as string[retval]]
 ; string[N]     == (char *)             [N>0]   [show only up to N bytes]
 ; ignore	== (any)			[ignore arg, output blank]
+; type*		== (type *)			[pointer to any other type]
 
 ; Backwards-compatibility:
 ; string0	== (char *)			[same as string[retval]]
@@ -77,7 +78,7 @@
 int fnmatch(string, string, int);
 
 ; getopt.h
-int getopt_long(int,addr,string,addr,addr);
+int getopt_long(int,addr,string,addr,int*);
 int getopt_long_only(int,addr,string,addr,addr);
 
 ; grp.h

Modified: ltrace/trunk/ltrace.h
===================================================================
--- ltrace/trunk/ltrace.h	2006-08-07 02:37:33 UTC (rev 57)
+++ ltrace/trunk/ltrace.h	2006-08-07 02:50:42 UTC (rev 58)
@@ -43,6 +43,7 @@
 	ARGTYPE_STRING,		/* NUL-terminated string */
 	ARGTYPE_STRING_N,	/* String of known maxlen */
         ARGTYPE_IGNORE,		/* Leave parameter blank */
+        ARGTYPE_POINTER,	/* Pointer to some other type */
         ARGTYPE_COUNT		/* number of ARGTYPE_* values */
 };
 
@@ -53,6 +54,11 @@
 	struct {
 	    int size_spec;
 	} string_n_info;
+
+	// ARGTYPE_POINTER
+	struct {
+	    struct arg_type_info_t *info;
+	} ptr_info;
     } u;
 } arg_type_info;
 
@@ -206,6 +212,7 @@
 extern long gimme_arg(enum tof type, struct process *proc, int arg_num);
 extern void save_register_args(enum tof type, struct process *proc);
 extern int umovestr(struct process *proc, void *addr, int len, void *laddr);
+extern int umovelong(struct process *proc, void *addr, long *result);
 extern int ffcheck(void *maddr);
 extern void *sym2addr(struct process *, struct library_symbol *);
 

Modified: ltrace/trunk/read_config_file.c
===================================================================
--- ltrace/trunk/read_config_file.c	2006-08-07 02:37:33 UTC (rev 57)
+++ ltrace/trunk/read_config_file.c	2006-08-07 02:50:42 UTC (rev 58)
@@ -47,6 +47,7 @@
 	{ ARGTYPE_STRING },
 	{ ARGTYPE_STRING_N },
 	{ ARGTYPE_IGNORE },
+	{ ARGTYPE_POINTER },
 	{ ARGTYPE_UNKNOWN }
 };
 
@@ -64,7 +65,7 @@
 
 	while (tmp->name) {
 		if (!strncmp(*str, tmp->name, strlen(tmp->name))
-		    && index(" ,()#;012345[", *(*str + strlen(tmp->name)))) {
+		    && index(" ,()#*;012345[", *(*str + strlen(tmp->name)))) {
 			*str += strlen(tmp->name);
 			return lookup_singleton(tmp->pt);
 		}
@@ -169,7 +170,7 @@
     return n * multiplier;
 }
 
-static arg_type_info *parse_type(char **str)
+static arg_type_info *parse_nonpointer_type(char **str)
 {
 	arg_type_info *simple;
 	arg_type_info *info;
@@ -220,6 +221,19 @@
 	}
 }
 
+static arg_type_info *parse_type(char **str)
+{
+	arg_type_info *info = parse_nonpointer_type(str);
+	while (**str == '*') {
+		arg_type_info *outer = malloc(sizeof(*info));
+		outer->type = ARGTYPE_POINTER;
+		outer->u.ptr_info.info = info;
+		(*str)++;
+		info = outer;
+	}
+	return info;
+}
+
 static struct function *process_line(char *buf)
 {
 	struct function fun;

Modified: ltrace/trunk/sysdeps/README
===================================================================
--- ltrace/trunk/sysdeps/README	2006-08-07 02:37:33 UTC (rev 57)
+++ ltrace/trunk/sysdeps/README	2006-08-07 02:50:42 UTC (rev 58)
@@ -24,6 +24,7 @@
 void * get_return_addr(pid_t pid, void * stack_pointer);
 long gimme_arg(enum tof type, struct process * proc, int arg_num);
 int umovestr(struct process * proc, void * addr, int len, void * laddr);
+int umovelong(struct process * proc, void * addr, long * result);
 char * pid2name(pid_t pid);
 void trace_me(void);
 int trace_pid(pid_t pid);

Modified: ltrace/trunk/sysdeps/linux-gnu/trace.c
===================================================================
--- ltrace/trunk/sysdeps/linux-gnu/trace.c	2006-08-07 02:37:33 UTC (rev 57)
+++ ltrace/trunk/sysdeps/linux-gnu/trace.c	2006-08-07 02:50:42 UTC (rev 58)
@@ -151,6 +151,24 @@
 	}
 }
 
+/* Read a single long from the process's memory address 'addr' */
+int umovelong(struct process *proc, void *addr, long *result)
+{
+	long pointed_to;
+
+        errno = 0;
+        pointed_to = ptrace(PTRACE_PEEKTEXT, proc->pid, addr, 0);
+        if (pointed_to == -1 && errno)
+          return -errno;
+
+        *result = pointed_to;
+        return 0;
+}
+
+/* Read a series of bytes starting at the process's memory address
+   'addr' and continuing until a NUL ('\0') is seen or 'len' bytes
+   have been read.
+*/
 int umovestr(struct process *proc, void *addr, int len, void *laddr)
 {
 	union {




More information about the Ltrace-devel mailing list