[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