misc/134919: Additional detail for truss when tracing linux apps

Steven Hartland steven.hartland at multiplay.co.uk
Sun May 24 19:30:02 UTC 2009


>Number:         134919
>Category:       misc
>Synopsis:       Additional detail for truss when tracing linux apps
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          update
>Submitter-Id:   current-users
>Arrival-Date:   Sun May 24 19:30:01 UTC 2009
>Closed-Date:
>Last-Modified:
>Originator:     Steven Hartland
>Release:        7.2
>Organization:
Multiplay
>Environment:
FreeBSD ftp1.multiplay.co.uk 7.2-RELEASE FreeBSD 7.2-RELEASE #0: Sun May 24 19:21:08 BST 2009     root at ftp1.multiplay.co.uk:/usr/obj/usr/src/sys/MULTIPLAY  i386
>Description:
The following patch adds a number of additional tracing options for linux apps to truss
>How-To-Repeat:

>Fix:
Apply the attached patch :)

Patch attached with submission follows:

--- /usr/src/usr.bin/truss/syscall.h.orig	2007-04-10 05:03:34.000000000 +0100
+++ /usr/src/usr.bin/truss/syscall.h	2008-06-30 13:16:01.000000000 +0100
@@ -41,5 +41,5 @@
 	Umtx, Sigset, Sigprocmask, Kevent, Sockdomain, Socktype, Open,
 	Fcntlflag, Rusage, BinString, Shutdown, Resource, Rlimit, Timeval2,
-	Pathconf };
+	Pathconf, LinuxSockArgs };
 
 #define ARG_MASK	0xff
@@ -65,2 +65,49 @@
 void print_syscall_ret(struct trussinfo *, const char *, int, char **, int,
     long);
+
+/*
+ * Linux Socket defines
+ */
+#define LINUX_SOCKET        1
+#define LINUX_BIND      2
+#define LINUX_CONNECT       3
+#define LINUX_LISTEN        4
+#define LINUX_ACCEPT        5
+#define LINUX_GETSOCKNAME   6
+#define LINUX_GETPEERNAME   7
+#define LINUX_SOCKETPAIR    8
+#define LINUX_SEND      9
+#define LINUX_RECV      10
+#define LINUX_SENDTO        11
+#define LINUX_RECVFROM      12
+#define LINUX_SHUTDOWN      13
+#define LINUX_SETSOCKOPT    14
+#define LINUX_GETSOCKOPT    15
+#define LINUX_SENDMSG       16
+#define LINUX_RECVMSG       17 
+
+#define PAD_(t) (sizeof(register_t) <= sizeof(t) ? \
+        0 : sizeof(register_t) - sizeof(t))
+    
+#if BYTE_ORDER == LITTLE_ENDIAN
+#define PADL_(t)    0
+#define PADR_(t)    PAD_(t)
+#else
+#define PADL_(t)    PAD_(t)
+#define PADR_(t)    0
+#endif
+
+typedef int     l_int;
+typedef uint32_t    l_ulong;
+
+struct linux_socketcall_args {
+    char what_l_[PADL_(l_int)]; l_int what; char what_r_[PADR_(l_int)];
+    char args_l_[PADL_(l_ulong)]; l_ulong args; char args_r_[PADR_(l_ulong)];
+};
+
+/*
+struct linux_socketcall_args {
+	l_int what;
+	l_ulong args;
+};
+*/
--- syscalls.c.orig	2008-07-13 22:34:30.000000000 +0100
+++ syscalls.c	2008-11-22 02:27:12.000000000 +0000
@@ -96,4 +96,8 @@
 	{ "readlink", 1, 3,
 	  { { Name, 0 } , { Readlinkres | OUT, 1 }, { Int, 2 }}},
