- 締切済み
VC++6.0 異常終了の調査方法
環境:VC++6.0 MFC使用 ダイアログベースアプリケーション 使用PC:同一ソースをWin2000またはWinXPでリビルドして使用 です。 メインダイアログにメニューを実装し、あるメニュー項目を 選ぶと別のダイアログをDoModalで表示し、別のダイアログで「OK」を 押すとメインダイアログに処理が戻るようなソフトを作成しています。 別のダイアログは数種類あり、EDITボックスやコンボボックスなどを 配置しています。 ダイアログ切り替えの運用試験として、 あるダイアログを表示→閉じるを繰り返す試験を行っていると、 数時間でこのソフトが異常終了してしまいます。 (タイマ処理内で、現在日時分秒を出力しています) 「あるダイアログを表示」は、ソフトのタイマ処理で5秒おきにDoModalしています。 「閉じる」は、「OK」ボタンを押す別アプリを作成しています。 別アプリでは、「IsWindowVisible()の戻り値がTRUE」かつ 「FindWindowExを使用してlpszWindow(ウインドウ名)が「OK」」 のコントロールを探し出し、見つかればSendMessageなどで 「OK」ボタンを押す処理を代行させています。 何が原因で異常終了してしまうかを調べたいのですが、 具体的な良い方法はありませんでしょうか。 わかっている現象として、 1.タスクマネージャのプロセスタブで このソフトのメモリ使用量を見ていると、 時間とともに少しずつ増加しています。 よろしくお願いいたします。
- みんなの回答 (2)
- 専門家の回答
補足
MrBan様 ご回答いただきありがとうございます。 >悪いです。_CrtSetDbgFlagは起動直後など最初にやるものですので、 >その位置でやっても恐らく結果が出てません。 >最初に設定をしておいて、_CrtDumpMemoryLeaks等で結果を得ます。 初めて使用したこともあり、勉強不足でした。 ご指摘ありがとうございます。 MSDNで調べてみましたが、コードの記述位置について教えていただけませんでしょうか。 1. #define _CRTDBG_MAP_ALLOC #include <stdlib.h> #include <crtdbg.h> は、 BOOL CxxxApp::InitInstance() のあるファイルの #include の行の後に記述 2. _CrtDumpMemoryLeaks は、 BOOL CVisionSoftApp::InitInstance() の一番最後に記述 3. _CrtSetDbgFlag は BOOL CVisionSoftApp::InitInstance() の一番最初に記述 でよいのでしょうか。 質問が増えてしまいますがすみません。 新たに新規プロジェクト(ダイアログベース)を作成し、上記の3つのコードのみを追加し 実行したところ、 「プロジェクト」メニュー→「設定」→「一般」タブ「Microsoft Foudation Class」で 「共有DLLでMFCを使用」にした場合、実行してすぐに「OK」を押してもリークが発生し、 「MFCのスタティックライブラリを使用」に設定した場合、実行してすぐに「OK」を押してもリークは 発生しませんでした。 これは、「共有DLLでMFCを使用」にした場合、DLLに問題がありリークが発生している と考えてよいのでしょうか。 >メモリ消費が増え続ける云々は、最低限リリース版で確認する必要があります。 ># リリース版でもキャッシュのために解放されないものもありえますが。 これは、「タスクマネージャ」の「メモリ使用量」の値に惑わされてはいけないということでしょうか。 メモリ消費が増加しても、延々と増加する場合は問題ですが、 起動後増加していても、ある地点で安定していれば問題ないということでしょうか。 >確証に至る情報はないのですが、何か漏らしてるとしたら、 >DoModalで起動されるダイアログの中身の方じゃないですか? >再現コードがあるといいのですが、徐々に処理を削って公開できる >ものは作れませんか?(この過程で原因が分かることも多いので、 >最小限の再現コードを作るのは王道ですが) はい、メイン画面(起動後初期表示される画面)を表示したままであれば 「メモリ使用量」は増えませんが、DoModalでダイアログを表示すると 「メモリ使用量」が増えていくことがあります。 おそらく、DoModalで起動されるダイアログの方に問題があると思っています。 機能を削ったコードを用意しますので申し訳ありませんが、 少し時間をいただけませんでしょうか。 頼ってばかりで申し訳ありませんが、もう少しの間ご指導お願いいたします。