On Wed, Oct 12, 2005 at 08:58:30AM -0400, Jeff Squyres wrote: > On Oct 12, 2005, at 12:54 AM, Brooks Davis wrote: > > >> Can you elaborate on why you needed that? If there's a problem with > >> the stacktrace stuff on BSD, I'd like to make it either disable by > >> default or fix whatever is required to work properly on BSD. > > > > There were a bunch of undefined symbols that I didn't track down. > > Hopefully there's just a missing header file. I need to dig into it > > more. I just disabled it because I was hoping that would be the only > > issue. It wasn't but, I had stop working before I could try again > > with stack traces enabled. > > Ok. Right now, that section is only protected with #ifdef __GLIBC__, > so let us know what you find. The sooner, the better. :-)
After some investigation I've discovered there are two parts to this. First, the failure to compile is due to FreeBSD not defining a large portion of the si_code values in the decoding table. Overall the state of documentation of the FreeBSD si_code values is rather crappy so I've added #ifdef's around the ones that fail, but not attempted to add more values except SI_UNDEFINED. I've attached this bit (with this the system compiles with ./configure). Second, is actually supporting backtraces. It turns out there's a library to provide the glibc backtrace* API on BSD systems. I don't know which ones it works on or how good it is, but it's probably worth a short. The big change will be switching from __GLIBC__ to probing for libexecinfo, and the necessicary symbols. I'm taking a look at this now. > > On FreeBSD, eval is using 32-bit signed numbers internally on i386 (it > > looks like it uses longs in general, but I haven't tested on a 64-bit > > machine yet). This means that when you compute 2^31 you get INT_MAX + > > 1 > > which is negative. Subtracting one gives INT_MAX so you get the right > > value despite the sign weirdness. Assuming I'm correct about longs > > being used, we'll also be OK on 64-bit machines even if this code is > > used to compute the maximum value of a 64-bit signed integer. It won't > > work for unsigned numbers on either system though. > > Gotcha. This makes me nervous, though (negative to positive magic); it > seems like it might not work on all platforms. > > Another developer suggested just using a hex representation and avoid > this -- that seems to be simpler and much more portable (i.e., it > becomes string manipulation at this point, and doesn't depend on how > expr or the shell is implemented). I'm pretty sure this will work OK, but I agree that string manipulation gives a better feel. > Thanks -- and keep the bug reports coming! You're welcome. I hope to see FreeBSD on at least the unofficaly supported list by SC. > Aside: rc3 is coming shortly. We have some pending fixes that we want > to get in before cutting it, but there will likely also be an rc4 after > that because everything probably won't make the rc3 cutoff. Sounds good. Hopefully rc3 or rc4 will build out of the box. -- Brooks Index: stacktrace.c =================================================================== --- stacktrace.c (revision 7718) +++ stacktrace.c (working copy) @@ -87,15 +87,21 @@ case SIGILL: switch (info->si_code) { +#ifdef ILL_ILLOPC case ILL_ILLOPC: str = "ILL_ILLOPC"; break; +#endif #ifdef ILL_ILLOPN case ILL_ILLOPN: str = "ILL_ILLOPN"; break; #endif #ifdef ILL_ILLADR case ILL_ILLADR: str = "ILL_ILLADR"; break; #endif +#ifdef ILL_ILLTRP case ILL_ILLTRP: str = "ILL_ILLTRP"; break; +#endif +#ifdef ILL_PRVOPC case ILL_PRVOPC: str = "ILL_PRVOPC"; break; +#endif #ifdef ILL_PRVREG case ILL_PRVREG: str = "ILL_PRVREG"; break; #endif @@ -129,14 +135,20 @@ case SIGSEGV: switch (info->si_code) { +#ifdef SEGV_MAPERR case SEGV_MAPERR: str = "SEGV_MAPERR"; break; +#endif +#ifdef SEGV_ACCERR case SEGV_ACCERR: str = "SEGV_ACCERR"; break; +#endif } break; case SIGBUS: switch (info->si_code) { +#ifdef BUS_ADRALN case BUS_ADRALN: str = "BUS_ADRALN"; break; +#endif #ifdef BUSADRERR case BUS_ADRERR: str = "BUS_ADRERR"; break; #endif @@ -159,12 +171,24 @@ case SIGCHLD: switch (info->si_code) { +#ifdef CLD_EXITED case CLD_EXITED: str = "CLD_EXITED"; break; +#endif +#ifdef CLD_KILLED case CLD_KILLED: str = "CLD_KILLED"; break; +#endif +#ifdef CLD_DUMPED case CLD_DUMPED: str = "CLD_DUMPED"; break; +#endif +#ifdef CLD_WTRAPPED case CLD_TRAPPED: str = "CLD_TRAPPED"; break; +#endif +#ifdef CLD_STOPPED case CLD_STOPPED: str = "CLD_STOPPED"; break; +#endif +#ifdef CLD_CONTINUED case CLD_CONTINUED: str = "CLD_CONTINUED"; break; +#endif } break; #ifdef SIGPOLL @@ -197,6 +221,9 @@ #ifdef SI_KERNEL case SI_KERNEL: str = "SI_KERNEL"; break; #endif +#ifdef SI_UNDEFINED + case SI_UNDEFINED: str = "SI_UNDEFINED"; break; +#endif } } -- Any statement of the form "X is the one, true Y" is FALSE. PGP fingerprint 655D 519C 26A7 82E7 2529 9BF0 5D8E 8BE9 F238 1AD4
pgpADfPyeIXAp.pgp
Description: PGP signature