問題タブ [mtrace]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - GLIBC: メモリリークのデバッグ: mtrace() の出力を解釈する方法
メモリ リークの問題をデバッグしようとしています。malloc/free/realloc トレースを取得するためにmtrace()を使用しています。プログラムを実行したところ、巨大なログ ファイルが作成されました。ここまでは順調ですね。しかし、ファイルの解釈に問題があります。次の行を見てください。
これに関する奇妙な点は、1 つの呼び出し (同じ戻りアドレス) が 4 つの割り当てを担当していることです。
さらに見知らぬ人:
これらの 2 行の間で、ブロック 0x2aaab43a1700 が解放されることはありません。
誰もこれを説明する方法を知っていますか? 1 回の呼び出しで 4 つの割り当てが発生するのはなぜですか? また、以前に割り当てられたアドレスを malloc で返すにはどうすればよいでしょうか。
edit 2008/09/30: GLIBC が提供する mtrace() 出力を分析するスクリプト (mtrace.pl) は、ここでは役に立ちません。それはただ言うでしょう:0x2aaab43a1700重複を割り当てます。しかし、どうしてこれが起こるのでしょうか?
c - Fortran プログラムの mtrace
mtrace
Fortran プログラムでメモリ リークを検出するために使用しようとしています。gfortran コンパイラを使用しています。mtrace の (動作する) C の例については、ウィキペディアのエントリを参照してください: http://en.wikipedia.org/wiki/Mtrace
私は両方の方法を試しました。つまり、mtrace() と muntrace() をラップして fortran プログラムから呼び出し、また mtrace() と muntrace() を直接呼び出す C プログラムを作成しました。どちらの方法でもメモリ リークを検出できませんが、ここでは後者のみを紹介します。
example.c
leaky.f90
私はコンパイルします:
次に、次のように実行します。
raw.txt
mtrace
次に、出力を次のように解析します。
そして得る:
メモリリークはありません。
私が間違っていることはありますか、またはmtrace
リークのあるfortranメモリ割り当てを見つけるためにできることはありますか? gfortran はトレースしない別のmalloc
呼び出しを使用していると思いmtrace
ます... 実際、上で書いたように、(ラップされた)mtrace()
とmuntrace()
.
EDITED:他のオプション(ここではまだ言及されていないものを含む)を検討しましたが、デバッグ中の実際のコードはP6 / AIXで実行されるため、Valgrindは「ちょうど」不便です(別のマシンで実行する必要があります)一方、Forcheckは不便 (別のマシンで実行する必要があります) で、高価です (~ 3k$)。現時点では、mtrace が最適なソリューションです。
再編集:私の推測
gfortran はトレースしない別の
malloc
呼び出しを使用していると思います...mtrace
正しかった。実行可能ファイルを調べると ( または のいずれかでnm
)readelf
呼び出しはありませんmalloc()
が、_gfortran_allocate_array
malloc を呼び出す可能性があるものがあります)。他のアイデアはありますか?
再度編集: 回答を投稿しましたが、受け入れることができません ( http://stackoverflow.uservoice.com/pages/general/suggestions/39426にアクセスして、機能をリクエストしてください。本当に必要です。評判の向上は必要ありません)。
malloc - バイナリプログラムのmtrace(MALLOC_TRACE)を有効にする
ソースのないバイナリプログラムに対してmtrace()
(およびenv)を有効にするにはどうすればよいですか?MALLOC_TRACE
mtraceはglibcの機能です:http ://www.gnu.org/s/hello/manual/libc/Allocation-Debugging.html
ありがとう
glibc - mtrace+MALLOC_TRACE-バッファリングを無効にする
バッファリングを無効にしmtrace
て、名前の付いたファイルを出力するにはどうすればよいですMALLOC_TRACE
か?
mtraceは次のように開始されます。
c - Windows の場合は MALLOC_TRACE
当社では、メモリ リークを検出するための glibc の mtrace (MALLOC_TRACE) 機能に似た社内フレームワークを使用しています。このフレームワークは Windows で実行するように作成されていますが、GNU/Linux ではうまく動作しません。
では、Windows、GNU/Linux、できれば MacOSX でも実行できる、移植可能な mtrace (MALLOC_TRACE) に相当するものを知っている人はいますか?
c++ - 完全なスタック トレースを含む mtrace はありますか? または、この機能を持つように単純に変更できますか?
巨大なアプリのメモリ消費の分析中に、glibc の mtrace を使用します。しかし問題は、malloc 呼び出しのソースだけを提供し、完全なスタック トレースを提供しないことです。したがって、多くの場所で使用されているメソッドで malloc を使用すると、malloc の見分けがつかないソースが 1 つだけ報告されます。もう 1 つの問題は、標準の C ライブラリと、CSimpleArray などの汎用オブジェクトです。誰かが巨大な配列を使用したことだけは知っていますが、誰が正確にはわかりません。
したがって、誰が malloc を正確に使用したかを知るには、完全なスタック トレースが必要だと考えました。そのような mtrace の亜種が存在するかどうか知っていますか? または、それを行うために単純に変更できますか?
注意: 私の mtrace.out ログには 30 万行が含まれており、mtrace スクリプトで処理した後は 1 万のエントリがあります。最大の 10% のチャンクのみをローカライズすれば十分です。
c - valgrind で mtrace を正常に実行できますか?
5 つの malloc と 3 つの解放を行うプログラムがあります。最初に mtrace() を呼び出し、最後に muntrace() を呼び出します。プログラムを正常に実行すると、mtrace は不足している解放を報告します。私が行った場合:
valgrind は不足している解放を報告しますが、mtrace は報告しません。
したがって、両方を一緒に使用することはできないと思います-valgrindはmtraceをオーバーライドしますか?
c++ - g++ -static はメモリ リークを引き起こします (mtrace によって報告されます)
だから私は誰かが光を当てることができることを望んでいるという奇妙な問題を抱えています...私は次のコードを持っています:
そして、私はこれらの2つの方法でコンパイルしました:
と
mtrace の出力 (私の場合は mem.out) を見ると、
-static
オプションのmtrace
レポートを使用すると、次のように表示されます。
しかし、-static
オプションを除外するmtrace
と、輝かしいことが報告されます。
ここで何が起こっているかについてのアイデアはありますか?