Crash when using Expression referencing another file

Post here for help on using FreeCAD's graphical user interface (GUI).
Forum rules
and Helpful information
IMPORTANT: Please click here and read this first, before asking for help

Also, be nice to others! Read the FreeCAD code of conduct!
Post Reply
Hotaru
Posts: 3
Joined: Thu May 13, 2021 8:32 am

Crash when using Expression referencing another file

Post by Hotaru »

Hello,

FreeCAD is segfaulting if I use an Expression which references a spreadsheet in another file.
Tested with both current AppImage (0.19.24291) and Git/master/debug-build (0.20.24887), (full info at end of post)

Steps to reproduce:

Code: Select all

## 1) mkdir /tmp/bug-xlink
## run with either "FreeCADCmd" or paste in GUI python panel

App.newDocument("base")
App.activeDocument().addObject('Spreadsheet::Sheet','Spreadsheet')
App.getDocument('base').getObject('Spreadsheet').setAlias('A1', 'x')
App.getDocument('base').getObject('Spreadsheet').set('x', '42mm')
App.ActiveDocument.recompute()

App.newDocument("square")
App.getDocument('square').addObject('PartDesign::Body','Body')
App.getDocument('square').addObject('PartDesign::AdditiveBox','Box')
App.getDocument('square').getObject('Body').addObject(App.getDocument('square').getObject('Box'))
App.getDocument('square').getObject('Box').Length=10.00
App.getDocument('square').getObject('Box').Width=10.00
App.getDocument('square').getObject('Box').Height=10.00
App.ActiveDocument.recompute()

App.getDocument("base").saveAs(u"/tmp/bug-xlink/base.FCStd")
App.getDocument("square").saveAs(u"/tmp/bug-xlink/square.FCStd")

App.getDocument("base").save()
App.getDocument("square").save()

App.closeDocument("square")
App.closeDocument("base")

##
## preparation done

FreeCAD.openDocument('/tmp/bug-xlink/base.FCStd')
FreeCAD.openDocument('/tmp/bug-xlink/square.FCStd')

App.getDocument('square').Box.setExpression('Length', u'base#Spreadsheet.x')
App.ActiveDocument.recompute()

App.getDocument("square").save()
App.getDocument("base").save()
The last line segfaults the GUI, but not FreeCADCmd. Opening "base.FCStd" in the GUI and saving it
works without problem. However, opening "square.FCStd" and then saving "base.FCStd" results in a segfault.

gdb-session from git/master/debug-build:

Code: Select all

(gdb) run
Starting program: /home/hotaru/cnc/freecad/build/bin/FreeCAD /tmp/bug-xlink/square.FCStd
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
FreeCAD 0.20, Libs: 0.20R24887 (Git)
© Juergen Riegel, Werner Mayer, Yorik van Havre and others 2001-2021
FreeCAD is free and open-source software licensed under the terms of LGPL2+ license.
FreeCAD wouldn't be possible without FreeCAD community.
  #####                 ####  ###   ####  
  #                    #      # #   #   # 
  #     ##  #### ####  #     #   #  #   # 
  ####  # # #  # #  #  #     #####  #   # 
  #     #   #### ####  #    #     # #   # 
  #     #   #    #     #    #     # #   #  ##  ##  ##
  #     #   #### ####   ### #     # ####   ##  ##  ##

Assembly4 workbench loaded 
[New Thread 0x7fffeb53f700 (LWP 31748)]
QStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-hotaru'
[New Thread 0x7fffe9841700 (LWP 31749)]
[New Thread 0x7fffe8c87700 (LWP 31750)]
[New Thread 0x7fffd3194700 (LWP 31756)]
[New Thread 0x7fff90dff700 (LWP 31757)]
connect failed: No such file or directory
[New Thread 0x7fff860d7700 (LWP 31763)]
[New Thread 0x7fff85cd6700 (LWP 31764)]
[New Thread 0x7fff858d5700 (LWP 31765)]
[New Thread 0x7fff854d4700 (LWP 31766)]
[New Thread 0x7fff84cd2700 (LWP 31768)]
[New Thread 0x7fff850d3700 (LWP 31767)]
[New Thread 0x7fff848d1700 (LWP 31769)]

Thread 1 "FreeCAD" received signal SIGSEGV, Segmentation fault.
__strcmp_avx2 () at ../sysdeps/x86_64/multiarch/strcmp-avx2.S:101
101	../sysdeps/x86_64/multiarch/strcmp-avx2.S: No such file or directory.
(gdb) up
#1  0x00007fff8742dc8f in PartDesignGui::ViewProviderAddSub::updateData (this=0x55555b477320, p=0x55555b490630)
    at /home/hotaru/cnc/freecad/src/src/Mod/PartDesign/Gui/ViewProviderAddSub.cpp:270
270	    if(strcmp(p->getName(), "AddSubShape")==0)
(gdb) print p->getName()
$1 = 0x0
(gdb) print p->father->getFullName()
$2 = "square#Box"
(gdb) up 2
#3  0x00007ffff6e09736 in Gui::ViewProvider::update (this=0x55555b477320, prop=0x55555b490630) at /home/hotaru/cnc/freecad/src/src/Gui/ViewProvider.cpp:299
299	    updateData(prop);
(gdb) print this->getFullName()
$3 = "square#Box.ViewObject"
(gdb) up 23
#26 0x00007ffff558ba85 in App::DocInfo::slotSaveDocument (this=0x55555b4908e0, doc=...) at /home/hotaru/cnc/freecad/src/src/App/PropertyLinks.cpp:2736
2736	                link->touch();
(gdb) print link->getValue()->getFullName()
$4 = "base#Spreadsheet"
(gdb) up 16
#42 0x00007ffff5324e4c in App::Document::saveToFile (this=0x55555b1dcd80, filename=0x555555ae3400 "/tmp/bug-xlink/base.FCStd")
    at /home/hotaru/cnc/freecad/src/src/App/Document.cpp:2645
