- PR -

Windowsフォームでプログラム終了について

投稿者投稿内容
partire
会議室デビュー日: 2006/08/10
投稿数: 9
投稿日時: 2007-07-31 23:55
お世話になります.

 現在Windowsフォームのプログラムを作成しておりますが,いつのまにかプログラムが
終了してしまうという現象が発生しております.
FormのClosingとFormを呼び出している部分にログに書き込むコードを記述していますが
ここを通っていないようで何もログには書かれていません.
このような場合にどこで問題が発生しているのか調べる方法はありませんでしょうか?
この現象は開発している環境では発生せずお客様の環境のみで発生しているため,調査方法が分からず苦労しております.
以上,よろしくお願いします.

開発環境:VS 2005
言語:C#

// Formを呼び出している部分
try
  {
  Application.Run(new Form1());
  }
catch (Exception ex)
  {
  // ログ書き込み
  }
まどか
ぬし
会議室デビュー日: 2005/09/06
投稿数: 372
お住まい・勤務地: ますのすし管区
投稿日時: 2007-08-01 02:08
引用:

いつのまにかプログラムが終了してしまうという現象が発生しております。


イベントドリブンで無操作な状態で勝手に終了することはありません。
#他のプログラム(最悪ウィルス)が終了させているということはあるかもしれませんが。
まずは単に非表示になっているなんてオチの無いよう、タスクマネージャでプロセスがあるかどうかを確認しましょう。

引用:

FormのClosingとFormを呼び出している部分にログに書き込むコードを記述していますが
ここを通っていないようで何もログには書かれていません.
catch (Exception ex)
  {
  // ログ書き込み
  }


通ってないとどうやって確認しましたか?
この例外を握りつぶしている状態でログの書き込み自体が失敗したらどうなるでしょうか?
それでも例外ダイアログが表示されないのですから、たぶん、ログ書き込み処理も同じようなTry句で囲まれているのではないですか?
とにかく少なくとも一番外側のTry句をはずして動かさなければ先へは進まないでしょう。
k_kazu
常連さん
会議室デビュー日: 2006/02/11
投稿数: 25
投稿日時: 2007-08-01 08:28
アプリケーションで発生した例外を確実にログに取るために、
AppDomain.CurrentDomain.UnhandledException
Application.ThreadException
のイベントハンドラを追加してその中でログを取ったら確実にログが取れると思います。
Windows アプリケーションの場合
System.Windows.Forms.Application.ThreadException
イベントハンドラも使えます。

これで例外発生の原因が調査できると思います。
partire
会議室デビュー日: 2006/08/10
投稿数: 9
投稿日時: 2007-08-01 11:05
回答ありがとうございました.


まどか さん

引用:
まずは単に非表示になっているなんてオチの無いよう、タスクマネージャでプロセスがあるかどうかを確認しましょう。


タスクマネージャ上にも無かったようです

引用:
通ってないとどうやって確認しましたか?
この例外を握りつぶしている状態でログの書き込み自体が失敗したらどうなるでしょうか?
それでも例外ダイアログが表示されないのですから、たぶん、ログ書き込み処理も同じようなTry句で囲まれているのではないですか?
とにかく少なくとも一番外側のTry句をはずして動かさなければ先へは進まないでしょう。


ログの書き込みもTry句で囲んでおりました.
そこで再スローしているので外側のTry句で捕捉できると思っていました.
一番外側のTry句について再度検討してみます.


k_kazu さん

引用:
アプリケーションで発生した例外を確実にログに取るために、
AppDomain.CurrentDomain.UnhandledException
Application.ThreadException
のイベントハンドラを追加してその中でログを取ったら確実にログが取れると思います。


このイベントハンドラを追加して確認したいと思います.
進展がありましたらまた投稿致します.
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2007-08-01 12:23
application.exit で終了しているとか?
partire
会議室デビュー日: 2006/08/10
投稿数: 9
投稿日時: 2007-08-01 14:19
Jitta さん

コメントありがとうございます.

引用:
application.exit で終了しているとか?


サードパーティ製のコンポーネントを使用しており,application.exitが呼ばれているような挙動がありますが,その場合には以下のコードの終了ログ書き込みはされるためこれが原因ではないような気がしています.
この現象が発生した場合には,catch内のログも終了ログも書き込みされない状態になっています.

// Formを呼び出している部分
try
  {
  Application.Run(new Form1());
  }
catch (Exception ex)
  {
  // ログ書き込み
  }

// 終了ログ書き込み
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2007-08-01 14:39
引用:

partireさんの書き込み (2007-08-01 14:19) より:

サードパーティ製のコンポーネントを使用しており,application.exitが呼ばれているような挙動がありますが,


それはひどいコンポーネントですね。

引用:

その場合には以下のコードの終了ログ書き込みはされるためこれが原因ではないような気がしています.
この現象が発生した場合には,catch内のログも終了ログも書き込みされない状態になっています.


それを言ってしまえば System.Environment.Exit メソッドや、System.Diagnostics.Process.GetCurrentProcess() から Kill メソッドなどコード側でも幾ばくか可能性はあります。 個人的には何かしろの原因で Exception すら発生せず有無を言わさずプロセスが死んでいることを疑いますが、いずれにせよまだ調査が足りないでしょう。 ロギングを仕込むなどして調査を進めるのが早道かと思います。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
partire
会議室デビュー日: 2006/08/10
投稿数: 9
投稿日時: 2007-08-01 17:02
じゃんぬねっと さん

コメントありがとうございました.

引用:
System.Diagnostics.Process.GetCurrentProcess() から Kill メソッドなどコード側でも幾ばくか可能性はあります。


このメソッドで終了させるツールを作成して確認してみましたが,今回の問題と全く同じ現象となりました.

引用:
個人的には何かしろの原因で Exception すら発生せず有無を言わさずプロセスが死んでいることを疑いますが、いずれにせよまだ調査が足りないでしょう。 ロギングを仕込むなどして調査を進めるのが早道かと思います。


私もExceptionすら発生せず有無を言わさずプロセスが死んでいることに疑いを持っていますが,現状では調査不足でそれが証明できないため,もっとロギングを仕込んで調査していきたいと思います.

スキルアップ/キャリアアップ(JOB@IT)