Am 09.05.2017 um 21:19 schrieb john kennan <[email protected]>:
>
> Start a new file
> type something
> save
> type some more
> save
>
> I get "the file ... changed on disk." with two buttons: "Reload" and "Ignore"
>
> hitting Ignore leaves the file unsaved
> hitting Reload works -- I get a warning:
>
> Any changes will be lost. Are you sure you want to load the version on disk
> of the document .../Papers/LyX/test1.lyx?
>
> with buttons for Revert and Cancel
> Hitting Revert saves the file, as desired, and the changes are not lost.
Confirmed.
Guillaume, it’s the FileMonitor which is detecting the file save as external
modification.
How can I provide further info to correct this annoying behavior?
My attempt to diagnose the culprit failed - the code is too weird for me :(
I tried to stop in Buffer::Impl::refreshFileMonitor() at the first line.
The debugger didn’t stop - but it stopped in
Buffer::Impl::fileExternallyModified()
and the call stack claims it comes from the last line in refreshFileMonitor()
???
Frankly said: I’m lost now.
Stephan
(lldb) bt
* thread #1: tid = 0x5bbf69, 0x00000001001260a6
LyX`lyx::Buffer::Impl::fileExternallyModified(this=0x0000000107129400,
modified=true) const + 38 at Buffer.cpp:5342, queue = 'com.apple.main-thread',
stop reason = breakpoint 2.1
frame #0: 0x00000001001260a6
LyX`lyx::Buffer::Impl::fileExternallyModified(this=0x0000000107129400,
modified=true) const + 38 at Buffer.cpp:5342
* frame #1: 0x000000010017f83d
LyX`lyx::Buffer::Impl::refreshFileMonitor(this=0x0000000103e5f720)::$_0::operator()()
const + 29 at Buffer.cpp:5335
frame #2: 0x000000010017f45d
LyX`boost::detail::function::void_function_obj_invoker0<lyx::Buffer::Impl::refreshFileMonitor()::$_0,
void>::invoke(function_obj_ptr=0x0000000103e5f720) + 29 at
function_template.hpp:159
frame #3: 0x000000010108dce8
LyX`boost::function0<void>::operator(this=0x0000000103e5f718)() const + 120 at
function_template.hpp:770
frame #4: 0x000000010108dc64 LyX`boost::signals2::detail::void_type
boost::signals2::detail::call_with_tuple_args<boost::signals2::detail::void_type>::m_invoke<boost::function<void
(this=0x00007fff5fbfbb70, func=0x0000000103e5f718,
(null)=unsigned_meta_array<> @ 0x00007fff5fbfbae0, (null)=0x00007fff5fbfc040,
(null)=0x0000000000000000)> >(boost::function<void ()>&,
boost::signals2::detail::unsigned_meta_array<>, std::__1::tuple<> const&,
boost::enable_if<boost::is_void<boost::function<void ()>::result_type>,
void>::type*) const + 36 at variadic_slot_invoker.hpp:117
frame #5: 0x000000010108dc19 LyX`boost::signals2::detail::void_type
boost::signals2::detail::call_with_tuple_args<boost::signals2::detail::void_type>::operator(this=0x00007fff5fbfbb70,
func=0x0000000103e5f718, args=0x00007fff5fbfc040, (null)=size_t<0> @
0x00007fff5fbfbb30)<boost::function<void ()>, 0ul>(boost::function<void ()>&,
std::__1::tuple<> const&, mpl_::size_t<0ul>) const + 41 at
variadic_slot_invoker.hpp:90
frame #6: 0x000000010108dbe1 LyX`boost::signals2::detail::void_type
boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type>::operator(this=0x00007fff5fbfc040,
connectionBody=0x0000000103e5bbb0)<boost::shared_ptr<boost::signals2::detail::connection_body<std::__1::pair<boost::signals2::detail::slot_meta_group,
boost::optional<int> >, boost::signals2::slot<void (), boost::function<void
()> >, boost::signals2::mutex> >
>(boost::shared_ptr<boost::signals2::detail::connection_body<std::__1::pair<boost::signals2::detail::slot_meta_group,
boost::optional<int> >, boost::signals2::slot<void (), boost::function<void
()> >, boost::signals2::mutex> > const&) const + 65 at
variadic_slot_invoker.hpp:133
frame #7: 0x000000010108da9a
LyX`boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type>,
std::__1::__list_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::__1::pair<boost::signals2::detail::slot_meta_group,
boost::optional<int> >, boost::signals2::slot<void (), boost::function<void
()> >, boost::signals2::mutex> >, void*>,
boost::signals2::detail::connection_body<std::__1::pair<boost::signals2::detail::slot_meta_group,
boost::optional<int> >, boost::signals2::slot<void (), boost::function<void
()> >, boost::signals2::mutex> >::dereference(this=0x00007fff5fbfbcf0) const +
154 at slot_call_iterator.hpp:110
frame #8: 0x000000010108d9d5
LyX`boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type>,
std::__1::__list_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::__1::pair<boost::signals2::detail::slot_meta_group,
boost::optional<int> >, boost::signals2::slot<void (), boost::function<void
()> >, boost::signals2::mutex> >, void*>,
boost::signals2::detail::connection_body<std::__1::pair<boost::signals2::detail::slot_meta_group,
boost::optional<int> >, boost::signals2::slot<void (), boost::function<void
()> >, boost::signals2::mutex> >::reference
boost::iterators::iterator_core_access::dereference<boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type>,
std::__1::__list_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::__1::pair<boost::signals2::detail::slot_meta_group,
boost::optional<int> >, boost::signals2::slot<void (f=0x00007fff5fbfbcf0),
boost::function<void ()> >, boost::signals2::mutex> >, void*>,
boost::signals2::detail::connection_body<std::__1::pair<boost::signals2::detail::slot_meta_group,
boost::optional<int> >, boost::signals2::slot<void (), boost::function<void
()> >, boost::signals2::mutex> >
>(boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type>,
std::__1::__list_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::__1::pair<boost::signals2::detail::slot_meta_group,
boost::optional<int> >, boost::signals2::slot<void (), boost::function<void
()> >, boost::signals2::mutex> >, void*>,
boost::signals2::detail::connection_body<std::__1::pair<boost::signals2::detail::slot_meta_group,
boost::optional<int> >, boost::signals2::slot<void (), boost::function<void
()> >, boost::signals2::mutex> > const&) + 21 at iterator_facade.hpp:549
frame #9: 0x000000010108d90d
LyX`boost::iterators::detail::iterator_facade_base<boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type>,
std::__1::__list_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::__1::pair<boost::signals2::detail::slot_meta_group,
boost::optional<int> >, boost::signals2::slot<void (), boost::function<void
()> >, boost::signals2::mutex> >, void*>,
boost::signals2::detail::connection_body<std::__1::pair<boost::signals2::detail::slot_meta_group,
boost::optional<int> >, boost::signals2::slot<void (), boost::function<void
()> >, boost::signals2::mutex> >, boost::signals2::detail::void_type,
boost::iterators::single_pass_traversal_tag,
boost::signals2::detail::void_type&, long, false,
false>::operator*(this=0x00007fff5fbfbcf0) const + 29 at iterator_facade.hpp:655
frame #10: 0x000000010108d855 LyX`void
boost::signals2::optional_last_value<void>::operator(this=0x000000015382a1e0,
first=slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type>,
std::__1::__list_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::__1::pair<boost::signals2::detail::slot_meta_group,
boost::optional<int> >, boost::signals2::slot<void (), boost::function<void
()> >, boost::signals2::mutex> >, void *>,
boost::signals2::detail::connection_body<std::__1::pair<boost::signals2::detail::slot_meta_group,
boost::optional<int> >, boost::signals2::slot<void (), boost::function<void
()> >, boost::signals2::mutex> > @ 0x00007fff5fbfbcf0,
last=slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type>,
std::__1::__list_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::__1::pair<boost::signals2::detail::slot_meta_group,
boost::optional<int> >, boost::signals2::slot<void (), boost::function<void
()> >, boost::signals2::mutex> >, void *>,
boost::signals2::detail::connection_body<std::__1::pair<boost::signals2::detail::slot_meta_group,
boost::optional<int> >, boost::signals2::slot<void (), boost::function<void
()> >, boost::signals2::mutex> > @
0x00007fff5fbfbd10)<boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type>,
std::__1::__list_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::__1::pair<boost::signals2::detail::slot_meta_group,
boost::optional<int> >, boost::signals2::slot<void (), boost::function<void
()> >, boost::signals2::mutex> >, void*>,
boost::signals2::detail::connection_body<std::__1::pair<boost::signals2::detail::slot_meta_group,
boost::optional<int> >, boost::signals2::slot<void (), boost::function<void
()> >, boost::signals2::mutex> >
>(boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type>,
std::__1::__list_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::__1::pair<boost::signals2::detail::slot_meta_group,
boost::optional<int> >, boost::signals2::slot<void (), boost::function<void
()> >, boost::signals2::mutex> >, void*>,
boost::signals2::detail::connection_body<std::__1::pair<boost::signals2::detail::slot_meta_group,
boost::optional<int> >, boost::signals2::slot<void (), boost::function<void
()> >, boost::signals2::mutex> >,
boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type>,
std::__1::__list_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::__1::pair<boost::signals2::detail::slot_meta_group,
boost::optional<int> >, boost::signals2::slot<void (), boost::function<void
()> >, boost::signals2::mutex> >, void*>,
boost::signals2::detail::connection_body<std::__1::pair<boost::signals2::detail::slot_meta_group,
boost::optional<int> >, boost::signals2::slot<void (), boost::function<void
()> >, boost::signals2::mutex> >) const + 69 at optional_last_value.hpp:57
frame #11: 0x000000010108d62f LyX`void
boost::signals2::detail::combiner_invoker<void>::operator(this=0x00007fff5fbfbed0,
combiner=0x000000015382a1e0,
first=slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type>,
std::__1::__list_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::__1::pair<boost::signals2::detail::slot_meta_group,
boost::optional<int> >, boost::signals2::slot<void (), boost::function<void
()> >, boost::signals2::mutex> >, void *>,
boost::signals2::detail::connection_body<std::__1::pair<boost::signals2::detail::slot_meta_group,
boost::optional<int> >, boost::signals2::slot<void (), boost::function<void
()> >, boost::signals2::mutex> > @ 0x00007fff5fbfbd90,
last=slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type>,
std::__1::__list_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::__1::pair<boost::signals2::detail::slot_meta_group,
boost::optional<int> >, boost::signals2::slot<void (), boost::function<void
()> >, boost::signals2::mutex> >, void *>,
boost::signals2::detail::connection_body<std::__1::pair<boost::signals2::detail::slot_meta_group,
boost::optional<int> >, boost::signals2::slot<void (), boost::function<void
()> >, boost::signals2::mutex> > @
0x00007fff5fbfbdb0)<boost::signals2::optional_last_value<void>,
boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type>,
std::__1::__list_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::__1::pair<boost::signals2::detail::slot_meta_group,
boost::optional<int> >, boost::signals2::slot<void (), boost::function<void
()> >, boost::signals2::mutex> >, void*>,
boost::signals2::detail::connection_body<std::__1::pair<boost::signals2::detail::slot_meta_group,
boost::optional<int> >, boost::signals2::slot<void (), boost::function<void
()> >, 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>,
std::__1::__list_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::__1::pair<boost::signals2::detail::slot_meta_group,
boost::optional<int> >, boost::signals2::slot<void (), boost::function<void
()> >, boost::signals2::mutex> >, void*>,
boost::signals2::detail::connection_body<std::__1::pair<boost::signals2::detail::slot_meta_group,
boost::optional<int> >, boost::signals2::slot<void (), boost::function<void
()> >, boost::signals2::mutex> >,
boost::signals2::detail::slot_call_iterator_t<boost::signals2::detail::variadic_slot_invoker<boost::signals2::detail::void_type>,
std::__1::__list_iterator<boost::shared_ptr<boost::signals2::detail::connection_body<std::__1::pair<boost::signals2::detail::slot_meta_group,
boost::optional<int> >, boost::signals2::slot<void (), boost::function<void
()> >, boost::signals2::mutex> >, void*>,
boost::signals2::detail::connection_body<std::__1::pair<boost::signals2::detail::slot_meta_group,
boost::optional<int> >, boost::signals2::slot<void (), boost::function<void
()> >, boost::signals2::mutex> >) const + 175 at result_type_wrapper.hpp:64
frame #12: 0x000000010108d3c6 LyX`boost::signals2::detail::signal_impl<void
(), boost::signals2::optional_last_value<void>, int, std::__1::less<int>,
boost::function<void ()>, boost::function<void (boost::signals2::connection
const&)>, boost::signals2::mutex>::operator(this=0x000000015382a470)() + 998 at
signal_template.hpp:242
frame #13: 0x000000010107c111 LyX`boost::signals2::signal<void (),
boost::signals2::optional_last_value<void>, int, std::__1::less<int>,
boost::function<void ()>, boost::function<void (boost::signals2::connection
const&)>, boost::signals2::mutex>::operator(this=0x000000015382a730)() + 33 at
signal_template.hpp:723
frame #14: 0x000000010107c0d3
LyX`lyx::support::FileMonitor::changed(this=0x000000015382a720) + 35 at
FileMonitor.cpp:196
frame #15: 0x000000010107d441
LyX`lyx::support::FileMonitor::qt_static_metacall(_o=0x000000015382a720,
_c=InvokeMetaMethod, _id=1, _a=0x00007fff5fbfc298) + 177 at
moc_FileMonitor.cpp:271
frame #16: 0x0000000103492b4c QtCore`QMetaObject::activate(QObject*, int,
int, void**) + 3020
frame #17: 0x000000010107bb62
LyX`lyx::support::FileMonitorGuard::fileChanged(this=0x000000015382a5d8) const
+ 34 at moc_FileMonitor.cpp:140
frame #18: 0x000000010107bbfd
LyX`lyx::support::FileMonitorGuard::notifyChange(this=0x000000015382a5d8,
path=0x000000013b1d5200) + 109 at FileMonitor.cpp:153
frame #19: 0x000000010107cfca
LyX`lyx::support::FileMonitorGuard::qt_static_metacall(_o=0x000000015382a5d8,
_c=InvokeMetaMethod, _id=2, _a=0x00007fff5fbfc4d0) + 202 at
moc_FileMonitor.cpp:85
frame #20: 0x0000000103492b4c QtCore`QMetaObject::activate(QObject*, int,
int, void**) + 3020
frame #21: 0x00000001033de6b1
QtCore`QFileSystemWatcher::qt_static_metacall(QObject*, QMetaObject::Call, int,
void**) + 433
frame #22: 0x0000000103492b4c QtCore`QMetaObject::activate(QObject*, int,
int, void**) + 3020
frame #23: 0x000000010352cd60
QtCore`QFileSystemWatcherEngine::fileChanged(QString const&, bool) + 64
frame #24: 0x000000010348ae02 QtCore`QObject::event(QEvent*) + 146
frame #25: 0x0000000102541a76
QtWidgets`QApplicationPrivate::notify_helper(QObject*, QEvent*) + 294
frame #26: 0x0000000102542fd8 QtWidgets`QApplication::notify(QObject*,
QEvent*) + 504
frame #27: 0x0000000100c4e07e
LyX`lyx::frontend::GuiApplication::notify(this=0x0000000103f0af40,
receiver=0x00000001538247d0, event=0x000000015519c290) + 78 at
GuiApplication.cpp:2702
frame #28: 0x000000010345cce4
QtCore`QCoreApplication::notifyInternal2(QObject*, QEvent*) + 164
frame #29: 0x000000010345da2b
QtCore`QCoreApplicationPrivate::sendPostedEvents(QObject*, int, QThreadData*) +
875
frame #30: 0x000000010a93628e
libqcocoa.dylib`QCocoaEventDispatcherPrivate::processPostedEvents() + 190
frame #31: 0x000000010a936b51
libqcocoa.dylib`QCocoaEventDispatcherPrivate::postedEventsSourceCallback(void*)
+ 33
frame #32: 0x00007fff96f647e1
CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
frame #33: 0x00007fff96f43f1c CoreFoundation`__CFRunLoopDoSources0 + 556
frame #34: 0x00007fff96f4343f CoreFoundation`__CFRunLoopRun + 927
frame #35: 0x00007fff96f42e38 CoreFoundation`CFRunLoopRunSpecific + 296
frame #36: 0x00007fff995ac935 HIToolbox`RunCurrentEventLoopInMode + 235
frame #37: 0x00007fff995ac76f HIToolbox`ReceiveNextEventCommon + 432
frame #38: 0x00007fff995ac5af
HIToolbox`_BlockUntilNextEventMatchingListInModeWithFilter + 71
frame #39: 0x00007fff93f7fdf6 AppKit`_DPSNextEvent + 1067
frame #40: 0x00007fff93f7f226 AppKit`-[NSApplication
_nextEventMatchingEventMask:untilDate:inMode:dequeue:] + 454
frame #41: 0x00007fff93f73d80 AppKit`-[NSApplication run] + 682
frame #42: 0x000000010a935a5f
libqcocoa.dylib`QCocoaEventDispatcher::processEvents(QFlags<QEventLoop::ProcessEventsFlag>)
+ 2191
frame #43: 0x0000000103458ea1
QtCore`QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) + 417
frame #44: 0x000000010345d355 QtCore`QCoreApplication::exec() + 341
frame #45: 0x0000000100c4bca6
LyX`lyx::frontend::GuiApplication::exec(this=0x0000000103f0af40) + 54 at
GuiApplication.cpp:2468
frame #46: 0x0000000100c4bcc9 LyX`non-virtual thunk to
lyx::frontend::GuiApplication::exec(this=0x0000000103f0af40) + 25 at
GuiApplication.cpp:2461
frame #47: 0x00000001004ac50f LyX`lyx::LyX::exec(this=0x00007fff5fbff550,
argc=0x00007fff5fbff568, argv=0x00007fff5fbff598) + 4447 at LyX.cpp:398
frame #48: 0x000000010075b606 LyX`main(argc=1, argv=0x00007fff5fbff598) +
86 at main.cpp:42
frame #49: 0x00007fff94b935ad libdyld.dylib`start + 1
frame #50: 0x00007fff94b935ad libdyld.dylib`start + 1
(lldb)