Seg fault in basic Libre Office SDK 5.2 C++ Ubuntu 14.04 Server

Sample application similar to some found on the web fails at the the very end with a segmentation violation with backtrace:

 #0  0x00007ffff489b723 in cpp_vtable_call ()
    from /opt/libreoffice5.2/program/libgcc3_uno.so
 #1  0x00007ffff48a26ea in privateSnippetExecutor ()
    from /opt/libreoffice5.2/program/libgcc3_uno.so
 #2  0x0000000000401ea9 in main ()

Example was built using Libreoffice 5.2 SDK. Code and makefile below.

The same code, embedded in a larger application, fails at the XComponentLoader call - with the same backtrace.

A somewhat similar example fails on the xComponentLoader->loadComponentFromURL call (backtrace terminating on that line; the file and directory parameters passed into that method look good on inspection; flag is 0, property sequence is void).

We have tried this on Libreoffice 4 (as per ubuntu trusty repo) and with Openoffice SDK 4.1.2, with identical results.

Despite the fact that the simple example code runs to the end before crashing, we suspect (based on the other evidence) an issue with XComponentLoader.

What are potential pitfalls with this feature?

Any ideas appreciated.

Code (ooexample.cxx):

 #include <stdio.h>
 #include <stdlib.h>
 #include <unistd.h>

 #include <cppuhelper/bootstrap.hxx>
 #include <com/sun/star/bridge/XUnoUrlResolver.hpp>
 #include <com/sun/star/lang/XMultiServiceFactory.hpp>
 #include <com/sun/star/lang/XMultiComponentFactory.hpp>
 #include <com/sun/star/beans/XPropertySet.hpp>
 #include <com/sun/star/frame/Desktop.hpp>
 #include <com/sun/star/uno/XInterface.hpp>
 #include <com/sun/star/frame/XComponentLoader.hpp>
 #include <com/sun/star/container/XNameAccess.hpp>
 #include <com/sun/star/document/XTypeDetection.hpp>

 using namespace com::sun::star::uno;
 using namespace com::sun::star::lang;
 using namespace com::sun::star::bridge;
 using namespace com::sun::star::beans;
 using namespace com::sun::star::frame;
 using namespace com::sun::star::container;
 using namespace com::sun::star::document;
 using namespace rtl;
 using namespace cppu;

 #define DIAG(s) printf("%s\n",s)
 #define OOCHECKREF(x) if (!x.is()){printf("Error: "#x"\n");return 1;}

 int main (int argc, char *argv[]) {
   try {
     DIAG("mComponentContext");
     Reference< XComponentContext > mComponentContext
       = defaultBootstrap_InitialComponentContext();

     DIAG("mServiceManager");
     Reference< XMultiComponentFactory > mServiceManager
       = mComponentContext->getServiceManager();

     DIAG("rResolverInstance");
     Reference< XInterface > rResolverInstance
       = mServiceManager->createInstanceWithContext (
         OUString::createFromAscii("com.sun.star.bridge.UnoUrlResolver") ,
         mComponentContext);

     DIAG("rResolver");
     Reference< XUnoUrlResolver > rResolver (rResolverInstance, UNO_QUERY);
     OOCHECKREF(rResolver)

     DIAG("rOfficeInstance");    Reference< XInterface > rOfficeInstance
       = rResolver->resolve (
         OUString::createFromAscii ("uno:socket,host=localhost,port=8199;urp;StarOffice.ServiceManager")) ;
     OOCHECKREF(rOfficeInstance)

     DIAG("rOfficeServiceManager");
     Reference< XMultiServiceFactory > rOfficeServiceManager (
       rOfficeInstance, UNO_QUERY);
     OOCHECKREF(rOfficeServiceManager)

     DIAG("xPropSet");
     Reference< XPropertySet > xPropSet (rOfficeInstance, UNO_QUERY) ;
       xPropSet->getPropertyValue (OUString::createFromAscii("DefaultContext"))  >>= mComponentContext;

     DIAG("xMultiComponentFactoryServer");
     Reference< XMultiComponentFactory > xMultiComponentFactoryServer(
       mComponentContext->getServiceManager());

     DIAG("rDesktop");
     Reference<XInterface> rDesktop = rOfficeServiceManager->createInstance(
       OUString::createFromAscii("com.sun.star.frame.Desktop"));
     OOCHECKREF(rDesktop)

     DIAG("mComponentLoader");
     Reference< XComponentLoader > mComponentLoader (rDesktop, UNO_QUERY);
     OOCHECKREF(mComponentLoader)

     DIAG("rFiltersInt");
     Reference< XInterface > rFiltersInt = rOfficeServiceManager->createInstance(
         OUString::createFromAscii("com.sun.star.document.FilterFactory"));
     OOCHECKREF(rFiltersInt)

     DIAG("mFilterFactory");
     Reference<XNameAccess> mFilterFactory = Reference< XNameAccess >(rFiltersInt, UNO_QUERY);
     OOCHECKREF(mFilterFactory)

     DIAG("rTypeDetectInt");
     Reference< XInterface > rTypeDetectInt = rOfficeServiceManager->createInstance(
         OUString::createFromAscii("com.sun.star.document.TypeDetection"));
     OOCHECKREF(rTypeDetectInt)

     DIAG("mTypeDetect");
     Reference< XTypeDetection > mTypeDetect = Reference< XTypeDetection >(rTypeDetectInt, UNO_QUERY);
     OOCHECKREF(mTypeDetect)

     DIAG ("Connected successfully to the office - press enter to exit");
     getchar();
   } catch (Exception &e) {
     OString o = OUStringToOString (e.Message, RTL_TEXTENCODING_ASCII_US);
     printf ("Error: %s\n", o.pData->buffer);
     return 1;
   }
   return 0;
 }

