[CalendarServer-dev] Exception in recvfd --was: Re: continuing work on FreeBSD ports

Fredrik Unger fred at tree.se
Thu Feb 14 02:37:37 PST 2013


Hi,

> # cat /tmp/debug.dat.63406
> recvmsg: fd [27] [0] result [1]
> recvmsg: fd [25] [0] result [1]
> #

> 2. After the error occured:

> # cat /tmp/debug.dat.63431
> recvmsg: fd [24] [0] result [3]
> recvmsg: value:
> d 0 0 0
> ---
> Does this enlighten someone?
> I don't know why there are still empty debug files.

Empty debugfiles are probably due to that recvmsg is just used by a few 
threads, but all threads initialize the sendmsg module. (eg makes a file)

It might be easier to debug in sendfd.py.
Just log what sendfd sends and recvfd receives.
 From your output it looks like 3 bytes was sent and packedFD fails to 
unpack a 4 byte integer..



If this patch is used :
      recvmsg_result = recvmsg(fd, &message_header, flags);
+    fprintf(ddfp, "recvmsg: fd [%d] [%x] result [%x]\n",fd, flags, 
recvmsg_result);

It tells you that FD 24 without flags executed and the result was
3 (hex). (first not -1 which is an Error)

So I guess 3 hex, the recvmsg received 3 bytes.
13 0 0 in dec.

 From the top of my head I find it strange that just 3 bytes was received.
If I remember correctly my tests sent more (with sendmsg).

some partial debug output :
sendmsg [4] 13
sendmsg [37f1ffe8][37f1ffd8]
[14][00][00][00][00][00][00][00][01][00][00][00][01][00][00][00][0e][00][00][00](20) 


Here if I remember correctly the [0e][00][00][00] was the argument sent.
eg not to far away from your "d 0 0", but 3 bytes can not make an int.

entry = Py_BuildValue(
             "(iis#)",
             control_message->cmsg_level,
             control_message->cmsg_type,
             CMSG_DATA(control_message),
             (Py_ssize_t) (control_message->cmsg_len - sizeof(struct 
cmsghdr)));

Creates the message to python "(iis#)" means
"s#" (string) [char *, int]
Convert a C string and its length to a Python object. If the C string 
pointer is NULL, the length is ignored and None is returned.

You can print the full messages with something like :
+	    fprintf(ddfp, "sendmsg [%x][%x]\n", &cmsg_data, &control_message);
+	    for (i=0;i<control_message->cmsg_len;i++) {
+		    fprintf(ddfp, "[%02x]", ((char* )control_message)[i]);
+	    }
+	    fprintf(ddfp, "(%d)\n",i);

to see what is sent and received.

man sendmsg and recvmsg has some details to the stucts.

/Fred


More information about the calendarserver-dev mailing list