Subject: Re: unaligned access: how to track ?
To: Chris G. Demetriou <cgd@netbsd.org>
From: Manuel Bouyer <bouyer@antioche.lip6.fr>
List: port-alpha
Date: 06/07/2000 18:10:39
Ok, thanks to all who anserwed. Using gdb I've been able to track down the
offending line:
(gdb) list *0x12000288c
0x12000288c is in reset_host (statd.c:402).
397 DBT *key, *data;
398 void *ptr;
399 {
400 HostInfo *hi = data->data;
401
402 if (hi->monList) {
403 hi->notifyReqd = *(time_t *) data;
404 hi->attempts = 0;
405 hi->monList = NULL;
406 }
So it looks like hi may be unaligned ...
data->data is a void* ("DBT" type in db.h). The db type is hash.
I think data is initialised from (in libc/db/hash/hash.c line 816):
data->data = (u_char *)hashp->cpage->page + bp[ndx + 1];
I don't know how the hash db works, but we can note the following:
HostInfo is aligned (2 int and a pointer) so they can be stored contigously.
However key->data is a string (the host name) so it may have any length.
If keys and data are mixed and stored contigously in tehe file this will
cause miss-alignemnts.
This looks like the problem is in libc/db, but I'm not sure how to fix it and
anyway I don't have the time to look at it.
--
Manuel Bouyer, LIP6, Universite Paris VI. Manuel.Bouyer@lip6.fr
--