• 締切済み

LeakTracer をshared Object のメモリリークチェックで使う方法は?

Linux プログラミング(C++)初心者です。 ・目的 - SharedObjectのプログラミングを行っているのですが、メモリリークのチェックを行いたいです。 - LeakTracerを使おうとしています。 ・疑問 実際にLeakTracerを使ってみたのですが、SharedObject内のnew/deleteのTraceができません。どうしたらよいでしょうか? ・具体的に行っている方法 - 実行ファイル:hoge - hogeからLinkされているSharedObject:hage.so $ LeakCheck ./hoge で、吐き出されるleak.outをLeak-Analyzeに喰わせても何も出力されません(コンパイルオプション-gはつけています)。 なにが間違っているのでしょうか? もしくは、LeakTracerでなくともほかに良いSharedObjectのメモリリークチェック方法があれば教えていただければと思います。 よろしくお願いします。

みんなの回答

  • valvelde
  • ベストアンサー率35% (46/129)
回答No.1

Leak-Analyzeに喰わせるのはleak.outではなく実行ファイル。 この場合は"leak-analyze ./hoge"

tarosan4
質問者

補足

回答ありがとうございます。 上記、質問文の誤記でした。申し訳ありません。 ご指摘のとおり、leak-analyze ./hoge という形で実行しているのですが、実行ファイル側のリークチェックは行えているようなのですが、.so側は全くチェックされていないように見えます。 根本的に何か間違っているのでしょうか・・。

