Writer(Win版)がフリーズする

バージョン4くらいからWriter(Win版)で[ctrl]+[z]を押した際にフリーズする事が多くなったような気がするのですが、同じような経験されている方いらっしゃらないでしょうか?

なかなか再現できず質問したくてもできずにいたのですが、先日、半角英数字を入力→全角文字を入力→[ctrl]+[z]→[ctrl]+[z]の手順でフリーズする事を発見しました。私の環境下では再現性がありましたので実際に行った手順を書き込みます。

<手順>

  1. Writerを起動
  2. 入力モードが日本語になっている場合は[半角/全角]キーを押して日本語入力オフ(直接入力モード)に変更
  3. 「a」(半角)を入力
  4. [半角/全角]キーを押して日本語モードに変更
  5. 「あ」を入力 ※コピー&ペーストではなくキーボードから入力
  6. [enter]キーを押して日本語を確定
  7. [ctrl]+[z]→「あ」が消えます
  8. [ctrl]+[z]→soffice.binのCPU使用率が50%~99%となり操作を受け付けなくなります

<環境等>

  • LibreOfficeのバージョンを4.0.6, 4.2.6, 4.3.0と変えてみたり、OSをXP, Vista, 7(いずれも32bit)と変えてみたり、セーフモードで起動してみたりしましたが結果は同じでした。ちょっと曖昧ですみません。
  • Ubuntu版LibreOffice4.3.2.2では再現されませんでした。→最初のUndoで「aあ」の両文字が消えます。

Win7 32bit版+LO 4.2.5で再現しました。
Ubuntu4.10+LO4.3.2では、報告にもあるとおり「aあ」がまとめて消えてしまう現象が再現しました。
以前から再現方法を探していたんですが、とてもシンプルな手順を提示して頂いたので光明が見えた感じです。
win4.3.3での再現性を確認したうえで報告するのが良さげですね。

また、IMEがONの場合にアンドゥすることで発生するものと見られますので、Google日本語入力などに切り替える事で発生しない様なら、暫定的な対応方法として案内できるかも知れませんね。

目黒さん、回答有難うございます。

昨日時間が取れなくてコメントできなかったのですが、Windows版masterでも再現しました。私はGoogle日本語入力を利用しています。

時間が取れたらTDF Wikiにある方法 でバックトレースを取って、バグを起票しようと思いますが、どなたかやっていただいてももちろん構いません。

肝心なことを書いていなかったので追記しますが、4.2.7でもいただいた手順で再現しました。

ちゃんとした情報でなくて申し訳ないですが、私の環境(Windows 7 64bit)だとWriter 4.3.2のときはやはりUndoが不安定で、4.2.7にしてしまったというのはあります。Ubuntuだとそんなことはなくて4.3系でも安定して動いていますが、これはもしかしたら64bit版か32bit版かという違いかもしれません(Windows版は32bitバイナリしか存在しません)。

あとでもう少し調べて、追加で回答しますが、取り急ぎ情報まで。

Windows7 64bit で、バックトレースを取れました。これで原因を特定できないでしょうか?

 	i18npoollo.dll!__security_check_cookie(unsigned int cookie) Line 55	C
 	i18npoollo.dll!com::sun::star::i18n::BreakIterator_Unicode::loadICUBreakIterator(struct com::sun::star::lang::Locale const &,short,short,char const *,class rtl::OUString const &)	C++
 	i18npoollo.dll!com::sun::star::i18n::BreakIterator_Unicode::nextCharacters(class rtl::OUString const &,long,struct com::sun::star::lang::Locale const &,short,long,long &)	C++
 	i18npoollo.dll!com::sun::star::i18n::BreakIteratorImpl::nextCharacters(class rtl::OUString const &,long,struct com::sun::star::lang::Locale const &,short,long,long &)	C++
 	swlo.dll!SwBreakIt::getGraphemeCount(class rtl::OUString const &,long,long)	C++
 	swlo.dll!SwTxtNode::CountWords(struct SwDocStat &,long,long)	C++
 	swlo.dll!SwDoc::CountWords(class SwPaM const &,struct SwDocStat &)	C++
 	swlo.dll!SwEditShell::CountWords(struct SwDocStat &)	C++
 	swlo.dll!SwView::StateStatusLine(class SfxItemSet &)	C++
 	swlo.dll!SfxStubSwViewStateStatusLine(class SfxShell *,class SfxItemSet &)	C++
 	sfxlo.dll!SfxDispatcher::_FillState(class SfxSlotServer const &,class SfxItemSet &,class SfxSlot const *)	C++
 	sfxlo.dll!SfxBindings::Update_Impl(class SfxStateCache *)	C++
 	sfxlo.dll!SfxBindings::NextJob_Impl(class Timer *)	C++
 	sfxlo.dll!SfxBindings::LinkStubNextJob_Impl(void *,void *)	C++
 	tllo.dll!Link::Call(void *)	C++
 	vcllo.dll!Timer::Timeout(void)	C++
 	vcllo.dll!EmitTimerCallback(void)	C++
 	vcllo.dll!SalComWndProc(struct HWND__ *,unsigned int,unsigned int,long,int &)	C++
 	vcllo.dll!SalComWndProcW(struct HWND__ *,unsigned int,unsigned int,long)	C++
 	user32.dll!_InternalCallWinProc@20()	Unknown
 	user32.dll!_UserCallWinProcCheckWow@32()	Unknown
 	user32.dll!_DispatchMessageWorker@8()	Unknown
 	user32.dll!_DispatchMessageW@4()	Unknown
 	vcllo.dll!ImplSalAcquireYieldMutex(unsigned long)	C++
 	vcllo.dll!ImplSalYield(bool,bool)	C++
 	vcllo.dll!WinSalInstance::Yield(bool,bool)	C++
 	vcllo.dll!Application::Execute(void)	C++
 	sofficeapp.dll!desktop::Desktop::Main(void)	C++
 	vcllo.dll!ImplSVMain(void)	C++
 	vcllo.dll!SVMain(void)	C++
 	sofficeapp.dll!_soffice_main()	C++
 	soffice.bin!_WinMain@16()	C
>	soffice.bin!__tmainCRTStartup() Line 618	C
 	kernel32.dll!@BaseThreadInitThunk@12()	Unknown
 	ntdll.dll!___RtlUserThreadStart@8()	Unknown
 	ntdll.dll!__RtlUserThreadStart@8()	Unknown

これは、固まった状態のスタックトレースです。役に立ちますでしょうか?

sal3.dll!_rtl_uString_release() C++
swlo.dll!SwBreakIt::getGraphemeCount(class rtl::OUString const &,long,long) C++
上記で始まるパターンもありました。getGraphemeCountが気になります。

http://opengrok.libreoffice.org/xref/core/sw/source/core/bastyp/breakit.cxx#177 無限ループの状態なのでしょうか?

本来の狙いとして、英語などで単語毎にアンドゥされるようにするための処理ですね。Linuxで試して見ましたが、こちらは不具合は起きないようです。なぜWinのみ? という疑問と、どう修正すべきかが、まだ見えません。どなたかアドバイス有りますでしょうか?

MLにパッチを投げましたので、どなたかご確認お願いします。
無限ループに陥っていたので、カーソル位置が変わっていなかったら抜けるようにしました。
環境によっては無駄な処理ですが、i18nの実装に依存せず、文脈的にも正しいと思います。

パッチ投稿ありがとうございます。

バグを追いやすくするために起票しました。 https://www.libreoffice.org/bugzilla/show_bug.cgi?id=87500