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