Makefile:

 PRJ=../../..
 SETTINGS=$(PRJ)/settings

 include $(SETTINGS)/settings.mk
 include $(SETTINGS)/std.mk

 # Define non-platform/compiler specific settings
 COMP_NAME=ooexample
 COMP_IMPL_NAME=$(COMP_NAME).uno.$(SHAREDLIB_EXT)
 COMP_IMPL=$(SHAREDLIB_OUT)/$(COMP_IMPL_NAME)
 COMP_RDB_NAME = $(COMP_NAME).uno.rdb
 COMP_RDB = $(OUT_BIN)/$(COMP_RDB_NAME)
 OUT_COMP_INC = $(OUT_INC)/$(COMP_NAME)
 OUT_COMP_GEN = $(OUT_MISC)/$(COMP_NAME)
 OUT_COMP_OBJ = $(OUT_OBJ)/$(COMP_NAME)
 OUT_COMP_SLO = $(OUT_SLO)/$(COMP_NAME)
 COMP_SERVICES=$(SHAREDLIB_OUT)/ooexampleservices.rdb

 ENV_EXAMPLE_TYPES=-env:URE_MORE_TYPES=$(URLPREFIX)$(COMP_RDB)
 ENV_COMP_SERVICES=-env:URE_MORE_SERVICES=$(URLPREFIX)$(COMP_SERVICES)

 COMP_TYPEFLAG = $(OUT_MISC)/cpp_$(COMP_NAME)_types.flag

 CXXFILES = ooexample.cxx

 SLOFILES = $(patsubst %.cxx,$(OUT_COMP_SLO)/%.$(OBJ_EXT),$(COMPCXXFILES))
 OBJFILES = $(patsubst %.cxx,$(OUT_COMP_SLO)/%.$(OBJ_EXT),$(CXXFILES))
 # Targets
 .PHONY: ALL
 ALL : \
         ooexample

 include $(SETTINGS)/stdtarget.mk

 $(OUT_COMP_GEN)/%.urd : %.idl
         -$(MKDIR) $(subst /,$(PS),$(@D))
         $(IDLC) -I. -I$(IDL_DIR) -O$(OUT_COMP_GEN) $<

 # This example type library will be extended by the URE types
 $(OUT_BIN)/%.rdb : $(GENURDFILES)
         -$(MKDIR) $(subst /,$(PS),$(@D))
         -$(DEL) $(subst \\,\,$(subst /,$(PS),$@))
 #       $(REGMERGE) $@ /UCR $(GENURDFILES)
         $(REGMERGE) $@ / $(URE_TYPES)

 $(COMP_TYPEFLAG) : $(COMP_RDB) $(SDKTYPEFLAG)
         -$(MKDIR) $(subst /,$(PS),$(@D))
         -$(DEL) $(subst \\,\,$(subst /,$(PS),$(COMP_TYPEFLAG)))
         $(CPPUMAKER) -Gc -O$(OUT_COMP_INC) $(TYPESLIST) $(COMP_RDB) -X $(URE_TYPES)
         echo flagged > $@

 $(OUT_COMP_OBJ)/%.$(OBJ_EXT) : %.cxx $(COMP_TYPEFLAG)
         -$(MKDIR) $(subst /,$(PS),$(OUT_OBJ))
         -$(MKDIR) $(subst /,$(PS),$(@D))
         $(CC) $(CC_FLAGS) $(CC_INCLUDES) -I$(OUT_COMP_INC) $(CC_DEFINES) $(CC_OUTPUT_SWITCH)$(subst ,$(PS),$@) $<

 $(OUT_COMP_SLO)/%.$(OBJ_EXT) : %.cxx $(COMP_TYPEFLAG)
         -$(MKDIR) $(subst /,$(PS),$(OUT_SLO))
         -$(MKDIR) $(subst /,$(PS),$(@D))
         $(CC) $(CC_FLAGS) $(CC_INCLUDES) -I$(OUT_COMP_INC) $(CC_DEFINES) $(CC_OUTPUT_SWITCH)$(subst ,$(PS),$@) $<

 ifeq "$(OS)" "WIN"
 $(SHAREDLIB_OUT)/%.$(SHAREDLIB_EXT) : $(SLOFILES)
         -$(MKDIR) $(subst /,$(PS),$(@D))
         -$(MKDIR) $(subst /,$(PS),$(OUT_COMP_GEN))
         $(LINK) $(COMP_LINK_FLAGS) /OUT:$@ \
         /MAP:$(OUT_COMP_GEN)/$(subst $(SHAREDLIB_EXT),map,$(@F)) $(SLOFILES) \
         $(CPPUHELPERLIB) $(CPPULIB) $(SALLIB) msvcprt.lib $(LIBO_SDK_LDFLAGS_STDLIBS)
         $(LINK_MANIFEST)
 else

 $(SHAREDLIB_OUT)/%.$(SHAREDLIB_EXT) : $(SLOFILES)
         -$(MKDIR) $(subst /,$(PS),$(@D))
         $(LINK) $(COMP_LINK_FLAGS) $(LINK_LIBS) -o $@ $(SLOFILES) \
         $(CPPUHELPERLIB) $(CPPULIB) $(SALLIB) $(STC++LIB)
 ifeq "$(OS)" "MACOSX"
         $(INSTALL_NAME_URELIBS)  $@
 endif
 endif
 $(OUT_BIN)/ooexample$(EXE_EXT) : $(OUT_COMP_OBJ)/ooexample.$(OBJ_EXT) $(SHAREDLIB_OUT)/ooexample.uno.$(SHAREDLIB_EXT)

 ifeq "$(OS)" "WIN"
         -$(MKDIR) $(subst /,$(PS),$(@D))
         $(LINK) $(EXE_LINK_FLAGS) /OUT:$@ /MAP:$(OUT_COMP_GEN)/$(basename $(@F)).map \
           $< $(CPPUHELPERLIB) $(CPPULIB) $(SALHELPERLIB) $(SALLIB)
 else
         -$(MKDIR) $(subst /,$(PS),$(@D))        $(LINK) $(EXE_LINK_FLAGS) $(LINK_LIBS) -o $@ $< \
           $(CPPUHELPERLIB) $(CPPULIB) $(SALHELPERLIB) $(SALLIB) $(STDC++LIB)
 endif

 $(COMP_SERVICES) :
         -$(MKDIR) $(subst /,$(PS),$(@D))
         @echo $(OSEP)?xml version="$(QM)1.0$(QM)" encoding="$(QM)UTF-8$(QM)"?$(CSEP) > $@
         @echo $(OSEP)components xmlns="$(QM)http://openoffice.org/2010/uno-components$(QM)"$(CSEP) >> $@
         @echo $(SQM)  $(SQM)$(OSEP)component loader="$(QM)com.sun.star.loader.SharedLibrary$(QM)" uri="$(QM)$(COMP_IMPL_NAME)$(QM)"$(CSEP) >> $@
         @echo $(SQM)    $(SQM)$(OSEP)implementation name="$(QM)com.sun.star.comp.example.cpp.ooexample$(QM)"$(CSEP) >> $@
         @echo $(SQM)      $(SQM)$(OSEP)service name="$(QM)foo.ooexample$(QM)"/$(CSEP) >> $@
         @echo $(SQM)    $(SQM)$(OSEP)/implementation$(CSEP) >> $@
 ooexample : $(OUT_BIN)/ooexample$(EXE_EXT) $(COMP_IMPL) $(COMP_SERVICES)
         @echo --------------------------------------------------------------------------------
         @echo Please use the following command to execute the example!
         @echo -
         @echo $(MAKE) ooexample.run
         @echo -
         @echo NOTE: The example makes use of the URE and use the defaultBootstrap_InitialComponentContext method.
         @echo $(SQM)      $(SQM)The additional example IDL types are provided via the UNO environment variable -env:URE_MORE_TYPES=...
         @echo $(SQM)      $(SQM)and the example component is made available via -env:URE_MORE_SERVICES=...
         @echo $(SQM)      $(SQM)Please check the generated $(QM)$(COMP_SERVICES)$(QM) to see how you can specify your own components in such an environment
         @echo $(SQM)      $(SQM)and how to use the passive UNO registration.  
         @echo --------------------------------------------------------------------------------

 %.run: $(OUT_BIN)/ooexample$(EXE_EXT) $(COMP_IMPL)

