View Issue Details
| ID | Project | Category | View Status | Date Submitted | Last Update |
|---|---|---|---|---|---|
| 0001901 | NoesisGUI | C++ SDK | public | 2021-01-22 00:51 | 2021-01-25 10:51 |
| Reporter | steveh | Assigned To | sfernandez | ||
| Priority | normal | Severity | crash | ||
| Status | resolved | Resolution | no change required | ||
| Target Version | 3.0.10 | Fixed in Version | 3.0.10 | ||
| Summary | 0001901: Crash when clearing bound ObservableCollection in code with DataTemplate having triggers | ||||
| Description | Hi guys, apologies in advance I don't have a solid repro step for this crash, I'll continue to investigate but right now I have some info and I thought I'd ask to see if you can help me narrow anything down. So we've been seeing a fairly reproducible crash when we reload data into one of our listboxes. The crash goes down in different callstacks, but it's always when we're destroying dependencyobjects. This is triggered when we clear out an ObservableCollection which is the source of a binding expression for the ItemsSource DependencyProperty for the listbox. The callstack usually ends up trying to acess an invalid DependencyProperty value on a DataTrigger. I've attached an example of one of our callstacks where it went down. This issue was present in 3.0.6. I've only just got around to looking into the issue today and I noticed that you made quite a few fixed regarding DataTriggers and crash fixes in 3.0.9. I've just updated to 3.0.9 and the crash is exactly the same. As I mentioned, apologies I can't be more specific than this right now, the crashes are rather inconsistent and sporadic. I'll continue to investigate in the background but I'll appreciate any help you can provide in the meantime. Much appreciated, -Steven | ||||
| Steps To Reproduce |
// Example C++ interface: class DataModel Button *pOne = FindName<Button>("One"); void OnClick(BaseComponent, const RoutedEventArgs&) | ||||
| Attached Files | callstack.txt (17,240 bytes)
Noesis::DynamicCast_::GetBaseObject<Noesis::IValueConverter>(Noesis::IValueConverter * obj, Noesis::Int2Type<1> __formal) Line 24 C++
Noesis::DynamicCast_::Apply<Noesis::DefaultValueConverter,Noesis::IValueConverter>(Noesis::IValueConverter * from) Line 35 C++
Noesis::DynamicCast<Noesis::DefaultValueConverter *,Noesis::IValueConverter *>(Noesis::IValueConverter * from) Line 55 C++
Noesis::BindingExpression::CheckConverter(const Noesis::Type * sourceType, Noesis::BaseComponent * sourceVal, const Noesis::Type * targetType, Noesis::BaseComponent * targetVal) Line 1199 C++
Noesis::BindingExpression::Initialize() Line 586 C++
Noesis::BindingExpression::InvalidateSource(bool invalidateTargetProperty) Line 1516 C++
Noesis::BindingExpression::UpdateTarget() Line 97 C++
NoesisApp::DataBindingHelper::EnsureBindingValue(const Noesis::DependencyObject * target, const Noesis::DependencyProperty * dp) Line 26 C++
NoesisApp::DataTrigger::EnsureBindingValues() Line 108 C++
NoesisApp::DataTrigger::EvaluateBindingChange() Line 90 C++
NoesisApp::PropertyChangedTrigger::StaticFillClassType::__l2::<lambda>(Noesis::DependencyObject * d, const Noesis::DependencyPropertyChangedEventArgs & __formal) Line 89 C++
Noesis::Delegate<void __cdecl(Noesis::DependencyObject *,Noesis::DependencyPropertyChangedEventArgs const &)>::FunctorStub<void <lambda>(Noesis::DependencyObject *, const Noesis::DependencyPropertyChangedEventArgs &) >::Invoke(Noesis::DependencyObject * <args_0>, const Noesis::DependencyPropertyChangedEventArgs & <args_1>) Line 432 C++
Noesis::Delegate<void __cdecl(Noesis::DependencyObject *,Noesis::DependencyPropertyChangedEventArgs const &)>::operator()(Noesis::DependencyObject * <args_0>, const Noesis::DependencyPropertyChangedEventArgs & <args_1>) Line 173 C++
Noesis::DependencyObject::OnPropertyChanged(const Noesis::DependencyPropertyChangedEventArgs & args) Line 626 C++
Noesis::Freezable::OnPropertyChanged(const Noesis::DependencyPropertyChangedEventArgs & e) Line 235 C++
Noesis::DependencyObject::NotifyPropertyChanged(const Noesis::DependencyProperty * dp, Noesis::StoredValue * storedValue, const void * oldValue, const void * newValue, bool valueChanged, bool isBaseComponent, const Noesis::PropertyMetadata * metadata) Line 1280 C++
Noesis::DependencyObject::InternalSetValue(const Noesis::DependencyProperty * dp, void * oldValue, const void * newValue, void * coercedValue, unsigned char priority, Noesis::Expression * newExpression, const Noesis::PropertyMetadata * metadata, Noesis::Value::Destination destination, bool isBaseComponent) Line 913 C++
Noesis::ValueStorageManagerImpl<Noesis::Ptr<Noesis::BaseComponent> >::SetValue(Noesis::DependencyObject * dob, const Noesis::DependencyProperty * dp, const void * value, unsigned char priority, Noesis::Expression * expression, const Noesis::PropertyMetadata * metadata, Noesis::Value::Destination destination) Line 218 C++
Noesis::DependencyProperty::SetValue(Noesis::DependencyObject * obj, const void * value, unsigned char priority, Noesis::Expression * expression, const Noesis::PropertyMetadata * metadata, Noesis::Value::Destination destination) Line 201 C++
Noesis::DependencyObject::InternalSetExpression(const Noesis::DependencyProperty * dp, Noesis::Expression * newExpression, unsigned char priority) Line 703 C++
Noesis::DependencyObject::InternalInvalidateProperty(const Noesis::DependencyProperty * dp, unsigned char priority) Line 1097 C++
Noesis::DependencyObject::InvalidateProperty(const Noesis::DependencyProperty * dp, unsigned char priority) Line 308 C++
Noesis::BindingExpression::InvalidateTarget() Line 1487 C++
Noesis::BindingExpression::OnDataContextChanged(Noesis::BaseComponent * __formal, const Noesis::DependencyPropertyChangedEventArgs & e) Line 1566 C++
Noesis::Delegate<void __cdecl(Noesis::BaseComponent *,Noesis::DependencyPropertyChangedEventArgs const &)>::MemberFuncStub<Noesis::BindingExpression,void (__cdecl Noesis::BindingExpression::*)(Noesis::BaseComponent *,Noesis::DependencyPropertyChangedEventArgs const &)>::Invoke(Noesis::BaseComponent * <args_0>, const Noesis::DependencyPropertyChangedEventArgs & <args_1>) Line 469 C++
[Inline Frame] Noesis::Delegate<void __cdecl(Noesis::BaseComponent *,Noesis::DependencyPropertyChangedEventArgs const &)>::operator()(Noesis::BaseComponent *) Line 172 C++
Noesis::Delegate<void __cdecl(Noesis::BaseComponent *,Noesis::DependencyPropertyChangedEventArgs const &)>::MultiDelegate::Invoke(Noesis::BaseComponent * <args_0>, const Noesis::DependencyPropertyChangedEventArgs & <args_1>) Line 570 C++
Noesis::Delegate<void __cdecl(Noesis::BaseComponent *,Noesis::EventArgs const &)>::operator()(Noesis::BaseComponent * <args_0>, const Noesis::EventArgs & <args_1>) Line 173 C++
Noesis::UIElement::RaiseEvent(Noesis::Symbol key, const Noesis::EventArgs & args) Line 1348 C++
Noesis::FrameworkElement::StaticFillClassType::__l2::<lambda>(Noesis::DependencyObject * d, const Noesis::DependencyPropertyChangedEventArgs & e) Line 3972 C++
Noesis::Delegate<void __cdecl(Noesis::DependencyObject *,Noesis::DependencyPropertyChangedEventArgs const &)>::FunctorStub<void <lambda>(Noesis::DependencyObject *, const Noesis::DependencyPropertyChangedEventArgs &) >::Invoke(Noesis::DependencyObject * <args_0>, const Noesis::DependencyPropertyChangedEventArgs & <args_1>) Line 432 C++
Noesis::Delegate<void __cdecl(Noesis::DependencyObject *,Noesis::DependencyPropertyChangedEventArgs const &)>::operator()(Noesis::DependencyObject * <args_0>, const Noesis::DependencyPropertyChangedEventArgs & <args_1>) Line 173 C++
Noesis::DependencyObject::OnPropertyChanged(const Noesis::DependencyPropertyChangedEventArgs & args) Line 626 C++
Noesis::Visual::OnPropertyChanged(const Noesis::DependencyPropertyChangedEventArgs & args) Line 905 C++
Noesis::UIElement::OnPropertyChanged(const Noesis::DependencyPropertyChangedEventArgs & args) Line 2013 C++
Noesis::FrameworkElement::OnPropertyChanged(const Noesis::DependencyPropertyChangedEventArgs & args) Line 1662 C++
Noesis::Panel::OnPropertyChanged(const Noesis::DependencyPropertyChangedEventArgs & args) Line 147 C++
Noesis::FrameworkElement::UpdateInheritedProp(const Noesis::DependencyProperty * prop, bool isSubPropertyChange, const void * oldValue, const void * newValue) Line 3179 C++
Noesis::FrameworkElement::UpdateInheritedProps(bool connect) Line 3136 C++
Noesis::FrameworkElement::DisconnectInheritanceParent() Line 3058 C++
Noesis::FrameworkElement::OnVisualParentChanged(Noesis::Visual * oldParent) Line 1981 C++
Noesis::Visual::RemoveVisualChild(Noesis::Visual * child) Line 343 C++
Noesis::FrameworkElement::SetSingleVisualChild(Noesis::Visual * child) Line 1423 C++
Noesis::FrameworkElement::OnFrameworkTemplateChanged(Noesis::FrameworkTemplate * oldTemplate, Noesis::FrameworkTemplate * newTemplate) Line 2860 C++
Noesis::FrameworkElement::OnPropertyChanged(const Noesis::DependencyPropertyChangedEventArgs & args) Line 1744 C++
Noesis::ContentPresenter::OnPropertyChanged(const Noesis::DependencyPropertyChangedEventArgs & args) Line 151 C++
Noesis::DependencyObject::NotifyPropertyChanged(const Noesis::DependencyProperty * dp, Noesis::StoredValue * storedValue, const void * oldValue, const void * newValue, bool valueChanged, bool isBaseComponent, const Noesis::PropertyMetadata * metadata) Line 1280 C++
Noesis::DependencyObject::InternalSetValue(const Noesis::DependencyProperty * dp, void * oldValue, const void * newValue, void * coercedValue, unsigned char priority, Noesis::Expression * newExpression, const Noesis::PropertyMetadata * metadata, Noesis::Value::Destination destination, bool isBaseComponent) Line 913 C++
Noesis::DependencyObject::SetValue_<Noesis::Ptr<Noesis::FrameworkTemplate> >(Noesis::Int2Type<1> __formal, const Noesis::DependencyProperty * dp, Noesis::FrameworkTemplate * value, Noesis::Value::Destination destination) Line 195 C++
Noesis::DependencyObject::SetReadOnlyProperty<Noesis::Ptr<Noesis::FrameworkTemplate> >(const Noesis::DependencyProperty * dp, Noesis::FrameworkTemplate * value) Line 76 C++
Noesis::FrameworkElement::SetFrameworkTemplate(Noesis::FrameworkTemplate * frameworkTemplate) Line 1469 C++
Noesis::FrameworkElement::ClearFrameworkTemplate() Line 731 C++
Noesis::ContentPresenter::~ContentPresenter() Line 43 C++
Noesis::ContentPresenter::`scalar deleting destructor'(unsigned int) C++
Noesis::BaseRefCounted::OnDestroy() Line 51 C++
Noesis::DependencyObject::OnDestroy() Line 587 C++
Noesis::FrameworkElement::OnDestroy() Line 1604 C++
Noesis::Ptr<Noesis::Visual>::Reset(Noesis::Visual * ptr) Line 178 C++
Noesis::FrameworkElement::SetSingleVisualChild(Noesis::Visual * child) Line 1428 C++
Noesis::FrameworkElement::~FrameworkElement() Line 213 C++
Noesis::Control::~Control() Line 45 C++
Noesis::ContentControl::~ContentControl() Line 34 C++
Noesis::ListBoxItem::`scalar deleting destructor'(unsigned int) C++
Noesis::BaseRefCounted::OnDestroy() Line 51 C++
Noesis::DependencyObject::OnDestroy() Line 587 C++
Noesis::FrameworkElement::OnDestroy() Line 1604 C++
[Inline Frame] Noesis::BaseRefCounted::InternalRelease() Line 67 C++
[Inline Frame] Noesis::BaseRefCounted::Release() Line 37 C++
[Inline Frame] Noesis::Ptr<Noesis::BaseComponent>::{dtor}() Line 77 C++
Noesis::BaseVector<Noesis::Ptr<Noesis::BaseComponent> >::DestroyRange(Noesis::Ptr<Noesis::BaseComponent> * first, Noesis::Ptr<Noesis::BaseComponent> * last, Noesis::BaseVector<Noesis::Ptr<Noesis::BaseComponent> >::IsPod<0> __formal) Line 763 C++
Noesis::BaseVector<Noesis::Ptr<Noesis::BaseComponent> >::Clear() Line 195 C++
Noesis::BaseCollection::ClearItems() Line 173 C++
Noesis::BaseUICollection::ClearItems() Line 176 C++
Noesis::BaseCollection::Clear() Line 45 C++
Noesis::Panel::OnResetItems() Line 526 C++
Noesis::Panel::OnItemsChangedOverride(Noesis::BaseComponent * __formal, const Noesis::ItemsChangedEventArgs & e) Line 409 C++
Noesis::Panel::OnItemsChanged(Noesis::BaseComponent * sender, const Noesis::ItemsChangedEventArgs & e) Line 378 C++
Noesis::Delegate<void __cdecl(Noesis::BaseComponent *,Noesis::ItemsChangedEventArgs const &)>::MemberFuncStub<Noesis::Panel,void (__cdecl Noesis::Panel::*)(Noesis::BaseComponent *,Noesis::ItemsChangedEventArgs const &)>::Invoke(Noesis::BaseComponent * <args_0>, const Noesis::ItemsChangedEventArgs & <args_1>) Line 469 C++
Noesis::Delegate<void __cdecl(Noesis::BaseComponent *,Noesis::ItemsChangedEventArgs const &)>::operator()(Noesis::BaseComponent * <args_0>, const Noesis::ItemsChangedEventArgs & <args_1>) Line 173 C++
Noesis::ItemContainerGenerator::OnReset() Line 1237 C++
Noesis::ItemContainerGenerator::OnItemsChanged(Noesis::BaseComponent * __formal, const Noesis::NotifyCollectionChangedEventArgs & e) Line 833 C++
Noesis::Delegate<void __cdecl(Noesis::BaseComponent *,Noesis::NotifyCollectionChangedEventArgs const &)>::MemberFuncStub<Noesis::ItemContainerGenerator,void (__cdecl Noesis::ItemContainerGenerator::*)(Noesis::BaseComponent *,Noesis::NotifyCollectionChangedEventArgs const &)>::Invoke(Noesis::BaseComponent * <args_0>, const Noesis::NotifyCollectionChangedEventArgs & <args_1>) Line 469 C++
Noesis::Delegate<void __cdecl(Noesis::BaseComponent *,Noesis::NotifyCollectionChangedEventArgs const &)>::operator()(Noesis::BaseComponent * <args_0>, const Noesis::NotifyCollectionChangedEventArgs & <args_1>) Line 173 C++
Noesis::Delegate<void __cdecl(Noesis::BaseComponent *,Noesis::NotifyCollectionChangedEventArgs const &)>::MultiDelegate::Invoke(Noesis::BaseComponent * <args_0>, const Noesis::NotifyCollectionChangedEventArgs & <args_1>) Line 573 C++
Noesis::Delegate<void __cdecl(Noesis::BaseComponent *,Noesis::NotifyCollectionChangedEventArgs const &)>::operator()(Noesis::BaseComponent * <args_0>, const Noesis::NotifyCollectionChangedEventArgs & <args_1>) Line 173 C++
Noesis::ItemCollection::OnCollectionChanged(Noesis::BaseComponent * sender, const Noesis::NotifyCollectionChangedEventArgs & args) Line 479 C++
Noesis::Delegate<void __cdecl(Noesis::BaseComponent *,Noesis::NotifyCollectionChangedEventArgs const &)>::MemberFuncStub<Noesis::ItemCollection,void (__cdecl Noesis::ItemCollection::*)(Noesis::BaseComponent *,Noesis::NotifyCollectionChangedEventArgs const &)>::Invoke(Noesis::BaseComponent * <args_0>, const Noesis::NotifyCollectionChangedEventArgs & <args_1>) Line 469 C++
Noesis::Delegate<void __cdecl(Noesis::BaseComponent *,Noesis::NotifyCollectionChangedEventArgs const &)>::operator()(Noesis::BaseComponent * <args_0>, const Noesis::NotifyCollectionChangedEventArgs & <args_1>) Line 173 C++
Noesis::CollectionView::InternalCollectionChanged(Noesis::BaseComponent * sender, const Noesis::NotifyCollectionChangedEventArgs & args) Line 300 C++
Noesis::Delegate<void __cdecl(Noesis::BaseComponent *,Noesis::NotifyCollectionChangedEventArgs const &)>::MemberFuncStub<Noesis::CollectionView,void (__cdecl Noesis::CollectionView::*)(Noesis::BaseComponent *,Noesis::NotifyCollectionChangedEventArgs const &)>::Invoke(Noesis::BaseComponent * <args_0>, const Noesis::NotifyCollectionChangedEventArgs & <args_1>) Line 469 C++
Noesis::Delegate<void __cdecl(Noesis::BaseComponent *,Noesis::NotifyCollectionChangedEventArgs const &)>::operator()(Noesis::BaseComponent * <args_0>, const Noesis::NotifyCollectionChangedEventArgs & <args_1>) Line 173 C++
> Noesis::BaseObservableCollection::ClearItems() Line 125 C++
Noesis::BaseCollection::Clear() Line 45 C++
CustomDataModel::ReloadObservableCollection(unsigned int PartTypeID) Line 692 C++
TabMenuUserControl::OnPartTypeChanged(Noesis::BaseComponent * __formal, const Noesis::SelectionChangedEventArgs & rArgs) Line 533 C++
Noesis::Delegate<void __cdecl(Noesis::BaseComponent *,Noesis::RoutedEventArgs const &)>::Invoke(Noesis::BaseComponent * <args_0>, const Noesis::RoutedEventArgs & <args_1>, const void * param, bool(*)(const void *) abort) Line 185 C++
Noesis::UIElement::NotifyHandlers(const Noesis::RoutedEventArgs & args) Line 2735 C++
Noesis::UIElement::BubblingEvent(const Noesis::RoutedEventArgs & args) Line 2787 C++
Noesis::UIElement::RaiseEvent(const Noesis::RoutedEventArgs & args) Line 1242 C++
Noesis::Selector::OnSelectionChanged(const Noesis::SelectionChangedEventArgs & args) Line 142 C++
Noesis::ListBox::OnSelectionChanged(const Noesis::SelectionChangedEventArgs & args) Line 96 C++
TabMenu::OnSelectionChanged(const Noesis::SelectionChangedEventArgs & rArgs) Line 113 C++
Noesis::Selector::UpdateSingleSelectedAndRaiseEvent(const Noesis::SelectionChangedEventArgs & e, Noesis::BaseComponent * selectedItem, int selectedIndex, bool raiseSelectionChanged) Line 1029 C++
Noesis::Selector::OnSelectedIndexChanged(int oldIndex, int newIndex) Line 1089 C++
Noesis::Selector::OnPropertyChanged(const Noesis::DependencyPropertyChangedEventArgs & args) Line 611 C++
Noesis::ListBox::OnPropertyChanged(const Noesis::DependencyPropertyChangedEventArgs & args) Line 71 C++
Noesis::DependencyObject::NotifyPropertyChanged(const Noesis::DependencyProperty * dp, Noesis::StoredValue * storedValue, const void * oldValue, const void * newValue, bool valueChanged, bool isBaseComponent, const Noesis::PropertyMetadata * metadata) Line 1280 C++
Noesis::DependencyObject::InternalSetValue(const Noesis::DependencyProperty * dp, void * oldValue, const void * newValue, void * coercedValue, unsigned char priority, Noesis::Expression * newExpression, const Noesis::PropertyMetadata * metadata, Noesis::Value::Destination destination, bool isBaseComponent) Line 913 C++
Noesis::DependencyObject::SetValue_<int>(Noesis::Int2Type<0> __formal, const Noesis::DependencyProperty * dp, int value, Noesis::Value::Destination destination) Line 181 C++
Noesis::DependencyObject::SetValue<int>(const Noesis::DependencyProperty * dp, int value) Line 60 C++
Noesis::Selector::SetSelectedIndex(int index) Line 94 C++
TabMenuUserControl::OnKeyDownOnRootWindow(Noesis::BaseComponent * __formal, const Noesis::KeyEventArgs & e) Line 158 C++
[Inline Frame] Noesis::Delegate<void __cdecl(Noesis::BaseComponent *,Noesis::KeyEventArgs const &)>::operator()(Noesis::BaseComponent *) Line 172 C++
Noesis::Delegate<void __cdecl(Noesis::BaseComponent *,Noesis::KeyEventArgs const &)>::MultiDelegate::Invoke(Noesis::BaseComponent * <args_0>, const Noesis::KeyEventArgs & <args_1>, const void * param, bool(*)(const void *) abort) Line 588 C++
Noesis::Delegate<void __cdecl(Noesis::BaseComponent *,Noesis::RoutedEventArgs const &)>::Invoke(Noesis::BaseComponent * <args_0>, const Noesis::RoutedEventArgs & <args_1>, const void * param, bool(*)(const void *) abort) Line 185 C++
Noesis::UIElement::NotifyHandlers(const Noesis::RoutedEventArgs & args) Line 2735 C++
Noesis::UIElement::BubblingEvent(const Noesis::RoutedEventArgs & args) Line 2787 C++
Noesis::UIElement::RaiseEvent(const Noesis::RoutedEventArgs & args) Line 1242 C++
Noesis::Keyboard::KeyDown(Noesis::Key key) Line 221 C++
Noesis::View::KeyDown(Noesis::Key key) Line 747 C++
| ||||
| Platform | Any | ||||
|
A little update, I've tried adding logs to the destructor of DependencyObject and FrameworkElement to try and track the addresses of the dependencyobjects being destroyed, and I've been unable to reproduce after 15 minutes of clearing out the observable collection. I'm starting to think this might be a threading issue as the logs obviously affect the timings. I'll try writing out to a global string builder instead of logging to see if I can get it to crash but still keep the debugging info. |
|
|
I've been trying myself to reproduce the crash without success. The callstak you attached indicates that mEffectiveConverter is a destroyed object, and that can only occur if the BindingExpression where the code is being executed is also destroyed. mTargetObject->VerifyAccess(); |
|
|
Okay, sorry for this bug report, it was a false positive. I've spent the last day tracking this down. It turns out it was related to a very rare edge case that was stomping memory. It turns out that the pattern that caused it to happen just made it occur in the same address space as the UI which was causing it to trample over random dependency property memory. I enabled our stomp checker which makes individual allocations allocate 2 pages, writes to 1 page and locks the other. This allows us to throw access violations if Windows detect you attempt to access any memory in that virtual addressable space. This allowed me to capture our system which was stomping the DependencyObjects. It turns out it was something in our own engine to do with streaming of assets, but I managed to fix that issue and the UI cleans up fine, so apologies for the false positive, everything is good now. Feel free to close this bug. Cheers, -Steven |
|
|
Thanks for the update, I'm closing it. |
|
| Date Modified | Username | Field | Change |
|---|---|---|---|
| 2021-01-22 00:51 | steveh | New Issue | |
| 2021-01-22 00:51 | steveh | File Added: callstack.txt | |
| 2021-01-22 10:59 | jsantos | Assigned To | => sfernandez |
| 2021-01-22 10:59 | jsantos | Status | new => assigned |
| 2021-01-22 10:59 | jsantos | Target Version | => 3.0.10 |
| 2021-01-22 10:59 | jsantos | Description Updated | |
| 2021-01-22 10:59 | jsantos | Steps to Reproduce Updated | |
| 2021-01-22 12:24 | steveh | Note Added: 0006992 | |
| 2021-01-22 12:58 | sfernandez | Status | assigned => feedback |
| 2021-01-22 12:58 | sfernandez | Note Added: 0006993 | |
| 2021-01-24 03:28 | steveh | Note Added: 0006994 | |
| 2021-01-24 03:28 | steveh | Status | feedback => assigned |
| 2021-01-25 10:51 | sfernandez | Status | assigned => resolved |
| 2021-01-25 10:51 | sfernandez | Resolution | open => no change required |
| 2021-01-25 10:51 | sfernandez | Fixed in Version | => 3.0.10 |
| 2021-01-25 10:51 | sfernandez | Note Added: 0006995 |