• ベストアンサー

メモリリークのデバッグ

aki_mの回答

  • aki_m
  • ベストアンサー率50% (1/2)
回答No.4

a-kuma様が既に答えられているので蛇足かも知れませんが、 参考までに私の行っているリーク検出の手順を書かせて頂きます。 1:ビルドの種類を「デバッグビルド」に設定。 (コンパイル後のデータが、ワークスペース〔拡張子dsw〕と同フォルダ内の 『Debug』フォルダ内に作成される状態です、デフォルトでこの状態になって いると思います) 2:メモリリークを検出したいプログラムの先頭に、デバッグに必要な ヘッダーファイル「crtdbg.h」をインクルードします。 (複数のソースファイルに渡って調べたい場合は、調べたい全てのソースに インクルードします) 3:プログラムが終了する直前の場所で、メモリリーク検出用の関数 _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); を呼びます。 4:プログラムをリビルド→実行します。 5:異常終了させずにプログラムを終了させます。 (計算回数を調整する等で対処してみて下さい) 6:アウトプットの「デバッグ」欄に、リークしているメモリサイズが 出力されます。 (例: Detected memory leaks! Dumping objects -> {112} normal block at 0x007D0E10, 4 bytes long. Data: < > CD CD CD CD 3行目は解放されていないメモリのアドレスとそのサイズ、 4行目はその中身です。 *複数のリークがある場合は、その数だけ出力されます。 これはアドレス0x007D0E10から4バイトのメモリが解放されていないよ、 というメッセージです。 中身の「CD」は、リークを検出するためにVCが初期化している値ですので エラーではありません。 ) 更にリーク位置を特定することも出来ますが、余り手順が多すぎても分かり難い と思いますので、とりあえずこの辺りで試してみてはいかがでしょうか。 *位置特定が必要であれば、下手な説明でありますがお答えしたいと思います。

k_shin
質問者

お礼

忙しかった為、返信できませんでした。 大変丁寧な説明ありがとうございます。 手順はだいたいわかったのですが6の表示の意味が わからなくて困っていました。大変参考になります。 ありがとうございました。