Compile:

export OO_SDK_HOME=../../../../sdk
export OO_SDK_URE_BIN_DIR=../../../../program
export OFFICE_PROGRAM_PATH=$OO_SDK_URE_BIN_DIR
export OO_SDK_OFFICE_LIB_DIR=../../../../sdk/lib
export OO_SDK_URE_HOME=../../../../../ure
export OO_SDK_URE_LIB_DIR=$OO_SDK_URE_HOME/lib
export PATH=$PATH:.

make ooexample.run

Headless libreoffice instance listening:

jenkins   2610     1  0 10:28 pts/4    00:00:00 Xvfb :95 -screen 0 1024x768x24 -extension Composite -nolisten tcp
    
jenkins   2657  2616  0 10:28 pts/4    00:00:00 /opt/libreoffice5.2/program/soffice.bin --headless --accept=socket,host=127.0.0.1,port=8199,tcpNoDelay=1;urp;StarOffice.ServiceManager --nofirststartwizard --display :95 --nologo --norestore --invisible

Execution:

 gdb ../../../LINUXexample.out/bin/ooexample
 GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1
 Copyright (C) 2014 Free Software Foundation, Inc.
 License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
 This is free software: you are free to change and redistribute it.
 There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
 and "show warranty" for details.
 This GDB was configured as "x86_64-linux-gnu".
 Type "show configuration" for configuration details.
 For bug reporting instructions, please see:
 <http://www.gnu.org/software/gdb/bugs/>.
 Find the GDB manual and other documentation resources online at:
 <http://www.gnu.org/software/gdb/documentation/>.
 For help, type "help".
