[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
960510: xdrposix_putlong() segmentation fault problems
- Subject: 960510: xdrposix_putlong() segmentation fault problems
- Date: Fri, 10 May 96 07:54:11 -0600
Dear Magnus Weis,
>Date: Fri, 10 May 1996 08:31:44 +0200
>From: Magnus Weis <address@hidden>
>Organization: .
>To: address@hidden
>Subject: segmentation fault problems with netCDF
>Keywords: 199605101037.AA26051
In the above message you wrote:
> > static bool_t
> > xdrposix_putlong(xdrs, lp)
> > XDR *xdrs;
> > internal_netlong *lp;
> > {
> > #if SWAP
> > # if SIZEOF_NETLONG != 4
> > # include Unhandled condition: line=__LINE__, file=__FILE__
> > # else
> > ==> netlong nl = htonl((netlong)*lp); <=== !!! HERE IT IS !!!
> >
>
> That's what gdb on my LINUX system gave me, really.
The above line should be enabled on a Linux system, since the *86 family
of CPU's are little endian.
> With AIX I got
>
> Program received signal SIGSEGV, Segmentation fault.
> 0x1000edc8 in _moveeq ()
>
> Has this system routine also something to do with xdr ?
>
I don't know. I would assume, however, that the above indicated line
isn't responsible since SWAP should be 0 or undefined on an RS6000.
>
> >Would you please do to the following:
> >
> > 1. Go to your top-level, netCDF source directory.
> >
> > 2. Send me the output from the following commands:
> >
> > uname -a
> > grep netlong config.status
> > grep NETLONG config.status
> > grep SWAP config.status
>
> OK, here it is:
>
> Linux wegener 1.3.97 #5 Thu May 2 09:05:19 MET DST 1996 i586
> ${ac_dA}INLINE${ac_dB}INLINE${ac_dC}netlong${ac_dD}
> ${ac_uA}INLINE${ac_uB}INLINE${ac_uC}netlong${ac_uD}
> ${ac_eA}INLINE${ac_eB}INLINE${ac_eC}netlong${ac_eD}
> ${ac_dA}NETLONG${ac_dB}NETLONG${ac_dC}long${ac_dD}
> ${ac_uA}NETLONG${ac_uB}NETLONG${ac_uC}long${ac_uD}
> ${ac_eA}NETLONG${ac_eB}NETLONG${ac_eC}long${ac_eD}
> ${ac_dA}SIZEOF_NETLONG${ac_dB}SIZEOF_NETLONG${ac_dC}4${ac_dD}
> ${ac_uA}SIZEOF_NETLONG${ac_uB}SIZEOF_NETLONG${ac_uC}4${ac_uD}
> ${ac_eA}SIZEOF_NETLONG${ac_eB}SIZEOF_NETLONG${ac_eC}4${ac_eD}
> ${ac_dA}INTERNAL_NETLONG${ac_dB}INTERNAL_NETLONG${ac_dC}long${ac_dD}
> ${ac_uA}INTERNAL_NETLONG${ac_uB}INTERNAL_NETLONG${ac_uC}long${ac_uD}
> ${ac_eA}INTERNAL_NETLONG${ac_eB}INTERNAL_NETLONG${ac_eC}long${ac_eD}
> ${ac_dA}SIZEOF_INTERNAL_NETLONG${ac_dB}SIZEOF_INTERNAL_NETLONG${ac_dC}4${ac_dD}
> ${ac_uA}SIZEOF_INTERNAL_NETLONG${ac_uB}SIZEOF_INTERNAL_NETLONG${ac_uC}4${ac_uD}
> ${ac_eA}SIZEOF_INTERNAL_NETLONG${ac_eB}SIZEOF_INTERNAL_NETLONG${ac_eC}4${ac_eD}
> ${ac_dA}SWAP${ac_dB}SWAP${ac_dC}1${ac_dD}
> ${ac_uA}SWAP${ac_uB}SWAP${ac_uC}1${ac_uD}
> ${ac_eA}SWAP${ac_eB}SWAP${ac_eC}1${ac_eD}
>
Ok. It looks like the configuration script worked for your system. A
`netlong' is a `long' and is 4 bytes. Internally, the XDR
implementation uses a 4-byte `long' to contain the 4 bytes of a
`netlong'. This is all correct.
I suspect that the `lp' pointer that is being handed to the
xdrposix_putlong() function is pointing to unallocated memory. Because
I have no way to check on that here, you'll have to do it. I suggest
that you recompile the netCDF library on the Linux system to support
symbolic debugging, run your program, and then backtrack from the
segmentation fault to see where the `lp' variable points.
Please let me know if this helps.
--------
Steve Emmerson <address@hidden>