関連するQ&A

  • メモリリークについて

    VC6.0でデバッグ実行すると Detected memory leaks! Dumping objects -> ソースファイル名(932) : {136739} normal block at 0x00FD4AC0, 0 bytes long. Data: <> メッセージがあり メモリがリークしているようです メッセージやソースから察するに 0バイトの領域を確保し それを解放したときに起こっているようです 領域をmallocして 解放ではNULLでなければ解放 という処理はしてはいけないことなのでしょうか 0バイトの領域を確保した場合 又は0バイトの領域を確保しないように 処理しないといけないのでしょうか? 知識のある方よろしくお願い致します

  • メモリリークを調べています。

    メモリリークを調べています。 MFC(VC2005)です。 MFC拡張DLLで作成したアプリケーションにメモリリークがないかを調査し始めたのですが、VisualStudioでデバッグでは 「Detected memory leaks!」は出ません。 パフォーマンスモニタで、このDLLを静的リンクしたEXEのPrivateByteを約90時間監視すると、2回だけ大きな上昇(といっても数10KB)が見られました。 上昇するまでは横ばいですが、この横ばいの時間が2回とも異なります。 これはメモリリークと言えるのでしょうか? ちなみに、このDLLの調査対象機能は画像描画機能で、定期的にメモリ確保→メモリ解放を繰り返します。 メモリリークでないとしたら、どう結論付けたら良いでしょうか? 解決方法はありますか? 私としてはフラグメンテーションを疑っています。

  • デバッグ実行の繰り返しでメモリ不足

    windowsXP、VB6を使ってアプリケーションを作成しているのですが、 このアプリケーションで「デバッグ実行→終了」を繰り返すと、 2回目以降の実行途中でメモリ不足エラーが表示されます。 VB6を終了し、再度起動するとまたデバッグ実行が可能になり、 上記同様に「デバッグ実行→終了」の繰り返しでまたメモリ不足になります。 http://chaichan.web.infoseek.co.jp/vbtips/VBMemo2006111601.htm を参考にすると、 動的配列や多次元配列、パブリック変数の多用が原因かと思ったのですが、 VB6起動直後は実行できるのでよくわかりません。 アドバイスをいただけないでしょうか。 よろしくお願いいたします。

  • CGIプログラムのデバッグ

    VisualC++5.0で、CGIのモジュールを作成してます。 これからで出来上がったプログラムのテストを行おうとして気づいた点があるのですが... この処理の中では、送信されてきたパラメータを解析しようと、 環境変数の"CONTENT_LENGTH"や"QUERY_STRING"を取得する処理をやっているのですが、 実際にVC++5.0のデバッガを動かしてみると、上の環境変数が設定されてない(当たり前ですが...) ために、null値しかこなくデバッグできずにいます。 VC++5.0のデバッグ機能で上の環境変数を設定しておきたいのですが、 何か良い方法はご存知ないでしょうか?

  • Just-In-Time デバッグ

    パソコンのメモリーを増やすため必要のないプログラムを削除したところ、パソコンの立ち上がりで例外ランタイムエラーがスクリプトで発生しました。この例外をデバックできるデバッガは登録されていません。 JITデバッグを実行できません。 とメッセージが出てOKをクリックしてもなかなかきえません。 最近では30~40回クリックして消しています この対処方法は無いのでしょうか?

  • VBがデバッグ時落ちてしまう

    VC6.0でDLLを作成し、VB6.0で呼び出すプログラムを作成しています。 DLLの内容はWindowハンドルを引数にしてそのハンドルを持つWindow上にListboxを作成するというようなものです。(もともとC言語用のDLLだったものをVBで使いまわしています) このプログラムをデバッグ実行し、デバッガ上で停止[実行->終了]とすると、VB6.exeがアプリケーションエラーで落ちてしまいます。(DLLの関数を呼ばない限り大丈夫です) デバッグ実行でも普通に終了(アプリケーションでの終了)であれば正常に終了してくれます。 このままですと、実行時エラーで止まる度にVB6.exeが落ちてしまい非常に不便です。 このような現象で困った方いませんか? 解決策がありましたら教えてください。

  • 緊急です。デバッグについて…。素人です。

    自社HPをみようとすると、 今まで見れていたのですが何かを触ってしまったのか ある日みれなくなっていました。 表示されるとおりに進んでいっても解決できません。 表示されるコメントを下記に書いておきました。 不足がありましたら、ご指摘ください。 急いでいます!アドバイスお願いします。 HPをブックマークより開くと 「ランタイムエラーが発生しました。デバッグしますか? 行:11 エラー:オブジェクトがありません」 ↓ “はい”を選択。 ↓ 「デバッガを選択してください。」 このとき“可能なデバッガ”に “新しいインスタンスMicrosoht Script Editor”が表示されているのでそれが選択されています。 「選択したデバッガを使ってデバッグしますか?」 となっているので“はい”を選択。 ↓ “リモートプロシージャコールにステップイン”という タイトルの画面が出てきて “デバッグするプログラムの種類”に“Script”が選択されていて “以下のプログラムをデバッグします”に“スクリプト”が 選択されています。 ↓ “OK”をクリックすると 「Microsoft JScript実行時エラー:オブジェクトがありません」 となってしまいます。 その後“接続”をやっても上記のメッセージが出ます。 どうすればいいのでしょうか? 素人なのですみませんが細かく教えてください。

  • デバッグについて

    C++でDirectDrawプログラムをデバッグで実行するとパソコンがフリーズしてしまうのですが、これは毎回デバッグ実行するたびに起こるのでデバッグがまったく活用できず困っています。誰かわかる方は教えてください。下記にスペックも記述しておきます。 SOTEC PC STATION G4160xp CPU: Pentium4 1.6GHz メモリ: 256MB SDRAM ビデオカード:Geforce2 MX-400 64MB

  • Doja3.5 + Eclipse3.1.1でのデバッグがまともに動きません。

    Doja3.5 + Eclipse3.1.1 でのデバッグ方法をご存知の方いないでしょうか? 現状は 1.[実行]-[構成及び実行]⇒[デバッグモード起動]にチェック⇒[実行] 2.[デバッグ]-[構成及びデバッグ]⇒[リモートJavaアプリケーション]⇒該当するプロジェクトを選択  ⇒パラメータの類は変えずに[デバッグ] と進めるとEclipseを起動した初回のデバッグのみデバッグが進み、 設定したブレークポイント等まで進んでくれるのですが 2回目からコンソールには Connecting to 127.0.0.1 on port 2800 Waiting for debugger on port 8000 Connection received. と表示される所まで進むのですが端末エミュレータウィンドウが表示されなかったり 端末エミュレータウィンドウまで表示され doja_g.exeアプリケーションエラー 0x00412301の命令が0x00000004のメモリを参照しました。 メモリがreadになることはできませんでした。 のエラーメッセージが表示されデバッグできません。 Doja3.5 + Eclipse3.1.1の組み合わせではまともにデバッグはできないのでしょうか? http://eclipsewiki.net/eclipse/?FrontPage や  http://oshiete1.goo.ne.jp/kotaeru.php3?q=1438386 等も参考にさせて頂いたのですがデバッグがまともに進みません。 原因に心当たりがある方、どうかご指導頂けないでしょうか? よろしくお願いします。 できるならFOMA900以降でアプリを作成したいのでDojaのバージョンは3.5としています。 Eclipseの3.0以降はDojaが対応していないのでしょうか?

    • ベストアンサー
    • Java
  • Visual Studio 2005のJust-in-timeデバッグを完全に停止したい

    こんにちは。Visual Studio 2005をインストールしたところ、以前まで表示されていた「問題が発生したため、○○.exeを終了します。」というようなダイアログが出てこなくなり、代わりにデバッグをするかどうか聞かれるようになりました。このようなJust-in-timeデバッガのダイアログではなく、「問題が発生したため・・」というダイアログを出したいのですが、オプションからJust-in-timeデバッガを無効にしても、プログラムがクラッシュしたときにJust-in-timeデバッガが無効になっているとエラーが出てしまいます。Just-in-timeデバッガを完全に停止する方法はないでしょうか?