2645	        GetApplication().signalSaveDocument(*this);
(gdb)
If I add a check in ViewProviderAddSub::updateData to test p->getName() not being NULL, the problem goes away.
However, I am new to FreeCAD, started using it a week ago, and just today looked at the source the first time.
I am wondering if an App::Property Name is supposed to be NULL at all? I think I came across a couple of other
places where the result of getName() is used without a check for NULL.

Code: Select all

diff --git a/src/Mod/PartDesign/Gui/ViewProviderAddSub.cpp b/src/Mod/PartDesign/Gui/ViewProviderAddSub.cpp
index 85bcf6e551..f62bf9621a 100644
--- a/src/Mod/PartDesign/Gui/ViewProviderAddSub.cpp
+++ b/src/Mod/PartDesign/Gui/ViewProviderAddSub.cpp
@@ -267,7 +267,7 @@ void ViewProviderAddSub::updateAddSubShapeIndicator() {
 
 void ViewProviderAddSub::updateData(const App::Property* p) {
 
-    if(strcmp(p->getName(), "AddSubShape")==0)
+    if(p->getName() && strcmp(p->getName(), "AddSubShape")==0)
         updateAddSubShapeIndicator();
 
     PartDesignGui::ViewProvider::updateData(p);
Curiously, 4 layers up the call stack (#5) a similar Bug was fixed. For me, the segfault
happens in the function called in line 801. In Line 806 the same check for Prop.getName()
being NULL was added by issue #4230:
https://forum.freecadweb.org/viewtopic.php?f=3&t=41849

Code: Select all

// src/Gui/Document.cpp
 795 void Document::slotChangedObject(const App::DocumentObject& Obj, const App::Property& Prop)
 796 {
 797     //Base::Console().Log("Document::slotChangedObject() called\n");
 798     ViewProvider* viewProvider = getViewProvider(&Obj);
 799     if (viewProvider) {
 800         try {
 801             viewProvider->update(&Prop);
 802             if(d->_editingViewer
 803                     && d->_editingObject
 804                     && d->_editViewProviderParent
 805                     && (Prop.isDerivedFrom(App::PropertyPlacement::getClassTypeId())
 806                         // Issue ID 0004230 : getName() can return null in which case strstr() crashes
 807                         || (Prop.getName() && strstr(Prop.getName(),"Scale")))
 808                     && d->_editObjs.count(&Obj))
 809             {
AppImage:
OS: Debian GNU/Linux 10 (buster)
Word size of OS: 64-bit
Word size of FreeCAD: 64-bit
Version: 0.19.24291 (Git) AppImage
Build type: Release
Branch: (HEAD detached at 0.19.2)
Hash: 7b5e18a0759de778b74d3a5c17eba9cb815035ac
Python version: 3.8.8
Qt version: 5.12.9
Coin version: 4.0.0
OCC version: 7.4.0
Locale: C/Default (C)

Git build:
OS: Debian GNU/Linux 10 (buster)
Word size of FreeCAD: 64-bit
Version: 0.20.24887 (Git)
Build type: Debug
Branch: master
Hash: 91b0409c48fd726e81f498b8a77ec51efd1683f2
Python version: 3.7.3
Qt version: 5.11.3
Coin version: 4.0.0a
OCC version: 7.3.0
Locale: C/Default (C)

Full Backtrace:

Code: Select all

(gdb) bt
#0  0x00007ffff170c6ca in __strcmp_avx2 () at ../sysdeps/x86_64/multiarch/strcmp-avx2.S:101
#1  0x00007fff8742dc8f in PartDesignGui::ViewProviderAddSub::updateData(App::Property const*) (this=0x55555b477320, p=0x55555b490630)
    at /home/hotaru/cnc/freecad/src/src/Mod/PartDesign/Gui/ViewProviderAddSub.cpp:270
#2  0x00007fff8742ed4b in PartDesignGui::ViewProviderPrimitive::updateData(App::Property const*) (this=0x55555b477320, p=0x55555b490630)
    at /home/hotaru/cnc/freecad/src/src/Mod/PartDesign/Gui/ViewProviderPrimitive.cpp:135
#3  0x00007ffff6e09736 in Gui::ViewProvider::update(App::Property const*) (this=0x55555b477320, prop=0x55555b490630) at /home/hotaru/cnc/freecad/src/src/Gui/ViewProvider.cpp:299
#4  0x00007ffff6e26cc6 in Gui::ViewProviderDocumentObject::update(App::Property const*) (this=0x55555b477320, prop=0x55555b490630)
    at /home/hotaru/cnc/freecad/src/src/Gui/ViewProviderDocumentObject.cpp:363
#5  0x00007ffff68ec668 in Gui::Document::slotChangedObject(App::DocumentObject const&, App::Property const&) (this=0x5555557984f0, Obj=..., Prop=...)
    at /home/hotaru/cnc/freecad/src/src/Gui/Document.cpp:801
#6  0x00007ffff693aa88 in boost::_mfi::mf2<void, Gui::Document, App::DocumentObject const&, App::Property const&>::operator()(Gui::Document*, App::DocumentObject const&, App::Property const&) const (this=0x555557c2c380, p=0x5555557984f0, a1=..., a2=...) at /usr/include/boost/bind/mem_fn_template.hpp:280
#7  0x00007ffff6934331 in boost::_bi::list3<boost::_bi::value<Gui::Document*>, boost::arg<1>, boost::arg<2> >::operator()<boost::_mfi::mf2<void, Gui::Document, App::DocumentObject const&, App::Property const&>, boost::_bi::rrlist2<App::DocumentObject const&, App::Property const&> >(boost::_bi::type<void>, boost::_mfi::mf2<void, Gui::Document, App::DocumentObject const&, App::Property const&>&, boost::_bi::rrlist2<App::DocumentObject const&, App::Property const&>&, int) (this=0x555557c2c390, f=..., a=...) at /usr/include/boost/bind/bind.hpp:398
#8  0x00007ffff692b962 in boost::_bi::bind_t<void, boost::_mfi::mf2<void, Gui::Document, App::DocumentObject const&, App::Property const&>, boost::_bi::list3<boost::_bi::value<Gui::Document*>, boost::arg<1>, boost::arg<2> > >::operator()<App::DocumentObject const&, App::Property const&>(App::DocumentObject const&, App::Property const&) (this=0x555557c2c380, a1=..., a2=...)
    at /usr/include/boost/bind/bind.hpp:1318
#9  0x00007ffff6923712 in boost::detail::function::void_function_obj_invoker2<boost::_bi::bind_t<void, boost::_mfi::mf2<void, Gui::Document, App::DocumentObject const&, App::Property const&>, boost::_bi::list3<boost::_bi::value<Gui::Document*>, boost::arg<1>, boost::arg<2> > >, void, App::DocumentObject const&, App::Property const&>::invoke(boost::detail::function::function_buffer&, App::DocumentObject const&, App::Property const&) (function_obj_ptr=..., a0=..., a1=...) at /usr/include/boost/function/function_template.hpp:159
#10 0x00007ffff53f1c78 in boost::function2<void, App::DocumentObject const&, App::Property const&>::operator()(App::DocumentObject const&, App::Property const&) const
    (this=0x555557c2c378, a0=..., a1=...) at /usr/include/boost/function/function_template.hpp:768
#11 0x00007ffff53eaf4e in boost::signals2::detail::call_with_tuple_args<boost::signals2::detail::void_type>::m_invoke<boost::function<void (App::DocumentObject const&, App::Property const&)>, 0u, 1u, App::DocumentObject const&, App::Property const&>(boost::function<void (App::DocumentObject const&, App::Property const&)>&, boost::signals2::detail::unsigned_meta_array<0u, 1u>, std::tuple<App::DocumentObject const&, App::Property const&> const&, boost::enable_if<boost::is_void<boost::function<void (App::DocumentObject const&, App::Property const&)>::result_type>, void>::type*) const (this=0x7fffffff86ff, func=..., args=std::tuple containing = {...}) at /usr/include/boost/signals2/detail/variadic_slot_invoker.hpp:105
#12 0x00007ffff53e14e8 in boost::signals2::detail::call_with_tuple_args<boost::signals2::detail::void_type>::operator()<boost::function<void (App::DocumentObject const&, App::Property const&)>, App::DocumentObject const&, App::Property const&, 2ul>(boost::function<void (App::DocumentObject const&, App::Property const&)>&, std::tuple<App::DocumentObject const&, App::Property const&> const&, mpl_::size_t<2ul>) const (this=0x7fffffff86ff, func=..., args=std::tuple containing = {...}) at /usr/include/boost/signals2/detail/variadic_slot_invoker.hpp:90
#13 0x00007ffff53d3086 in boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, App::DocumentObject const&, App::Property const&>::operator()<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (App::DocumentObject const&, App::Property const&), boost::function<void (App::DocumentObject const&, App::Property const&)> >, boost::signals2::mutex> > >(boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (App::DocumentObject const&, App::Property const&), boost::function<void (App::DocumentObject const&, App::Property const&)> >, boost::signals2::mutex> > const&) const (this=0x7fffffff8a80, connectionBody=...) at /usr/include/boost/signals2/detail/variadic_slot_invoker.hpp:133
#14 0x00007ffff53c36e4 in boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, App::DocumentObject const&, App::Property const&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (App::DocumentObject const&, App::Property const&), boost::function<void (App::DocumentObject const&, App::Property const&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (App::DocumentObject const&, App::Property const&), boost::function<void (App::DocumentObject const&, App::Property const&)> >, boost::signals2::mutex> >::dereference() const (this=0x7fffffff87d0)
    at /usr/include/boost/signals2/detail/slot_call_iterator.hpp:110
#15 0x00007ffff53b273e in boost::iterators::iterator_core_access::dereference<boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, App::DocumentObject const&, App::Property const&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (App::DocumentObject const&, App::Property const&), boost::function<void (App::DocumentObject const&, App::Property const&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (App::DocumentObject const&, App::Property const&), boost::function<void (App::DocumentObject const&, App::Property const&)> >, boost::signals2::mutex> > >(boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, App::DocumentObject const&, App::Property const&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (App::DocumentObject const&, App::Property const&), boost::function<void (App::DocumentObject const&, App::Property const&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (App::DocumentObject const&, App::Property const&), boost::function<void (App::DocumentObject const&, App::Property const&)> >, boost::signals2::mutex> > const&) (f=...) at /usr/include/boost/iterator/iterator_facade.hpp:550
#16 0x00007ffff539cb7c in boost::iterators::detail::iterator_facade_base<boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, App::DocumentObject const&, App::Property const&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (App::DocumentObject const&, App::Property const&), boost::function<void (App::DocumentObject const&, App::Property const&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (App::DocumentOb--Type <RET> for more, q to quit, c to continue without paging--c
ject const&, App::Property const&), boost::function<void (App::DocumentObject const&, App::Property const&)> >, boost::signals2::mutex> >, boost::signals2::detail::void_type, boost::iterators::single_pass_traversal_tag, boost::signals2::detail::void_type const&, long, false, false>::operator*() const (this=0x7fffffff87d0) at /usr/include/boost/iterator/iterator_facade.hpp:656
#17 0x00007ffff538147d in boost::signals2::optional_last_value<void>::operator()<boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, App::DocumentObject const&, App::Property const&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (App::DocumentObject const&, App::Property const&), boost::function<void (App::DocumentObject const&, App::Property const&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (App::DocumentObject const&, App::Property const&), boost::function<void (App::DocumentObject const&, App::Property const&)> >, boost::signals2::mutex> > >(boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, App::DocumentObject const&, App::Property const&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (App::DocumentObject const&, App::Property const&), boost::function<void (App::DocumentObject const&, App::Property const&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (App::DocumentObject const&, App::Property const&), boost::function<void (App::DocumentObject const&, App::Property const&)> >, boost::signals2::mutex> >, boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, App::DocumentObject const&, App::Property const&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (App::DocumentObject const&, App::Property const&), boost::function<void (App::DocumentObject const&, App::Property const&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (App::DocumentObject const&, App::Property const&), boost::function<void (App::DocumentObject const&, App::Property const&)> >, boost::signals2::mutex> >) const (this=0x555557c2ab30, first=..., last=...) at /usr/include/boost/signals2/optional_last_value.hpp:57
#18 0x00007ffff53659e0 in boost::signals2::detail::combiner_invoker<void>::operator()<boost::signals2::optional_last_value<void>, boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, App::DocumentObject const&, App::Property const&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (App::DocumentObject const&, App::Property const&), boost::function<void (App::DocumentObject const&, App::Property const&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (App::DocumentObject const&, App::Property const&), boost::function<void (App::DocumentObject const&, App::Property const&)> >, boost::signals2::mutex> > >(boost::signals2::optional_last_value<void>&, boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, App::DocumentObject const&, App::Property const&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (App::DocumentObject const&, App::Property const&), boost::function<void (App::DocumentObject const&, App::Property const&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (App::DocumentObject const&, App::Property const&), boost::function<void (App::DocumentObject const&, App::Property const&)> >, boost::signals2::mutex> >, boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, App::DocumentObject const&, App::Property const&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (App::DocumentObject const&, App::Property const&), boost::function<void (App::DocumentObject const&, App::Property const&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (App::DocumentObject const&, App::Property const&), boost::function<void (App::DocumentObject const&, App::Property const&)> >, boost::signals2::mutex> >) const (this=0x7fffffff8adf, combiner=..., first=..., last=...) at /usr/include/boost/signals2/detail/result_type_wrapper.hpp:64
#19 0x00007ffff534eeea in boost::signals2::detail::signal_impl<void (App::DocumentObject const&, App::Property const&), boost::signals2::optional_last_value<void>, int, std::less<int>, boost::function<void (App::DocumentObject const&, App::Property const&)>, boost::function<void (boost::signals2::connection const&, App::DocumentObject const&, App::Property const&)>, boost::signals2::mutex>::operator()(App::DocumentObject const&, App::Property const&) (this=0x555555da4e20, args#0=..., args#1=...) at /usr/include/boost/signals2/detail/signal_template.hpp:243
#20 0x00007ffff5340364 in boost::signals2::signal<void (App::DocumentObject const&, App::Property const&), boost::signals2::optional_last_value<void>, int, std::less<int>, boost::function<void (App::DocumentObject const&, App::Property const&)>, boost::function<void (boost::signals2::connection const&, App::DocumentObject const&, App::Property const&)>, boost::signals2::mutex>::operator()(App::DocumentObject const&, App::Property const&) (this=0x555557dffa98, args#0=..., args#1=...) at /usr/include/boost/signals2/detail/signal_template.hpp:722
#21 0x00007ffff531dd0c in App::Document::onChangedProperty(App::DocumentObject const*, App::Property const*) (this=0x555557dff480, Who=0x55555b4738c0, What=0x55555b490630) at /home/hotaru/cnc/freecad/src/src/App/Document.cpp:1521
#22 0x00007ffff54106a4 in App::DocumentObject::onChanged(App::Property const*) (this=0x55555b4738c0, prop=0x55555b490630) at /home/hotaru/cnc/freecad/src/src/App/DocumentObject.cpp:760
#23 0x00007fff8829089f in Part::Feature::onChanged(App::Property const*) (this=0x55555b4738c0, prop=0x55555b490630) at /home/hotaru/cnc/freecad/src/src/Mod/Part/App/PartFeature.cpp:563
#24 0x00007fff8b33c81d in PartDesign::FeaturePrimitive::onChanged(App::Property const*) (this=0x55555b4738c0, prop=0x55555b490630) at /home/hotaru/cnc/freecad/src/src/Mod/PartDesign/App/FeaturePrimitive.cpp:154
#25 0x00007ffff5544b1b in App::Property::touch() (this=0x55555b490630) at /home/hotaru/cnc/freecad/src/src/App/Property.cpp:203
#26 0x00007ffff558ba85 in App::DocInfo::slotSaveDocument(App::Document const&) (this=0x55555b4908e0, doc=...) at /home/hotaru/cnc/freecad/src/src/App/PropertyLinks.cpp:2736
#27 0x00007ffff55a9d61 in boost::_mfi::mf1<void, App::DocInfo, App::Document const&>::operator()(App::DocInfo*, App::Document const&) const (this=0x55555b4530d0, p=0x55555b4908e0, a1=...) at /usr/include/boost/bind/mem_fn_template.hpp:165
#28 0x00007ffff55a9621 in boost::_bi::list2<boost::_bi::value<App::DocInfo*>, boost::arg<1> >::operator()<boost::_mfi::mf1<void, App::DocInfo, App::Document const&>, boost::_bi::rrlist1<App::Document const&> >(boost::_bi::type<void>, boost::_mfi::mf1<void, App::DocInfo, App::Document const&>&, boost::_bi::rrlist1<App::Document const&>&, int) (this=0x55555b4530e0, f=..., a=...) at /usr/include/boost/bind/bind.hpp:319
#29 0x00007ffff55a867c in boost::_bi::bind_t<void, boost::_mfi::mf1<void, App::DocInfo, App::Document const&>, boost::_bi::list2<boost::_bi::value<App::DocInfo*>, boost::arg<1> > >::operator()<App::Document const&>(App::Document const&) (this=0x55555b4530d0, a1=...) at /usr/include/boost/bind/bind.hpp:1306
#30 0x00007ffff55a75ec in boost::detail::function::void_function_obj_invoker1<boost::_bi::bind_t<void, boost::_mfi::mf1<void, App::DocInfo, App::Document const&>, boost::_bi::list2<boost::_bi::value<App::DocInfo*>, boost::arg<1> > >, void, App::Document const&>::invoke(boost::detail::function::function_buffer&, App::Document const&) (function_obj_ptr=..., a0=...) at /usr/include/boost/function/function_template.hpp:159
#31 0x00007ffff53f1403 in boost::function1<void, App::Document const&>::operator()(App::Document const&) const (this=0x55555b4530c8, a0=...) at /usr/include/boost/function/function_template.hpp:768
#32 0x00007ffff53ea398 in boost::signals2::detail::call_with_tuple_args<boost::signals2::detail::void_type>::m_invoke<boost::function<void (App::Document const&)>, 0u, App::Document const&>(boost::function<void (App::Document const&)>&, boost::signals2::detail::unsigned_meta_array<0u>, std::tuple<App::Document const&> const&, boost::enable_if<boost::is_void<boost::function<void (App::Document const&)>::result_type>, void>::type*) const (this=0x7fffffff952f, func=..., args=std::tuple containing = {...}) at /usr/include/boost/signals2/detail/variadic_slot_invoker.hpp:105
#33 0x00007ffff53dff52 in boost::signals2::detail::call_with_tuple_args<boost::signals2::detail::void_type>::operator()<boost::function<void (App::Document const&)>, App::Document const&, 1ul>(boost::function<void (App::Document const&)>&, std::tuple<App::Document const&> const&, mpl_::size_t<1ul>) const (this=0x7fffffff952f, func=..., args=std::tuple containing = {...}) at /usr/include/boost/signals2/detail/variadic_slot_invoker.hpp:90
#34 0x00007ffff53d0bfa in boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, App::Document const&>::operator()<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (App::Document const&), boost::function<void (App::Document const&)> >, boost::signals2::mutex> > >(boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (App::Document const&), boost::function<void (App::Document const&)> >, boost::signals2::mutex> > const&) const (this=0x7fffffff98a0, connectionBody=...) at /usr/include/boost/signals2/detail/variadic_slot_invoker.hpp:133
#35 0x00007ffff53c1e28 in boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, App::Document const&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (App::Document const&), boost::function<void (App::Document const&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (App::Document const&), boost::function<void (App::Document const&)> >, boost::signals2::mutex> >::dereference() const (this=0x7fffffff9600) at /usr/include/boost/signals2/detail/slot_call_iterator.hpp:110
#36 0x00007ffff53b13c0 in boost::iterators::iterator_core_access::dereference<boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, App::Document const&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (App::Document const&), boost::function<void (App::Document const&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (App::Document const&), boost::function<void (App::Document const&)> >, boost::signals2::mutex> > >(boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, App::Document const&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (App::Document const&), boost::function<void (App::Document const&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (App::Document const&), boost::function<void (App::Document const&)> >, boost::signals2::mutex> > const&) (f=...) at /usr/include/boost/iterator/iterator_facade.hpp:550
#37 0x00007ffff539ac40 in boost::iterators::detail::iterator_facade_base<boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, App::Document const&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (App::Document const&), boost::function<void (App::Document const&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (App::Document const&), boost::function<void (App::Document const&)> >, boost::signals2::mutex> >, boost::signals2::detail::void_type, boost::iterators::single_pass_traversal_tag, boost::signals2::detail::void_type const&, long, false, false>::operator*() const (this=0x7fffffff9600) at /usr/include/boost/iterator/iterator_facade.hpp:656
#38 0x00007ffff537f313 in boost::signals2::optional_last_value<void>::operator()<boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, App::Document const&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (App::Document const&), boost::function<void (App::Document const&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (App::Document const&), boost::function<void (App::Document const&)> >, boost::signals2::mutex> > >(boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, App::Document const&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (App::Document const&), boost::function<void (App::Document const&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (App::Document const&), boost::function<void (App::Document const&)> >, boost::signals2::mutex> >, boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, App::Document const&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (App::Document const&), boost::function<void (App::Document const&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (App::Document const&), boost::function<void (App::Document const&)> >, boost::signals2::mutex> >) const (this=0x5555556d1a40, first=..., last=...) at /usr/include/boost/signals2/optional_last_value.hpp:57
#39 0x00007ffff5364558 in boost::signals2::detail::combiner_invoker<void>::operator()<boost::signals2::optional_last_value<void>, boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, App::Document const&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (App::Document const&), boost::function<void (App::Document const&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (App::Document const&), boost::function<void (App::Document const&)> >, boost::signals2::mutex> > >(boost::signals2::optional_last_value<void>&, boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, App::Document const&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (App::Document const&), boost::function<void (App::Document const&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (App::Document const&), boost::function<void (App::Document const&)> >, boost::signals2::mutex> >, boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type, App::Document const&>, std::_List_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (App::Document const&), boost::function<void (App::Document const&)> >, boost::signals2::mutex> > >, boost::signals2::detail::connection_body<std::pair<boost::signals2::detail::slot_meta_group, boost::optional<int> >, boost::signals2::slot<void (App::Document const&), boost::function<void (App::Document const&)> >, boost::signals2::mutex> >) const (this=0x7fffffff98ef, combiner=..., first=..., last=...) at /usr/include/boost/signals2/detail/result_type_wrapper.hpp:64
#40 0x00007ffff534deec in boost::signals2::detail::signal_impl<void (App::Document const&), boost::signals2::optional_last_value<void>, int, std::less<int>, boost::function<void (App::Document const&)>, boost::function<void (boost::signals2::connection const&, App::Document const&)>, boost::signals2::mutex>::operator()(App::Document const&) (this=0x5555555dad60, args#0=...) at /usr/include/boost/signals2/detail/signal_template.hpp:243
#41 0x00007ffff533fe42 in boost::signals2::signal<void (App::Document const&), boost::signals2::optional_last_value<void>, int, std::less<int>, boost::function<void (App::Document const&)>, boost::function<void (boost::signals2::connection const&, App::Document const&)>, boost::signals2::mutex>::operator()(App::Document const&) (this=0x5555556d2518, args#0=...) at /usr/include/boost/signals2/detail/signal_template.hpp:722
#42 0x00007ffff5324e4c in App::Document::saveToFile(char const*) const (this=0x55555b1dcd80, filename=0x555555ae3400 "/tmp/bug-xlink/base.FCStd") at /home/hotaru/cnc/freecad/src/src/App/Document.cpp:2645
#43 0x00007ffff5324902 in App::Document::save() (this=0x55555b1dcd80) at /home/hotaru/cnc/freecad/src/src/App/Document.cpp:2301
#44 0x00007ffff548a84e in App::DocumentPy::save(_object*) (this=0x555557e80000, args=0x7fffecca5048) at /home/hotaru/cnc/freecad/src/src/App/DocumentPyImp.cpp:60
#45 0x00007ffff5482dd8 in App::DocumentPy::staticCallback_save(_object*, _object*) (self=0x555557e80008, args=0x7fffecca5048) at /home/hotaru/cnc/freecad/build/src/App/DocumentPy.cpp:392
#46 0x00007ffff3ecacc9 in _PyMethodDef_RawFastCallKeywords () at /usr/lib/x86_64-linux-gnu/libpython3.7m.so.1.0
#47 0x00007ffff3ecba05 in _PyCFunction_FastCallKeywords () at /usr/lib/x86_64-linux-gnu/libpython3.7m.so.1.0
#48 0x00007ffff3ccccb0 in _PyEval_EvalFrameDefault () at /usr/lib/x86_64-linux-gnu/libpython3.7m.so.1.0
#49 0x00007ffff3df41e6 in _PyEval_EvalCodeWithName () at /usr/lib/x86_64-linux-gnu/libpython3.7m.so.1.0
#50 0x00007ffff3df446e in PyEval_EvalCodeEx () at /usr/lib/x86_64-linux-gnu/libpython3.7m.so.1.0
#51 0x00007ffff3df523b in PyEval_EvalCode () at /usr/lib/x86_64-linux-gnu/libpython3.7m.so.1.0
#52 0x00007ffff3dc2feb in PyRun_StringFlags () at /usr/lib/x86_64-linux-gnu/libpython3.7m.so.1.0
#53 0x00007ffff48bb6ac in Base::InterpreterSingleton::runString[abi:cxx11](char const*) (this=0x5555555db5c0, sCmd=0x555557e0cce8 "App.getDocument(\"base\").save()") at /home/hotaru/cnc/freecad/src/src/Base/Interpreter.cpp:252
#54 0x00007ffff69c7250 in Gui::Command::_runCommand(char const*, int, Gui::Command::DoCmd_Type, char const*) (file=0x7ffff6ffb0f0 "/home/hotaru/cnc/freecad/src/src/Gui/Document.cpp", line=1156, eType=Gui::Command::Doc, sCmd=0x555557e0cce8 "App.getDocument(\"base\").save()") at /home/hotaru/cnc/freecad/src/src/Gui/Command.cpp:683
#55 0x00007ffff69c6f1a in Gui::Command::_doCommand(char const*, int, Gui::Command::DoCmd_Type, char const*, ...) (file=0x7ffff6ffb0f0 "/home/hotaru/cnc/freecad/src/src/Gui/Document.cpp", line=1156, eType=Gui::Command::Doc, sCmd=0x7ffff6ffb58a "App.getDocument(\"%s\").save()") at /home/hotaru/cnc/freecad/src/src/Gui/Command.cpp:642
#56 0x00007ffff68ef49e in Gui::Document::save() (this=0x55555b1cd250) at /home/hotaru/cnc/freecad/src/src/Gui/Document.cpp:1156
#57 0x00007fff8bb2d1cc in SpreadsheetGui::SheetView::onMsg(char const*, char const**) (this=0x55555b697d00, pMsg=0x7fffe0eda648 "Save") at /home/hotaru/cnc/freecad/src/src/Mod/Spreadsheet/Gui/SpreadsheetView.cpp:150
#58 0x00007ffff685e661 in Gui::Application::sendMsgToActiveView(char const*, char const**) (this=0x7fffffffd0c0, pMsg=0x7fffe0eda648 "Save", ppReturn=0x7fffffffb178) at /home/hotaru/cnc/freecad/src/src/Gui/Application.cpp:958
#59 0x00007ffff68bed13 in Gui::Application::sSendActiveView(_object*, _object*) (args=0x7fffec98acc0) at /home/hotaru/cnc/freecad/src/src/Gui/ApplicationPy.cpp:656
#60 0x00007ffff3ecacc9 in _PyMethodDef_RawFastCallKeywords () at /usr/lib/x86_64-linux-gnu/libpython3.7m.so.1.0
#61 0x00007ffff3ecba05 in _PyCFunction_FastCallKeywords () at /usr/lib/x86_64-linux-gnu/libpython3.7m.so.1.0
#62 0x00007ffff3ccccb0 in _PyEval_EvalFrameDefault () at /usr/lib/x86_64-linux-gnu/libpython3.7m.so.1.0
#63 0x00007ffff3df41e6 in _PyEval_EvalCodeWithName () at /usr/lib/x86_64-linux-gnu/libpython3.7m.so.1.0
#64 0x00007ffff3df446e in PyEval_EvalCodeEx () at /usr/lib/x86_64-linux-gnu/libpython3.7m.so.1.0
#65 0x00007ffff3df523b in PyEval_EvalCode () at /usr/lib/x86_64-linux-gnu/libpython3.7m.so.1.0
#66 0x00007ffff3dc2feb in PyRun_StringFlags () at /usr/lib/x86_64-linux-gnu/libpython3.7m.so.1.0
#67 0x00007ffff48bb6ac in Base::InterpreterSingleton::runString[abi:cxx11](char const*) (this=0x5555555db5c0, sCmd=0x555555b83bd8 "Gui.SendMsgToActiveView(\"Save\")") at /home/hotaru/cnc/freecad/src/src/Base/Interpreter.cpp:252
#68 0x00007ffff69c7250 in Gui::Command::_runCommand(char const*, int, Gui::Command::DoCmd_Type, char const*) (file=0x7ffff757dcc8 "/home/hotaru/cnc/freecad/src/src/Gui/CommandDoc.cpp", line=654, eType=Gui::Command::Gui, sCmd=0x555555b83bd8 "Gui.SendMsgToActiveView(\"Save\")") at /home/hotaru/cnc/freecad/src/src/Gui/Command.cpp:683
#69 0x00007ffff69c6f1a in Gui::Command::_doCommand(char const*, int, Gui::Command::DoCmd_Type, char const*, ...) (file=0x7ffff757dcc8 "/home/hotaru/cnc/freecad/src/src/Gui/CommandDoc.cpp", line=654, eType=Gui::Command::Gui, sCmd=0x7ffff757e038 "Gui.SendMsgToActiveView(\"Save\")") at /home/hotaru/cnc/freecad/src/src/Gui/Command.cpp:642
#70 0x00007ffff69e0083 in StdCmdSave::activated(int) (this=0x555555b19020, iMsg=0) at /home/hotaru/cnc/freecad/src/src/Gui/CommandDoc.cpp:654
#71 0x00007ffff69c5fa1 in Gui::Command::_invoke(int, bool) (this=0x555555b19020, id=0, disablelog=true) at /home/hotaru/cnc/freecad/src/src/Gui/Command.cpp:418
#72 0x00007ffff69c5d11 in Gui::Command::invoke(int, Gui::Command::TriggerSource) (this=0x555555b19020, i=0, trigger=Gui::Command::TriggerAction) at /home/hotaru/cnc/freecad/src/src/Gui/Command.cpp:383
#73 0x00007ffff69b58e4 in Gui::Action::onActivated() (this=0x55555633a260) at /home/hotaru/cnc/freecad/src/src/Gui/Action.cpp:104
#74 0x00007ffff69bcbcb in Gui::Action::qt_static_metacall(QObject*, QMetaObject::Call, int, void**) (_o=0x55555633a260, _c=QMetaObject::InvokeMetaMethod, _id=0, _a=0x7fffffffbbb0) at /home/hotaru/cnc/freecad/build/src/Gui/FreeCADGui_autogen/include/moc_Action.cpp:74
#75 0x00007ffff1f957f6 in QMetaObject::activate(QObject*, int, int, void**) () at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#76 0x00007ffff28e2f02 in QAction::triggered(bool) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#77 0x00007ffff28e5520 in QAction::activate(QAction::ActionEvent) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#78 0x00007ffff29d0b7d in  () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#79 0x00007ffff29d0db5 in QAbstractButton::mouseReleaseEvent(QMouseEvent*) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#80 0x00007ffff2aba91a in QToolButton::mouseReleaseEvent(QMouseEvent*) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#81 0x00007ffff29274d8 in QWidget::event(QEvent*) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#82 0x00007ffff2aba9c3 in QToolButton::event(QEvent*) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#83 0x00007ffff28e94c1 in QApplicationPrivate::notify_helper(QObject*, QEvent*) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#84 0x00007ffff28f0bb8 in QApplication::notify(QObject*, QEvent*) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#85 0x00007ffff698874b in Gui::GUIApplication::notify(QObject*, QEvent*) (this=0x7fffffffd2f0, receiver=0x555556378870, event=0x7fffffffc2a0) at /home/hotaru/cnc/freecad/src/src/Gui/GuiApplication.cpp:87
#86 0x00007ffff1f6c489 in QCoreApplication::notifyInternal2(QObject*, QEvent*) () at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#87 0x00007ffff28efee9 in QApplicationPrivate::sendMouseEvent(QWidget*, QMouseEvent*, QWidget*, QWidget*, QWidget**, QPointer<QWidget>&, bool) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#88 0x00007ffff2941fd4 in  () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#89 0x00007ffff2944b5e in  () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#90 0x00007ffff28e94c1 in QApplicationPrivate::notify_helper(QObject*, QEvent*) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#91 0x00007ffff28f0970 in QApplication::notify(QObject*, QEvent*) () at /usr/lib/x86_64-linux-gnu/libQt5Widgets.so.5
#92 0x00007ffff698874b in Gui::GUIApplication::notify(QObject*, QEvent*) (this=0x7fffffffd2f0, receiver=0x555556977b50, event=0x7fffffffc8c0) at /home/hotaru/cnc/freecad/src/src/Gui/GuiApplication.cpp:87
#93 0x00007ffff1f6c489 in QCoreApplication::notifyInternal2(QObject*, QEvent*) () at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#94 0x00007ffff231a003 in QGuiApplicationPrivate::processMouseEvent(QWindowSystemInterfacePrivate::MouseEvent*) () at /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5
#95 0x00007ffff231be85 in QGuiApplicationPrivate::processWindowSystemEvent(QWindowSystemInterfacePrivate::WindowSystemEvent*) () at /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5
#96 0x00007ffff22f607b in QWindowSystemInterface::sendWindowSystemEvents(QFlags<QEventLoop::ProcessEventsFlag>) () at /usr/lib/x86_64-linux-gnu/libQt5Gui.so.5
#97 0x00007fffec6f849b in  () at /usr/lib/x86_64-linux-gnu/libQt5XcbQpa.so.5
#98 0x00007ffff1f6b15b in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#99 0x00007ffff1f73132 in QCoreApplication::exec() () at /usr/lib/x86_64-linux-gnu/libQt5Core.so.5
#100 0x00007ffff686570c in Gui::Application::runApplication() () at /home/hotaru/cnc/freecad/src/src/Gui/Application.cpp:2199
#101 0x000055555555f1db in main(int, char**) (argc=2, argv=0x7fffffffe3b8) at /home/hotaru/cnc/freecad/src/src/Main/MainGui.cpp:288
Attachments
square.FCStd
(5.17 KiB) Downloaded 13 times
base.FCStd
(1.13 KiB) Downloaded 13 times
openBrain
Veteran
Posts: 9041
Joined: Fri Nov 09, 2018 5:38 pm
Contact:

Re: Crash when using Expression referencing another file

Post by openBrain »

Hi, welcome here,

I honestly didn't test but at a glance, I'm not sure this is good idea to use Unicode encoding in this line

Code: Select all

App.getDocument('square').Box.setExpression('Length', u'base#Spreadsheet.x')
Hotaru
Posts: 3
Joined: Thu May 13, 2021 8:32 am

Re: Crash when using Expression referencing another file

Post by Hotaru »

uh.. strange. I just copy/pasted from FreeCADs python panel for easier reproduction of the issue. Anyway, even without "u" this happens.
openBrain
Veteran
Posts: 9041
Joined: Fri Nov 09, 2018 5:38 pm
Contact:

Re: Crash when using Expression referencing another file

Post by openBrain »

Hotaru wrote: Fri May 14, 2021 7:50 am uh.. strange. I just copy/pasted from FreeCADs python panel for easier reproduction of the issue. Anyway, even without "u" this happens.
Was just a quick guess. :) Anyway, I think your findings & solutions in OP are correct. At least it should solve the segfault. Feel free to send a PR in Github ;)
Hotaru
Posts: 3
Joined: Thu May 13, 2021 8:32 am

Re: Crash when using Expression referencing another file

Post by Hotaru »

Hotaru wrote: Thu May 13, 2021 1:19 pm If I add a check in ViewProviderAddSub::updateData to test p->getName() not being NULL, the problem goes away.
However, I am new to FreeCAD, started using it a week ago, and just today looked at the source the first time.
I am wondering if an App::Property Name is supposed to be NULL at all? I think I came across a couple of other
places where the result of getName() is used without a check for NULL.
Looking at FreeCAD sources some more days I still have the feeling that just adding a check to ViewProviderAddSub::updateData
is too little. Maybe getName() should be changed to default to "" instead of 0. Looking at all places where getName() is used
https://freecad.github.io/SourceDoc/d0/ ... 2f5bdda00a
I found some that are fine with 0, some that check for 0, some that just use "<<" IOStream on getName(), and some that
use str* that will dereference any pointer (FemGui::ViewProviderFemConstraintBearing::updateData for example).

The Prop in question is of class App::PropertyXLink

Code: Select all

(gdb) print *p
$6 = {<Base::Persistence> = {<Base::BaseClass> = {_vptr.BaseClass = 0x7ffff58e5108 <vtable for App::PropertyXLink+16>,
Trying to understand how name of a property can be set at all, the only inteface seems to be using a variant of
ADD_PROPERTY(), but none of it is reference anywhere near src/App/PropertyLinks.cpp
Post Reply