[xsde-users] XSD/e Segment Fault RHEL 6 64-bit Release Mode Only

Bob O'Neil boneil at cinci.rr.com
Wed May 23 10:49:25 EDT 2012


A segment fault is generated during the execution of my application on the
RHEL 6 64-bit platform (version 6.2 and 6.3) in the release build only.
This has been proven true on separate platforms.

 

I am interested in any guidance you can provide to solve this issue.

 

My application is a Qt based console application (a Linux daemon), which
depends upon two Qt libraries (QtCore and QtNetwork).

 

The XML parsing code is auto-generated (as opposed to hand composed).

 

This does not occur in the debug mode, or a on a more recent platform such
as Fedora 16 (both debug and release).

 

Error seems to be for the callstack within the stl basic_string destructor.

 

The condition seems very similar to a recent posting on the board about the
release build of Qt with XSD/e and libstdc++ dynamic string allocation.

 

However, the solution posted (a define in the Makefile having to do with stl
string dynamic support), I do not have in my Makefile to remove. 

 

My makefile is autogenerated from a Qt project file.

 

The error callstack is as follows:

 

 

0    std::basic_string<char, std::char_traits<char>, std::allocator<char>
>::~basic_string()   /usr/lib64/libstdc++.so.6  0    0x37dc89d4b6    

1
projects::MDL::ValueUnitsType::choice1_arm(projects::MDL::ValueUnitsType::ch
oice1_arm_tag)           0    0x7f7a31   

2    projects::MDL::ValueUnitsType_pskel::sequence_0(unsigned long&,
unsigned long&, xsde::cxx::ro_string const&, xsde::cxx::ro_string const&,
bool)          0     0x782d84   

3
projects::MDL::ValueUnitsType_pskel::_start_element_impl(xsde::cxx::ro_strin
g const&, xsde::cxx::ro_string const&)       0    0x7831f6   

4    xsde::cxx::parser::validating::complex_content::_start_element
parser.cxx 300     0x89becd   

5    xsde::cxx::parser::expat::document_pimpl::start_element_   document.cxx
887     0x89aa4d   

6    doContent  xmlparse.c 2360 0x8ac01f   

7    contentProcessor     xmlparse.c 2022 0x8acfa7   

8    doProlog   xmlparse.c 3891 0x8ae9f5   

9    prologProcessor xmlparse.c 3625 0x8af9cc   

10   prologInitProcessor  xmlparse.c 3442 0x8af9cc   

11   XML_ParseBuffer xmlparse.c 1576 0x8a4132   

12   xsde::cxx::parser::expat::document_pimpl::parse document.cxx    401
0x89b5fd     

13   parse document.cxx    361  0x89baf1   

14   xsde::cxx::parser::expat::document_pimpl::parse document.cxx    278
0x89baf1     

15   xmlParserMDL::readAndValidateXML(char const*)        0    0x44469f   

16   MdlInterface::processMDL(char const*, char const*, char const*)      0
0x7e56df   

17   App::mdlImportDone(bool)        0    0x86e63d   

18   App::onStateUnconfiguredEntered()          0    0x42209c   

19   QMetaObject::activate(QObject*, QMetaObject const*, int, void**)
0     0x9dc9c8   

20   QStateMachinePrivate::enterStates(QEvent*, QList<QAbstractTransition*>
const&)         0    0x9ff580   

...  <More>                     

 

Issue is on RHEL 6 platform, not Fedora 16.

 

Under RHEL 6, the libstdc++ symbolic link is version 6.0.13.

 

/usr/lib64/libstdc++.so.6

/usr/lib64/libstdc++.so.6.0.13

 

Under Fedora 16, libstdc++ is version 6.0.16.

 

Application is based upon the Qt framework, version 4.8.1, is a console
application that depends upon two Qt libraries: QtCore and Qtnetwork.

 

An excerpt from the Makefile is as follows:

 

############################################################################
#

# Makefile for building: debug/lmd

# Generated by qmake (2.01a) (Qt 4.8.1) on: Mon May 21 00:57:49 2012

# Project:  lmd.pro

# Template: app

# Command: /usr/local/Trolltech/Qt-4.8.1/bin/qmake -spec
/usr/local/Trolltech/Qt-4.8.1/mkspecs/linux-g++ CONFIG+=debug CONFIG+=M64
CONFIG+=STATIC -o Makefile lmd.pro

