ログファイルオープンエラー
報告どうもありがとうございます。 また、机上チェックもしてくださり、大変助かります。 本件は、当方が3年ほど前に作り込んだバグのようです。 次回リリースまでに修正します。
本件を修正し、リポジトリにコミットしました。 下記に修正版アーカイブを格納しましたので、よろしければテスト願います。
http://ttssh2.osdn.jp/snapshot/snapshot-20160923.zip (with VS2005)
http://ttssh2.osdn.jp/snapshot/snapshot-20160923_vs2015.zip (with VS2015)
yutakaponさん、ご苦労様です。
報告した事象は、修正されていることを確認しました。
ただ、報告時のTeraTermマクロを30分ほど実行すると、TeraTermウィンドウの描画が正しく行われなくなります。 この問題を修正すると、別の問題が顕在化してくるようです。
また、LogStartに追加されたCreateEventですが、LogRotateには不要でしょうか?
None への返信
報告した事象は、修正されていることを確認しました。 ただ、報告時のTeraTermマクロを30分ほど実行すると、TeraTermウィンドウの描画が正しく行われなくなります。 この問題を修正すると、別の問題が顕在化してくるようです。
当方環境では再現しなかったのですが、具体的にどのような現象でしょうか?
また、LogStartに追加されたCreateEventですが、LogRotateには不要でしょうか?
ご指摘ありがとうございます。修正しました。
http://ttssh2.osdn.jp/snapshot/snapshot-20160926.zip (with VS2005)
http://ttssh2.osdn.jp/snapshot/snapshot-20160926_vs2015.zip (with VS2015)
当方環境では再現しなかったのですが、具体的にどのような現象でしょうか?
TeraTermマクロを実行すると、TeraTermログウィンドウの描画とクローズがアニメーションのように表示されますが、30分ほど経つとTeraTermログウィンドウの描画がされなくなり、画面がチカチカする状態になります。 この時にTeraTermウィンドウを動かすと、ウィンドウタイトルバーやウィンドウフレームが描画されなくなります。30分で再現しないようでしたら、3時間ほど待てば再現すると思います。 何度か試したところ、この状態になると、かなりの割合でTeraTermは例外で停止します。
VS2005でr6496のソースコードをビルドして試したところ、CResourceExceptionが発生しているのが確認できましたが、発生要因は特定できませんでした。
報告した問題とは別の問題ですので、別チケットにしたほうがよければ、その旨お知らせください。
Windows 7 Enterprise with Service Pack 1 で、Windows Updateは最新の状態。
問題の署名: 問題イベント名: APPCRASH アプリケーション名: ttermpro.exe アプリケーションのバージョン: 4.92.0.0 アプリケーションのタイムスタンプ: 57e535c5 障害モジュールの名前: StackHash_0a9e 障害モジュールのバージョン: 0.0.0.0 障害モジュールのタイムスタンプ: 00000000 例外コード: c000001d 例外オフセット: 0178ff4d OS バージョン: 6.1.7601.2.1.0.256.4 ロケール ID: 1041 追加情報 1: 0a9e 追加情報 2: 0a9e372d3b4ad19135b953a78882e789 追加情報 3: 0a9e 追加情報 4: 0a9e372d3b4ad19135b953a78882e789
報告どうもありがとうございます。 メモリリークしている可能性がありそうなので、机上調査してみます。
チケットのほうは現状のままでよいです。
以下の環境と手順で再現試験を実施しましたが、再現しませんでした。 何か条件が足らないのかもしれません。 OS: Windows7(32bit) Tera Term: 下記アーカイブ http://ttssh2.osdn.jp/snapshot/snapshot-20160926_debug.zip 手順: 1. Tera Termを起動する(未接続状態)。 2. ■事象に記載されているマクロを実行する。 3. 3時間放置する。
yutakaponさん、ご苦労様です。
いろいろ調べてみたところ、Aeroが有効だと発生しないようです。デスクトップテーマをベーシックテーマに変更し、試してみてもらえますでしょうか。 ベーシックテーマならどれでも再現するはずですが、Windowsクラシックが分かりやすいと思います。
例外は発生したり、しなかったりで、発生条件はまだ掴めていません。
WindowsタスクマネージャのプロセスタブでUSERオブジェクト列とGDIオブジェクト列を追加し観察したところ、TeraTermマクロの実行でUDIオブジェクトとGDIオブジェクトが増加し続けていくのが確認できました。 GDIオブジェクトが10000に達すると(実際は9997〜9999で頭打ちになる)、TeraTermウィンドウの描画が正しく行われなくなります。
VS2005でのCResourceExceptionは、ホスト未接続状態でTeraTermマクロを実行しても発生せず(GDIオブジェクトは9997で頭打ち)、ホスト接続状態でTeraTermマクロを実行すると発生しました(GDIオブジェクトは9998又は9999で頭打ち)。
調査ありがとうございます。だいぶ解析のヒントになってきました。 GDIViewというソフトで調べてみると、Fontオブジェクトがリークしていたので、r6501で修正しました。 http://www.nirsoft.net/utils/gdi_handles.html しかし、それでもGDIViewの「All GDI」が増加していくばかりなので、まだどこかでリソースリークが ありそうです。 引き続き調査します。
どうやら、MFCのダイアログを使うと、メモリリークが発生するようです。
下記サイトに記載してあったWAを試してみましたが、特に効果なさそうです。
https://blogs.msdn.microsoft.com/jpvsblog/2013/08/29/mfc/
http://stackoverflow.com/questions/944033/is-this-a-memory-leak-in-mfc
yutakaponさん、ご苦労様です。
TeraTermが例外で停止する件ですが、ホスト未接続状態では発生せず、ホスト接続状態の時だけと判りました。つまり、VS2005でCResourceExceptionがキャッチされた時だけでした。
メモリリークの件は、ftdlg.cppのOnInitDialogでアイコンイメージをロードしており、このハンドルをPostNcDestroyで解放してやればリークが無くなりました。
::PostMessage(GetSafeHwnd(),WM_SETICON,ICON_SMALL, (LPARAM)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_TTERM), IMAGE_ICON,16,16,fuLoad)); ::PostMessage(GetSafeHwnd(),WM_SETICON,ICON_BIG, (LPARAM)LoadImage(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_TTERM), IMAGE_ICON, 0, 0, fuLoad));
メモリリークは多そうですね。さっと見たところ、TTPMACROのstatdlg.cppでもFontオブジェクトを解放してませんでした。
重ね重ね、調査どうもありがとうございます。
ftdlg.cppのメモリリークに関しては、r6504 で修正しました。
なお、Tera Term Pro 2.3(1998年)でも再現したので、オリジナルからある問題だったようです。
水平展開に関しては別途実施します。
いえいえ、こちらこそ恐縮です。
実際にデバッグしていただいたのは、貴殿で、当方ではありませんので、
本当に感謝しております。
なかなかソースコードまでチェックしてもらえるユーザ様はおりませんので。
今後ともよろしくお願いします。
■事象
次のTeraTermマクロを実行し、しばらくするとログファイルオープンエラーが発生する。
■原因
filesys.cppのLogStartでDefferefWriteLogスレッドを開始すると、通常は、
↓
CloseFileSyncでPostThreadMessage
と処理されるが、まれに
↓
DefferefWriteLogスレッドでキュー作成
と処理順序が逆になる場合がある。
この時、CloseFileSyncはDefferefWriteLogスレッドが終了するまでWaitForSingleObjectで待ち、 DefferefWriteLogスレッドはGetMessageでメッセージを待つため、デッドロックに陥る。