秀丸終了時に不正終了するようになっていNo.09011
天翔記.jp さん 16/08/25 19:11
 
秀丸終了時に不正終了するようになっているようです。

・秀丸エディタ 8.5.4.β15
・秀丸エディタ 8.6.4
・秀丸エディタ 8.6.6 β1
で確認したところ、完全に同一のdllをロードしたところ

8.6.6β1 だけが、
秀丸終了時に確実に不正終了するプログラムがあります。

(秀丸終了時に何か.dllに対する処理が増えているかな…と)


これについては、100%の再現性のある手順がありますので、
今夜か明日にでも、
・対象の.dllのバイナリ
・対象の.dllの全ソース(比較的少量のソースです)
付きで詳細をアップさせていただきます。

まずは、ご報告まで。


[ ]
RE:09011 秀丸終了時に不正終了するようにNo.09012
天翔記.jp さん 16/08/26 03:08
 
プログラム、ファイル、情報、等アップしました。

http://秀丸マクロ.net/?page=nobu_tool_hm_tantou_kaisetsu_02

肝心のエラーログがなくて申し訳ないですが、
明日再現すれば(するハズ)追加情報として掲載できると思います。


Win10では不正エラーにならないどころか、
警告や情報としてすらエラーログに残らないというのは意外でした。

[ ]
RE:09012 秀丸終了時に不正終了するようにNo.09014
天翔記.jp さん 16/08/26 11:05
 
追記状態です。昨日のエラーログも全部同じ内容でした。

Win7 64bitでまっさらな秀丸 x86 8.6.6 β1で
上記エラー再現。
再現率は100%

エラーログ

障害が発生しているアプリケーション名: Hidemaru.exe、バージョン: 8.6.6.1、タ
イム スタンプ: 0x57be3f77
障害が発生しているモジュール名: dlltest.dll_unloaded、バージョン: 0.0.0.0、
タイム スタンプ: 0x57bf2024
例外コード: 0xc0000005
障害オフセット: 0x68691030
障害が発生しているプロセス ID: 0x1e48
障害が発生しているアプリケーションの開始時刻: 0x01d1ff3d06d78059
障害が発生しているアプリケーション パス: C:\usr\hidemaru\Hidemaru.exe
障害が発生しているモジュール パス: dlltest.dll
レポート ID: 4affbe79-6b30-11e6-bb7f-a0481c944dab



[ ]
RE:09014 秀丸終了時に不正終了するようにNo.09016
秀丸担当 さん 16/08/26 11:26
 

試してみたところ、xpでは異常終了メッセージが出て、Win7ではイベントログだ
けに残って、Win8.1ではメッセージもイベントログも何も出ませんでした。

落ちている場所はWinMainの最後にやるOleUninitialize()の中のようです。
V8.64以前は、明示的にfreedllしない限り、FreeLibrary()はしないようになっ
ていました。
V8.64以前でも、freedllしていれば、同じように落ちるようです。
V8.66β1は、終了時でも正しく(?)、FreeLibrary()するようにしました。

以下のようなEXEのソースでも落ちるようです。

int WINAPI WinMain( HINSTANCE, HINSTANCE, LPSTR, int ) {
  OleInitialize(0);
  HMODULE hmod = LoadLibrary( TEXT("c:\\test\\dlltest.dll") );
  int (_cdecl* HookWin32apiFuncs)();
  *(FARPROC*)&HookWin32apiFuncs = GetProcAddress( hmod
     , "HookWin32apiFuncs" );
  HookWin32apiFuncs();
  MessageBox(0,HookWin32apiFuncs?TEXT("1"):TEXT("0"),0,MB_TOPMOST);
  FreeLibrary( hmod );
  OleUninitialize();
  return 0;
}

APIフックするというかなり特殊なDLLの内容のようなので、それに関することが
起因していると思います。
DllMainのDLL_PROCESS_DETACHでAPIフックを戻すとかすればいいのかはわかりま
せんが、いずれにしても秀丸エディタ側で対処できることではなさそうです。

他にもFreeLibrary()されたら困るケースがあるかもしれないので、秀丸エディ
タとしては、setdlldetachfunc文を呼ばない限りは、従来通りFreeLibrary()せ
ず放置したほうがよさそうです。

[ ]
RE:09016 秀丸終了時に不正終了するようにNo.09017
天翔記.jp さん 16/08/26 11:54
 
>他にもFreeLibrary()されたら困るケースがあるかもしれないので、秀丸エディ
>タとしては、setdlldetachfunc文を呼ばない限りは、従来通りFreeLibrary()せ
>ず放置したほうがよさそうです。
判断として若干難しいところもありますが、
おそらく setdlldetachfunc 文を「呼んだとしても」、FreeLibrary()せず、放置し
ておいて良いのではないかと思います。


・setdlldetachfuncは呼んでいる、
・マクロ内に明示的なfreedllは存在しない、
ということは、事実上は、
@マクロで処理可能な範疇の最後のタイミングで setdlldetachfunc の関数は呼んで
欲しい(マクロ内に書いてあるから)
Aしかし、freedllはしない(マクロに書いてないから)
BFreeLibraryはアプリケーションが終わった際に、OSがデタッチするのに任せている

@とBでは、「マクロで処理できる範疇の最終付近」と「アプリ終了時のOS処理」と
いった若干時間差が発生はするものの、
(よって厳密にはdetachという名前に沿ってるのか?という問題は発生するものの)
おそらくこちらの方が便利なのではないかと思います。

[ ]
RE:09017 秀丸終了時に不正終了するようにNo.09020
秀丸担当 さん 16/08/26 13:23
 

終了時のFreeLibrary()は正確には違いました。
loaddll "xxx"; とした共通DLLの場合、秀丸エディタが終了時にFreeLibrary()
していました。この場合はV8.64以前でも同様に落ちると思います。
#n = loaddll( "xxx" ); とした個別DLLの場合、FreeLibrary()せず放置してい
ました。
この挙動は統一されるべきでしたが、下手にいじると問題になりかねないのでこ
のままにしておこうと思います。

setdlldetachfunc文で設定しているときは、統一しようと思います。
FreeLibrary()せず放置しても最終的にOSで解放されるようなので、事実上ほと
んど違いが無いので、放置するほうで統一しようと思います。

今後、もしタイミング変更の必要があれば、setdlldetachfunc "xxx", 1;のよう
な感じでパラメータ指定も考えられると思います。

[ ]
RE:09020 秀丸終了時に不正終了するようにNo.09030
天翔記.jp さん 16/08/26 15:34
 
β2で、終了時に不正終了が出る問題については、
私の手元分については無くなったようです。
対応ありがとうございます。

残り項目は休日にでもおいおい見ていきたいと思います。

[ ]