############################################################################
#

 

####### Compiler, tools and options

 

CC            = gcc

CXX           = g++

DEFINES       = -DM64 -DDEBUG -DQT_NETWORK_LIB -DQT_CORE_LIB

CFLAGS        = -pipe -g -Wall -W -D_REENTRANT $(DEFINES)

CXXFLAGS      = -pipe -g -Wall -W -D_REENTRANT $(DEFINES)

INCPATH       = -I/usr/local/Trolltech/Qt-4.8.1/mkspecs/linux-g++ -I.
-I/usr/local/Trolltech/Qt-4.8.1/include/QtCore
-I/usr/local/Trolltech/Qt-4.8.1/include/QtNetwork
-I/usr/local/Trolltech/Qt-4.8.1/include -I/usr/include -I/opt/xsde/libxsde
-I.

LINK          = g++

LFLAGS        = 

LIBS          = $(SUBLIBS)  -L/usr/local/Trolltech/Qt-4.8.1/lib
-L/opt/xsde/libxsde/xsde -lxsde -L/usr/lib64 -lnetsnmpagent -lnetsnmpmibs
-lnetsnmp -lssl -lcrypto -L/lib64 -lQtNetwork
-L/usr/local/Trolltech/Qt-4.8.1/lib -lQtCore -lz -lm -ldl -pthread
-lgthread-2.0 -lrt -lglib-2.0 -lpthread 

AR            = ar cqs

RANLIB        = 

QMAKE         = /usr/local/Trolltech/Qt-4.8.1/bin/qmake

TAR           = tar -cf

COMPRESS      = gzip -9f

COPY          = cp -f

SED           = sed

COPY_FILE     = $(COPY)

COPY_DIR      = $(COPY) -r

STRIP         = strip

INSTALL_FILE  = install -m 644 -p

INSTALL_DIR   = $(COPY_DIR)

INSTALL_PROGRAM = install -m 755 -p

DEL_FILE      = rm -f

SYMLINK       = ln -f -s

DEL_DIR       = rmdir

MOVE          = mv -f

CHK_DIR_EXISTS= test -d

MKDIR         = mkdir -p

 

Shared libraries for the static built version of the application is as
follows, which is Net-SNMP libraries and operating system libraries.

 

ldd lmd

     linux-vdso.so.1 =>  (0x00007fffdb95f000)

     libnetsnmpagent.so.30 => /usr/lib/libnetsnmpagent.so.30
(0x00000037d3c00000)

     libnetsnmpmibs.so.30 => /usr/lib/libnetsnmpmibs.so.30
(0x00007fd48738e000)

     libnetsnmp.so.30 => /usr/lib/libnetsnmp.so.30 (0x00000037d3400000)

     libssl.so.10 => /usr/lib64/libssl.so.10 (0x00000037df800000)

     libcrypto.so.10 => /usr/lib64/libcrypto.so.10 (0x00000037dd000000)

     libz.so.1 => /lib64/libz.so.1 (0x00000037d3000000)

     libdl.so.2 => /lib64/libdl.so.2 (0x00000037d2800000)

     libgthread-2.0.so.0 => /lib64/libgthread-2.0.so.0 (0x00000037d5400000)

     librt.so.1 => /lib64/librt.so.1 (0x00007fd487183000)

     libglib-2.0.so.0 => /lib64/libglib-2.0.so.0 (0x00000037d3800000)

     libpthread.so.0 => /lib64/libpthread.so.0 (0x00000037d2c00000)

     libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00000037dc800000)

     libm.so.6 => /lib64/libm.so.6 (0x00000037d2000000)

     libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00000037dc000000)

     libc.so.6 => /lib64/libc.so.6 (0x00000037d2400000)

     /lib64/ld-linux-x86-64.so.2 (0x00000037d1c00000)

     libperl.so => /usr/lib64/perl5/CORE/libperl.so (0x00007fd486e16000)

     libresolv.so.2 => /lib64/libresolv.so.2 (0x00000037d4000000)

     libnsl.so.1 => /lib64/libnsl.so.1 (0x00000037e3800000)

     libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00000037e0800000)

     libutil.so.1 => /lib64/libutil.so.1 (0x00000037e1000000)

     libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00000037df400000)

     libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00000037de800000)

     libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00000037dcc00000)

     libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00000037de400000)

     libfreebl3.so => /lib64/libfreebl3.so (0x00000037e0000000)

     libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00000037dec00000)

     libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00000037dd800000)

     libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fd486bf2000)

 