関連するQ&A

  • Visual Studioのメモリリークについて

    質問を見ていただいて有り難うございます。 当方、現在MFCのダイアログベースのプログラムを行なっているのですが、プログラム終了時にメモリリークが発生します。 今のところプログラムの動作自体に影響はないのですが、想定外の動作が起こると困るのでなんとかこのエラーを取り除きたいと考えています。 メモリリークの殆どは _CrtSetBreakAlloc(Num);(指定した順序のメモリ割り当て時にブレークポイントを発生させる) を利用して、メモリリークが起こっている部分のブレークポイントをチェックして消したのですが、どうしても残りのメモリリークが消えません。 残りのメモリリークは_CrtSetBreakAlloc(Num)で指定してもブレークポイントが出てきませんでした。 _CrtSetBreakAlloc(Num)は『ファイル名.cpp』のInitInstanceおよびコンストラクタで呼び出してみましたが、どちらも同じ結果になりました。 また、試しに『ファイル名Dlg』クラスを使用しない(ダイアログを開かないようにコメントアウト)ようにして終了しても同じ結果になりました。 _CrtSetBreakAlloc(Num)を設定する適切な位置や、このようなメモリリークが出る原因、解決方法などについてご存知の方がいらっしゃいましたら、お教えください。 よろしくお願いします。

  • C++ shared_arrayについて

    C++ の boost ライブラリの shared_array の挙動についての質問です。 int main() { boost::shared_arrray<char> hoge(char[1000]); boost::shared_arrray<char> hoge(char[1000]); boost::shared_arrray<char> hoge(char[1000]); sleep(100); return 0; } というプログラムがあった場合、sleep中のメモリの確保状況はどのようになるのでしょうか? shared_ptr で上記のようなコードを書くと、コンパイラがredeclarationのエラーを吐きますがshared_arrayではコンパイルが通り、動作はします。 しかしながらメモリーリークなどのバグの温床にならないか不安です。 上記のコードは安全なコードなのでしょうか? よろしければどうして前者はコンパイルが通り、後者はエラーとなったかについても言及していただけると嬉しいです。 よろしくお願いします。

  • クラスのメンバ変数のnew

    こんにちは。 クラスのメンバ変数の動的割り当てで困っていることがあります。 コンストラクタ内でメンバ変数に動的割り当てをするんですが、そこで例外処理をしなければならないようです。 例 class foo::foo() { try{ hoge = new int[100]; // hogeの代入処理 // } catch { delete[] hoge; hoge = NULL; } } foo::~foo() { delete[] hoge; hoge = NULL; } しかしこれだと不十分なようで、なかしかの対策をしないとメモリリークが起きてしまいそうなんですが どのようにやるんでしょうか?

  • 変数名に変数を使う

    Flash8を使用し、ActionScript2で書いています。 変数名に、他の変数の値を参照したいと考えています。 http://www.flash-jp.com/modules/newbb/viewtopic.php?topic_id=6679&forum=6 を見て、同じようにやってみました。 すると、 animal = "cat"; catlLegs = 4; とした場合、animalの値であるcatを参照し animalLegs = 4; とする、というような単純なものはうまくいきました。 しかし、SharedObjectのdataプロパティで、属性名を変数にしようとすると うまくいきません。 dataNameという変数に、soというSharedObjectのneko属性の値を代入する場合、 so:SharedObject = SharedObject.getLocal("hoge"); animal = "neko"; dataName = _root["so.data."+animal]; としたのですが、 trace(dataName); の値はundefinedになってしまいます。 なお、 trace(_root.so.data.neko); では正しく値が表示されます。 属性名前には他の変数の値を参照できないのでしょうか。 それともSharedObjectではできないのでしょうか。 なんとか実現する方法をおしえていただければと思います。 よろしくお願いいたします。

    • ベストアンサー
    • Flash
  • C++ newについて

    お世話になっております。C++初心者です。 newについて質問です。 newして動的にメモリを確保したものはdeleteにて解放処理を 行わないとメモリリークしてしまうのはわかっているのですが、 newした動的メモリに再度newをするとどうなるのでしょうか? また、複数回deleteもせずにnewし続けたあとに deleteをした場合はすべて解放されるのでしょうか? 少し気になったので質問してしまいました。 よろしくお願いいたします。

  • VB6.0のメモリリークについて

    こんにちは、当方、VB6.0を使用してアプリケーションを作成していますが、メモリリークが発生して困っています。 以下、プログラムのイメージになります。 ファイルを常時監視するメソッド(chkfile)の無限ループ内で、ファイルを取得するメソッド(getfile)を使用して、 ファイルを取得→変換する処理を行っています。 ファイルの取得方法は2パターンあり、1つ目は、任意の間隔(分単位)で機器と通信して取得する方法、 2つ目は共有フォルダを設定して置かれたファイルを取得する方法です。 現象としましては、数時間起動させておくとメモリを1GB程度使用してフリーズしてしまいます。 (エンドユーザーのPCで発生しており、当方の開発環境では確認しておりません。) 上記を踏まえ質問があります。 (1)自分でソースを追いかけ、調査を行ったところ、ファイルを取得するメソッド(getfile)内で、Scripting.FileSystemObjectを使用して おり、以下の様に毎回インスタンスを生成しています。ですが、処理が終わった後、インスタンスの解放処理を行っていません。  スコープが外れた場合、参照は自動的に消滅すると思っていますが認識は合っていますでしょうか?  Dim fso As New Scripting.FileSystemObject (2)「VB6.0 メモリリーク」のキーワードで検索したところ、UBoundについての記述を見つけることができました。  Microsoftサポート 文書番号: 197190(http://support.microsoft.com/kb/197190/ja)  ファイルを取得するメソッド(getfile)内で、UBoundを使用していますが、上記URLとは異なる使用方法です。 上記URLでの使用方法 UBoundのパラメータに配列の戻り値を指定する。  作成したプログラムでの使用方法 指定したフォルダ内のファイルを取得するメソッド(getinfile)でbyrefキーワードに配列を指定して、その配列の要素数をforループの  上限数に使用しています。 使用方法に問題はないと思うのですが、もしかして、UBoundを使用するのがまずいのでしょうか。 当然、予期せぬデータ等に対する不具合も疑いましたが、現象が発生した状態の変換元ファイルを使用して動作させたところ 問題はありませんでしたのでメモリリークを疑っている状態です。

  • Javaでメモリ不足を引き起こす方法

    Javaを使って、システムのメモリ不足を引き起こす方法を考えています。 (動作検証のためで、悪いことを考えているわけではありません^^;) 下記のプログラムでメモリを大量に消費するかなと思ったのですが、 Linux上のvmstatやtopなどで確認してもそれほど変化がありません。 while (true) { Integer[] ii = new Integer[100]; for (int i = 0; i < 100; i++) { ii[i] = new Integer(i); } } Javaの1プロセスが使えるメモリの上限があるので、メモリを食いつぶすプロセスを 大量に実行すれば良いと考えているのですが、メモリを食いつぶす方法が分かりません。 よろしくお願いいたします。

    • ベストアンサー
    • Java
  • 多次元配列のメモリ解放

    多次元配列のメモリ解放についてです。 以下のような方法で多次元配列を確保した場合に、 --- char** ppMain; ppMain = new char*[3]; for (int i = 0; i < 3; i++){ ppMain[i] = new char[20]; } --- メモリ解放する場合、 --- for (int i = 0; i < 3; i++){ delete [] ppMain[i]; ppMain[i] = NULL; } delete [] ppMain; ppMain = NULL; --- で良いでしょうか? おそらく、new/deleteの回数が同じであれば問題ないと思うのですが。 少し混乱してしまって、 delete [] ppMain[i]; によって new char*[3]で確保したところも解放されており delete [] ppMain; が必要なく危険な領域まで解放しようとしているということはないでしょうか? ご専門、お詳しいかたコメント宜しくお願いします。

  • (C++)スマートポインタをメンバ変数で使いたい

    Viual Studio 2013を使ってC++のコードを書いています。 以下のコードで、new-deleteの クラス生成をスマートポインタで置き換えたいのですが、 うまくいきません。具体的には/* not smart */の部分を スマートポインタで置き換えたいが、C2059のエラーが出てきて コンパイルできないのが理解できていません。 どなたかわかる方教えていただければ幸いです。 よろしくお願いします。 // ----コードは以下---- #include <memory> #include <iostream> class Hoge { public: Hoge(){ std::cout << "constructed!" << std::endl; }; ~Hoge(){ std::cout << "destructed!" << std::endl; }; private: }; class Hogehoge { public: Hogehoge(){}; ~Hogehoge(){ delete test; /* not smart */}; private: // error C2059 w/ VS2013 // std::unique_ptr<Hoge> test(new Hoge); Hoge* test = new Hoge; /* not smart */ }; void main() { Hogehoge foo; }

  • Visual C++ 2005のコンパイル方法

    Visual C++ 2005というソフトを使ってプログラミングをしているのですが、コンパイルの方法がわかりません。確か出力→デバッグ開始だっとような気がするんですが、デバッグができないのでコンパイルもできません。ちなみに元のソースは学校でLinuxでemacsを使用して作ったものなので、一からVisual C++ 2005で作ったものではありません。 回答お願いします

専門家に質問してみよう