• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:タスクマネージャ上のハンドル数の増加)

タスクマネージャ上のハンドル数の増加

このQ&Aのポイント
  • 現在Win XP + C++ で無停止システム(ウィンドウズのサービス)を作成・稼動テスト中です。別プログラムからの指示により、サービス内でイメージ作成を行い、それをまた別のプログラム画面に表示させると言う処理を行うプログラムで、自動操作ツールにてテストを行っています。
  • 3日ほど無停止で動かしてますが、タスクマネージャで見ると、このサービス(のプロセス)のハンドルが日に数個(1~3個程度)増え続けています。メモリ使用量は見るタイミングによって増減はするものの、一定レベルの値で安定しています(様に見えるだけ?)一応、メモリリークのバグは無いつもりなのですが・・・
  • 1)メモリ量は増加しないのに、ハンドルが増えていく状況とは、内部的にどの様な状態が考えられるでしょうか?(やはりハンドルリーク?)2)これをこのまま放置すると、やはりハングしたりするのでしょうか?(GDIオブジェクトは10,000でハングするらしいですが)3)この原因を究明する方法は無いでしょうか?  _CrtDumpMemoryLeaks なんかは使ってみたのですが、プログラムの終了時にはリークは表示されませんでした。

質問者が選んだベストアンサー

  • ベストアンサー
  • ninoue
  • ベストアンサー率52% (1288/2437)
回答No.2

process explorerではprocess等の秒単位の起動時間表示も出来るようです。 view-->select columns-->Process Performance-->Start Time-->on 22:15:45 2012-08-26 の形で表示されます。 その他、sysinternals.comのサイトを見ていたらProcess Monitorもありました。 process等の詳細ログが取れるようですが、大量にログが出る事と実行オーバーヘッドも掛かるとおもわれます。適切にフィルタリングを掛ければ或いは役に立つかも知れません。 ハンドルやプロセスの番号等は例えば16bit/32bit等の番号をサイクリックに空きを見つけて適当に割当てられていると思われますので、番号が小さい方が古いと言うわけでは無いのではと思われます。 >(ハンドルの起動番号をサイクリックに割当て、常駐データエリアと対応付け、.... 少し混乱するような書き方をしましたが、常駐エリアに起動中のハンドル(プロセス?)に十分対応するだけの個数のログブロック数(例えばアプリハンドル数の2倍)を割り当て、その空きブロックをハンドル起動時に見つけて、そのブロック番号を割当てると言った意味です。 それ以外にシステムから割当てられたハンドル番号、ハンドル割り当て時刻等も先ず記録したら良いと思われます。 その後ハンドル実行中の適切なステップで必要な情報をログブロック内に記録しておけば、(バイナリ形式のままで記録する等により)オーバーヘッドが少なくて最終処理状況が分り解析に役立つのではと考えました。 最後の1(,2,4)ステップ分をそのログブロック内に記録する等 これらはアプリケーションのメイン処理、或いは共通サブ等にロジック追加する事で考えて下さい。 ログブロック内のデータは標準のメモリダンプで分り難ければ、簡単な表示プログラムが必要になります。

prd5678
質問者

お礼

ninoue さん、回答有難う御座います。 また、御礼が遅くなってすみません。 今朝まで張り付きで見てましたが、いまだ原因輪からずの状況ですが、色々情報を頂き、大変感謝しております。 タスクマネージャだけでは解らないことを知る術が解りました。 出来ればプロセスの開始時間の他に、ハンドルが取得された時間がわかると良かったのですが・・・ いまだに「気付いたら増えている」って状況なので、苦労しそうですが、暫く経過を見るしかなさそうです。

その他の回答 (1)

  • ninoue
  • ベストアンサー率52% (1288/2437)
回答No.1

プロセスのハンドルが増えていっているとの事ですが、その詳細を確認する必要があります。 task managerに相当する Sysinternals の Process Explorerと言うプログラムをダウンロードして確認してみてください。 増加したハンドルの起動時間等の確認等をされたら、少し情報が増えて解決に繋がるのではと思われます。 http://technet.microsoft.com/ja-jp/sysinternals http://technet.microsoft.com/ja-jp/windows/ee424284 http://technet.microsoft.com/ja-jp/windows/ee787049 余り詳しくはありませんので、上記の説明を見たりして調べて行ってみて下さい。 Windowのsnapshotを取るのにEeasyCapture等も便利です。 このプログラムでどの何時起動されたハンドルが残って増えていっているのか等を前日のものと比較して調べる等してみて下さい。 http://www.forest.impress.co.jp/lib/pic/piccam/picedit/easycapture.html その他には常駐データエリアに増えていっている各ハンドル(プログラム)の状態を残しておいて確認する等も試してください。 (ハンドルの起動番号をサイクリックに割当て、常駐データエリアと対応付け、起動番号、起動時刻、待ち要因番号やソースライン番号、コード番号等必要な情報を残すようにして、メモリダンププログラムで確認する等)

prd5678
質問者

お礼

ninoue 様、回答ありがとうございます。 Process Explorer は動かしてました。 確認した所、回答頂いてから今朝までの間に、種別が"Event"のハンドルが一つ増えてました。 ただ、ハンドル総数が現在300オーバーで、細かいメモなどは取っていなかったのですが・・・ 因みに、"ハンドル"の値が大きいほど、最新に取得されたハンドルなのでしょうか? であるなら、"名前"には何も表示されていませんでした。 せめて発生時刻が解れば、ある程度のログ出力をしているので少しは調査が楽になるかと思うのですが・・・ >(ハンドルの起動番号をサイクリックに割当て、常駐データエリアと対応付け、起動番号、起動時刻、待ち要因番号やソースライン番号、コード番号等必要な情報を残すようにして、メモリダンププログラムで確認する等) ↑こちらにある「残す情報」はProcess Explorer ではなく、別のツール(ApplicationVerifier、Windbg)の取得すると言うお話でしょうか? Process Explorer では、発生時刻は解らないですよね?

関連するQ&A