1. Open project with lots of files 2. Open file in editor tab 3. Open Tools -> Search and replace in files 4. Search "Source" for something tiny like "a" 5. In Mass replace dock, enter "a" in Replace, click Preview 6. In With enter something else e.g. "WWWW", click Mass Replace Lots of files are modified, if running Lokalize from the terminal there is a lot of debug output like: > skipping replace because "bla bla" != "blWWWW blWWWW" Sometimes output like: > QFile::remove: Empty or null file name > QObject: Cannot create children for a parent that is in a different thread. > (Parent is QThreadPoolThread(0x55a5aa756a80), parent's thread is QThread(0x55a5a8dc4350), current thread is QThreadPoolThread(0x55a5aa756a80) Lines immediately prior to assertion fail are: > QFile::remove: Empty or null file name > QObject: Cannot create children for a parent that is in a different thread. > (Parent is QThreadPoolThread(0x55a5aa756a80), parent's thread is QThread(0x55a5a8dc4350), current thread is QThreadPoolThread(0x55a5aa756a80) > ASSERT: "info.translated == FileMetaData::extract(file.localPath()).translated" in file /home/puf/kde/src/lokalize/src/project/updatestatsjob.cpp, line 79 GDB backtrace: #0 __pthread_kill_implementation (threadid=<optimized out>, signo=signo@entry=6, no_tid=no_tid@entry=0) at pthread_kill.c:44 44 return INTERNAL_SYSCALL_ERROR_P (ret) ? INTERNAL_SYSCALL_ERRNO (ret) : 0; [Current thread is 1 (Thread 0x7feaaaffd6c0 (LWP 300481))] (gdb) backtrace #0 __pthread_kill_implementation (threadid=<optimized out>, signo=signo@entry=6, no_tid=no_tid@entry=0) at pthread_kill.c:44 #1 0x00007feaeb0989d3 in __pthread_kill_internal (threadid=<optimized out>, signo=6) at pthread_kill.c:89 #2 0x00007feaeb03e3a0 in __GI_raise (sig=sig@entry=6) at ../sysdeps/posix/raise.c:26 #3 0x00007feaeb02557a in __GI_abort () at abort.c:77 #4 0x00007feaeb8934a4 in qAbort () at /usr/src/debug/qt6-base/qtbase/src/corelib/global/qassert.cpp:46 #5 qt_maybe_message_fatal<QString&> (msgType=QtFatalMsg, context=<optimized out>, message=...) at /usr/src/debug/qt6-base/qtbase/src/corelib/global/qlogging.cpp:2166 #6 qt_message(QtMsgType, const QMessageLogContext &, const char *, typedef __va_list_tag __va_list_tag *) (msgType=msgType@entry=QtFatalMsg, context=..., msg=msg@entry=0x7feaebc78290 "ASSERT: \"%s\" in file %s, line %d", ap=ap@entry=0x7feaaaffc258) at /usr/src/debug/qt6-base/qtbase/src/corelib/global/qlogging.cpp:412 #7 0x00007feaeb894268 in QMessageLogger::fatal (this=<optimized out>, msg=0x7feaebc78290 "ASSERT: \"%s\" in file %s, line %d") at /usr/src/debug/qt6-base/qtbase/src/corelib/global/qlogging.cpp:901 #8 0x00007feaeb891930 in qt_assert (assertion=<optimized out>, file=<optimized out>, line=<optimized out>) at /usr/src/debug/qt6-base/qtbase/src/corelib/global/qassert.cpp:113 #9 0x000055a5940b587c in cachedMetaData (file=...) at /home/fin-w/kde/src/lokalize/src/project/updatestatsjob.cpp:79 #10 0x000055a5940b5f79 in UpdateStatsJob::run (this=0x55a5afe9edd0) at /home/fin-w/kde/src/lokalize/src/project/updatestatsjob.cpp:119 #11 0x00007feaeba8efc5 in QThreadPoolThread::run (this=0x55a5a95a16c0) at /usr/src/debug/qt6-base/qtbase/src/corelib/thread/qthreadpool.cpp:72 #12 0x00007feaebb2f899 in operator() (__closure=<optimized out>) at /usr/src/debug/qt6-base/qtbase/src/corelib/thread/qthread_unix.cpp:437 #13 (anonymous namespace)::terminate_on_exception<QThreadPrivate::start(void*)::<lambda()> > (t=<optimized out>) at /usr/src/debug/qt6-base/qtbase/src/corelib/thread/qthread_unix.cpp:367 #14 QThreadPrivate::start (arg=0x55a5a95a16c0) at /usr/src/debug/qt6-base/qtbase/src/corelib/thread/qthread_unix.cpp:397 #15 0x00007feaeb09698b in start_thread (arg=<optimized out>) at pthread_create.c:448 #16 0x00007feaeb11a9cc in __GI___clone3 () at ../sysdeps/unix/sysv/linux/x86_64/clone3.S:78
This needs assertions turned on to trigger so needs to be built locally with them on. It's present in current Git main branch.