Error occurs using the following XSD/e configuration file.   This is for the
Linux 64-bit platform.

However, the error occurs as well using an XSD/e build with the default
configuration file

(except for the changes to disable exceptions and setting the bit width to
64).

 

# Toolchain.

#

CC       := gcc

CFLAGS   := -m64 -pipe -g -Wall -W -D_REENTRANT -O3

CPPFLAGS :=

 

CXX      := g++

CXXFLAGS := -m64 -pipe -g -Wall -W -D_REENTRANT -O3

 

LD       := $(CXX)

LDFLAGS  := $(CXXFLAGS)

LIBS     :=

 

# Optional post-link command. The first argument to this command is

# the executable name and the rest of the arguments are the object

# files and libraries that were used to link this executable.

#

POSTLD   :=

 

# Set RANLIB to empty if your system does not need ranlib.

#

AR       := ar

ARFLAGS  := rc

RANLIB   := ranlib

 

 

# Common XSD/e flags.

#

XSDFLAGS := --generate-inline

 

 

# Platform. Valid values are:

#

# 'wince'  - Windows CE

# 'win32'  - Windows 2000, XP, etc.

# 'posix'  - POSIX OS, including UNIX/Linux, VxWorks, etc.

#

XSDE_PLATFORM     := posix

 

 

# Platform architecture width in bits.

#

XSDE_ARCH_WIDTH   := 64

 

 

# Platform byte order. Valid values are 'b' for big-endian and 'l'

# for little-endian.

#

XSDE_BYTEORDER    := l

 

 

# Application character encoding. Valid values are 'utf8' for UTF-8

# and 'iso8859-1' for ISO-8859-1. Note that this encoding is not

# the same as the XML document encoding that is being parsed or

# serialized. Rather, it is the encoding that is used inside the

# application. When an XML document is parsed, the character data

# is automatically converted to the application encoding. Similarly,

# when an XML document is serialized, the data in the application

# encoding is automatically converted to the resulting document

# encoding. Also don't forget to use the --char-encoding option

# when compiling your schemas if using an encoding other than UTF-8.

#

XSDE_ENCODING     := utf8

 

 

# Set to 'n' if you don't have STL (std::string, etc.). Also don't

# forget to use the --no-stl option when compiling your schemas.

#

XSDE_STL          := y

 

 

# Set to 'n' if you don't want iterators to conform to the STL

# requirements. This feature requires working <iterator> header

# and allows you to use the standard algorithms such as find_if,

# etc.

#

XSDE_STL_ITERATOR := y

 

 

# Set to 'n' if you don't have iostream.

#

XSDE_IOSTREAM     := y

 

 

# Set to 'n' if you don't have C++ exceptions. Also don't forget to

# use the --no-exceptions option when compiling your schemas.

#

XSDE_EXCEPTIONS   := n

 

 

# Set to 'n' if your platform doesn't have the "long long int" type or

# the strtoull function. Also don't forget to use the --no-long-long

# option when compiling your schemas.

#

XSDE_LONGLONG     := n

 

 

# Set to 'n' if your platform doesn't have the snprintf function.

#

XSDE_SNPRINTF     := y

 

 

# Set to 'n' if you don't want support for XML Schema validation in

# C++/Parser. Also don't forget to use the --suppress-validation

# option when compiling your schemas.

#

XSDE_PARSER_VALIDATION := y

 

 

# Set to 'n' if you don't want support for XML Schema validation in

# C++/Serializer. Also don't forget to use the --suppress-validation

# option when compiling your schemas.

#

XSDE_SERIALIZER_VALIDATION := y

 

 

# Set to 'y' if you would like to have support for regular expressions in

# the XSD/e runtime. If the regexp support is enabled, then the parser and

# serializer validation code will use it to validate the xs:pattern facet.

