2016-07-17 5 views
0

私のC++プログラムのパフォーマンスを向上させようとしています。メモリ割り当て(malloc)をオブジェクトプールに変換すると大きな結果が得られることがわかりました。 問題は、コードベースがかなり大きいため、mallocが呼び出される場所を検出することです。多くのタイマーとシグナルハンドラが並行して実行されているため、単純なgdbをブレークポイントで使用することはできません。C++でメモリ割り当てが検出される

gdbには、mallocが呼び出されるたびにスタックトレース全体を手動で印刷せずに印刷できる方法があります。 または 同じことをするのに役立つ他のツールを提案できますか?

+4

コードベース全体で文字列 'malloc'を検索するのはどれほど難しいですか? – taskinoor

+0

なぜC++コードでmallocを使用していますか?あなたは新しいものを使うべきです。この場合、あなた自身の新しい演算子を定義することができます –

+0

GDBで[* this *](http://stackoverflow.com/a/378024/23771)できますか?もし* malloc *(または* new *)に入っていれば、あなたはライブを見つけました。そうでなければ、サンプル数が20程度になると、それほど時間がかからず、最適化するほど価値がないでしょう。 –

答えて

1

gdbをPythonでスクリプトすることができます。

独自のmalloc関数を実装してリンクすることもできます。リターンアドレスはスタック上にあり、これはあなたに発信者を与えます。

0

ツールのvalgrindのスイートは、あなたはまさにこの目的のために使用することができます山塊が含まれています

valgrind --tool=massif ./mybinary 

これは、プログラムが実行を終了した後、あなたが調べることができ、スタックトレースを含む、すべての割り当ての詳細を収集します。出力の詳細については、http://valgrind.org/docs/manual/ms-manual.htmlを参照してください。希望が役立ちます。

P.S.また、TCMallocライブラリをチェックアウトしてください。あなたのアプリケーションに応じてもっとうまくいくかもしれませんが、既にそれがすでに実現している可能性があります。もっとも良いことは、ソースコードの変更が必要ないことです。リンカディレクティブを使用してglibcからmalloc関数を置き換えるだけです。