Open MPI logo

Open MPI Development Mailing List Archives

  |   Home   |   Support   |   FAQ   |   all Development mailing list

From: Brooks Davis (brooks_at_[hidden])
Date: 2005-10-12 13:07:51

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

> > 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;
 #ifdef ILL_ILLOPN
             case ILL_ILLOPN: str = "ILL_ILLOPN"; break;
 #ifdef ILL_ILLADR
             case ILL_ILLADR: str = "ILL_ILLADR"; break;
+#ifdef ILL_ILLTRP
             case ILL_ILLTRP: str = "ILL_ILLTRP"; break;
+#ifdef ILL_PRVOPC
             case ILL_PRVOPC: str = "ILL_PRVOPC"; break;
 #ifdef ILL_PRVREG
             case ILL_PRVREG: str = "ILL_PRVREG"; break;
@@ -129,14 +135,20 @@
       case SIGSEGV:
         switch (info->si_code)
             case SEGV_MAPERR: str = "SEGV_MAPERR"; break;
             case SEGV_ACCERR: str = "SEGV_ACCERR"; break;
       case SIGBUS:
         switch (info->si_code)
+#ifdef BUS_ADRALN
             case BUS_ADRALN: str = "BUS_ADRALN"; break;
             case BUS_ADRERR: str = "BUS_ADRERR"; break;
@@ -159,12 +171,24 @@
       case SIGCHLD:
         switch (info->si_code)
+#ifdef CLD_EXITED
             case CLD_EXITED: str = "CLD_EXITED"; break;
+#ifdef CLD_KILLED
             case CLD_KILLED: str = "CLD_KILLED"; break;
+#ifdef CLD_DUMPED
             case CLD_DUMPED: str = "CLD_DUMPED"; break;
             case CLD_TRAPPED: str = "CLD_TRAPPED"; break;
             case CLD_STOPPED: str = "CLD_STOPPED"; break;
             case CLD_CONTINUED: str = "CLD_CONTINUED"; break;
 #ifdef SIGPOLL
@@ -197,6 +221,9 @@
 #ifdef SI_KERNEL
             case SI_KERNEL: str = "SI_KERNEL"; break;
+ case SI_UNDEFINED: str = "SI_UNDEFINED"; break;

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

  • application/pgp-signature attachment: stored