Win8/2012Serverでプロセスがデッドロックしないようにするには?

解決


TP  2015-04-30 22:08:00  No: 47252

言語:日立COBOL2002(EXE)/Delphi7(DLL)  ※両方32ビット
OS:Win8/Win2012R2Server  ※64ビットOS

初めまして。どうしても解決出来ないので相談しに来ました。
実は日立COBOL2002からDelphi7で開発したフォーム付きのDLLを呼び出し、入力後に制御がCOBOL側に戻るシステムを開発しています。
Win7/Win2008R2Serverだと問題なくプログラムが正常終了するのですが、Win8/Win2012R2Serverだと、プログラムを終了しても5分ほど返ってきません。
タスクマネージャで「待機チェーンの分析」を見ると、COBOLプログラムのプロセスがデッドロック状態になっています。
簡単な検証用のCOBOLプログラムを書いてみてテストしているのですが、日立が言うには「STOP RUN」でDLLを解放しているから、DLL側で推奨されない処理をしている(http://msdn.microsoft.com/ja-jp/library/cc429094.aspx)のではないか?と言われていますが、全くそういった処理をしていません

そこで質問なのですが、
1:Win7/Win2008R2とWin8/Win2012R2ではメモリ管理が違うようですが、それも含めてプログラミング上、何がどう違うのでしょうか

2:Delphi2007でリコンパイルしても現象は変わりませんが、そもそもDelphiのバージョンに依存する問題なのでしょうか

本当はCOBOLとDelphiのソースを貼りたいところですが、超長文になってしまうので、上記2点について何かご存知であれば教えて下さい。
宜しくお願いします。


igy  2015-05-01 00:16:48  No: 47253

日立COBOL2002 に関しては、まったくわからないのですが、

・フォーム付きのDLL(テスト用として単純なもの。Delphiで開発)
・そのDLLを呼び出すだけのプログラム(これもテスト用として、Delphiで開発)

のようなシンプルなテストプログラムでは、

> OS:Win8/Win2012R2Server  ※64ビットOS

の環境では、正常に動作しますか?


TP  2015-05-01 00:43:05  No: 47254

igyさん、コメントありがとうございます。

DLLを呼び出すDelphiのテストプログラムでは問題なくWin2012上で動きます。
よって、日立COBOL2002が怪しいと思っているのですが、「どこが」「どう」悪いのか、論理的に説明が出来ません(よって日立にも聞けません)。
Win2008R2は64ビットですが現状問題なく動作しており、Win2012(R2含む)だとプロセスがデッドロック状態になっています。
同じような問題を抱えている方がいれば、と思ったのですが。
COBOL2002は一応Win2012対応版なので、プログラムに問題があるとしか言えないのですが。


igy  2015-05-01 00:51:53  No: 47255

>DLLを呼び出すDelphiのテストプログラムでは問題なくWin2012上で動きます。

となると、呼び出すほうを変えて

・フォーム付きのDLL(テスト用として単純なもの。Delphiで開発)
・そのDLLを呼び出すだけのプログラム(テスト用として、日立COBOL2002で開発)

のようなシンプルなテストプログラムでも、デッドロック状態を再現できますか?
再現できれば、そのソースを元に、日立に聞いてみることができるかもしれません・・・


通りすがり  2015-05-01 04:32:34  No: 47256

なにを以てデッドロックといっているのか、ということもありますよね。
COBOL側はそのときイベントオブジェクトの何を待機しているのか、またはWin32 APIのどの関数の呼び出しから帰ってきていないのか、
igyさんの回答のように最小限の再現プログラムでこれらを明らかにする必要がありそうです。


TP  2015-05-06 21:05:43  No: 47257

igyさん、通りすがりさん、コメントありがとうございます。
igyさんが提案された方法でCOBOLとDelphiで簡単なテストプログラムを作成・テストしたところ、デッドロック状態にはなりませんでした。

結論としては、COBOL側でDelphi側DLLへの引数のコマンドの中に「FREE」というコマンドを追加し、Delphi側DLLはそのコマンドを受け取ったらフォームをFreeメソッドで解放する方法で上手くいきました。

Delphi側DLLは10年以上前から複数の担当者がメンテナンスしており、正直汚いコードになってしまっているし、謎のコードが多数あったりするので、根本的な解決ではありませんが、[解決]とさせていただきます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加