Type "apropos word" to search for commands related to "word"...
 Reading symbols from ../../../LINUXexample.out/bin/ooexample...(no debugging symbols found)...done.
 (gdb) r
 Starting program: /opt/libreoffice5.2/sdk/LINUXexample.out/bin/ooexample
 [Thread debugging using libthread_db enabled]
 Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
 mComponentContext
 [New Thread 0x7ffff5988700 (LWP 12125)]
 mServiceManager
 rResolverInstance
 rResolver
 rOfficeInstance
 [New Thread 0x7ffff4015700 (LWP 12128)]
 [New Thread 0x7ffff3814700 (LWP 12129)]
 rOfficeServiceManager
 xPropSet
 xMultiComponentFactoryServer
 rDesktop
 mComponentLoader
 rFiltersInt
 mFilterFactory
 rTypeDetectInt
 mTypeDetect
 Connected successfully to the office - press enter to exit

 Program received signal SIGSEGV, Segmentation fault.
 0x00007ffff489b723 in cpp_vtable_call ()
    from /opt/libreoffice5.2/program/libgcc3_uno.so
 (gdb) bt
 #0  0x00007ffff489b723 in cpp_vtable_call ()
    from /opt/libreoffice5.2/program/libgcc3_uno.so
 #1  0x00007ffff48a26ea in privateSnippetExecutor ()
    from /opt/libreoffice5.2/program/libgcc3_uno.so
 #2  0x0000000000401ea9 in main ()
 (gdb) c
 Continuing.
 [Thread 0x7ffff7fc8780 (LWP 11222) exited]
 [Thread 0x7ffff4015700 (LWP 11229) exited]
 [Thread 0x7ffff5988700 (LWP 11226) exited]

Program terminated with signal SIGSEGV, Segmentation fault.
The program no longer exists. 

How can I solve or avoid this problem? You advice would be greatly appreciated.

Hamish

You will have to file a bug report at bugzilla. See Inappropriate questions.