# If the regexp support is disabled, then this facet will be ignored. The

# regexp support increases the resulting executable size by about 30-50Kb.

#

XSDE_REGEXP := n

 

 

# Base parser/serializer implementation reuse style. Valid values are:

#

# 'mixin'  - virtual inheritance-based reuse (specify --reuse-style-mixin)

# 'tiein'  - delegation-based reuse (recommended)

# 'none'   - no reuse support (specify --reuse-style-none)

#

XSDE_REUSE_STYLE := tiein

 

 

# Set to 'y' if you would like the XSD/e runtime and the generated code

# to perform memory management using custom allocator functions provided

# by your application instead of the standard operator new/delete. Also

# don't forget to use the --custom-allocator option when compiling your

# schemas. See the documentation and examples for more information on

# custom allocators.

#

XSDE_CUSTOM_ALLOCATOR := n

 

 

# Set to 'y' if you would like to include the default implementation of the

# custom allocator into the XSD/e runtime library. This option is primarily

# useful for testing and only makes sense if XSDE_CUSTOM_ALLOCATOR is set

# to 'y'.

#

XSDE_DEFAULT_ALLOCATOR := n

 

 

# Set to 'y' if you want support for serialization of the C++/Hybrid

# object model to the CDR (Common Data Representation) binary format.

# This functionality requires the ACE library.

#

XSDE_CDR := n

 

 

# Set to 'y' if you want support for serialization of the C++/Hybrid

# object model to the XDR (eXternal Data Representation) binary format.

# This functionality requires the XDR API which is available out of the

# box on most POSIX systems as part of Sun RPC. On some systems (e.g.,

# (Linux, iPhone OS, VxWorks) this API is part of libc in which case

# you don't need to link anything extra. On other platforms, the XDR

# API may require linking to another library (which you can add to the

# LIBS variable above), such as -lrpc (QNX, LynxOS) or -lnsl. On non-

# POSIX platforms you may need to install a third-party library which

# provides the XDR API. Also note that some older versions of the API

# (e.g., those found on LynxOS) may not support serialization of the

# long long type. In this case you will get a compilation error saying

# that xdr_longlong_t and xdr_u_longlong_t are not declared. One way to

# resolve this is to disable the use of the long long type in XSD/e (see

# XSDE_LONGLONG above).

#

XSDE_XDR := n

 

 

# Set to 'y' if you need to handle XML vocabularies that use XML Schema

# polymorphism (xsi:type or substitution groups). Also don't forget to

# use either --generate-polymorphic (generates polymorphism-aware code)

# or --runtime-polymorphic (generates non-polymorphic code that uses the

# runtime library configured with polymorphism support). Note that support

# for XML Schema polymorphism requires runtime static initialization

# support in the C++ compiler (that is, support for automatic calling

# of constructors for static objects). Furthermore, if the mixin reuse

# style is used (XSDE_REUSE_STYLE) then the generated code requires

# support for dynamic_cast.

#

XSDE_POLYMORPHIC := n

 

 

# When polymorphism support is enabled (XSDE_POLYMORPHIC), the following

# parameters control the substitution and inheritance hashmaps bucket

# allocation. Because the number of elements in these hashmaps depends

# on the schemas being compiled and thus is fairly static, these hashmaps

# do not perform automatic table resizing. To obtain good performance the

# elements to buckets ratio should be between 0.7 and 0.9. The recommended

# way to ensure this range is to add diagnostics code to your application

# as shown in the documentation and examples. It is also a good idea to

# use prime numbers for bucket counts: 53 97 193 389 769 1543 3079 6151

# 12289 24593 49157 98317 196613 393241. Inheritance hashmaps are only

# used when validation is enabled.

#

XSDE_PARSER_SMAP_BUCKETS := 53

XSDE_PARSER_IMAP_BUCKETS := 97

XSDE_SERIALIZER_SMAP_BUCKETS := 53

XSDE_SERIALIZER_SMAP_BUCKET_BUCKETS := 53

XSDE_SERIALIZER_IMAP_BUCKETS := 97

 

 

# Options tuning depending on the features selected.

#

ifeq ($(XSDE_EXCEPTIONS),y)

CFLAGS += -fexceptions

endif

 

 

 

 



More information about the xsde-users mailing list