+	{ "linux_readlink", 1, 3,
+	  { { Name, 0 } , { Name | OUT, 1 }, { Int, 2 }}},
+	{ "linux_socketcall", 1, 2,
+	  { { Int, 0 } , { LinuxSockArgs, 1 }}},
 	{ "lseek", 2, 3,
 	  { {Int, 0}, {Quad, 1 + QUAD_ALIGN},
@@ -112,4 +116,6 @@
 	{ "linux_open", 1, 3,
 	  { { Name, 0 }, { Hex, 1}, { Octal, 2 }}},
+	{ "linux_mkdir", 1, 2,
+	  { { Name | IN, 0} , {Int, 1}}},
 	{ "close", 1, 1,
 	  { { Int, 0 } } },
@@ -136,4 +142,6 @@
 	{ "stat", 1, 2,
 	  { { Name | IN, 0 }, { Stat | OUT, 1 }}},
+	{ "linux_stat64", 1, 3,
+	  { { Name | IN, 0 }, { Ptr | OUT, 1 }, { Ptr | IN, 1 }}},
 	{ "lstat", 1, 2,
 	  { { Name | IN, 0 }, { Stat | OUT, 1 }}},
@@ -149,4 +157,5 @@
 	{ "exit", 0, 1, { { Hex, 0 }}},
 	{ "access", 1, 2, { { Name | IN, 0 }, { Int, 1 }}},
+	{ "linux_access", 1, 2, { { Name, 0 }, { Int, 1 }}},
 	{ "sigaction", 1, 3,
 	  { { Signal, 0 }, { Sigaction | IN, 1 }, { Sigaction | OUT, 2 }}},
@@ -667,4 +676,75 @@
     break;
   case Itimerval:
+  case LinuxSockArgs:
+	{
+
+		struct linux_socketcall_args largs;
+		if ( get_struct(pid, (void *)args[sc->offset], (void *)&largs, sizeof(largs)) == -1)
+		{
+			err(1, "get_struct %p", (void *)args[sc->offset]);
+		}
+		const char *what;
+		char buf[30];
+
+		switch (largs.what) {
+		case LINUX_SOCKET:
+			what = "LINUX_SOCKET";
+			break;
+		case LINUX_BIND:
+			what = "LINUX_BIND";
+			break;
+		case LINUX_CONNECT:
+			what = "LINUX_CONNECT";
+			break;
+		case LINUX_LISTEN:
+			what = "LINUX_LISTEN";
+			break;
+		case LINUX_ACCEPT:
+			what = "LINUX_ACCEPT";
+			break;
+		case LINUX_GETSOCKNAME:
+			what = "LINUX_GETSOCKNAME";
+			break;
+		case LINUX_GETPEERNAME:
+			what = "LINUX_GETPEERNAME";
+			break;
+		case LINUX_SOCKETPAIR:
+			what = "LINUX_SOCKETPAIR";
+			break;
+		case LINUX_SEND:   
+			what = "LINUX_SEND";
+			break;
+		case LINUX_RECV: 
+			what = "LINUX_RECV";
+			break;
+		case LINUX_SENDTO:
+			what = "LINUX_SENDTO";
+			break;
+		case LINUX_RECVFROM:
+			what = "LINUX_RECVFROM";
+			break;
+		case LINUX_SHUTDOWN:
+			what = "LINUX_SHUTDOWN";
+			break;
+		case LINUX_SETSOCKOPT:
+			what = "LINUX_SETSOCKOPT";
+			break;
+		case LINUX_GETSOCKOPT:
+			what = "LINUX_GETSOCKOPT";
+			break;
+		case LINUX_SENDMSG:
+			what = "LINUX_SENDMSG";
+			break;
+		case LINUX_RECVMSG:
+			what = "LINUX_RECVMSG";
+			break;
+		default:
+			sprintf( buf, "%d", largs.what );
+			what = buf;
+			break;
+		}
+		asprintf(&tmp, "(0x%lx)%s, 0x%lx", args[sc->offset], what, (long unsigned int)largs.args );
+	}
+	break;
     {
       struct itimerval itv;


>Release-Note:
>Audit-Trail:
>Unformatted:


More information about the freebsd-bugs mailing list