mtrace
Fortran プログラムでメモリ リークを検出するために使用しようとしています。gfortran コンパイラを使用しています。mtrace の (動作する) C の例については、ウィキペディアのエントリを参照してください: http://en.wikipedia.org/wiki/Mtrace
私は両方の方法を試しました。つまり、mtrace() と muntrace() をラップして fortran プログラムから呼び出し、また mtrace() と muntrace() を直接呼び出す C プログラムを作成しました。どちらの方法でもメモリ リークを検出できませんが、ここでは後者のみを紹介します。
example.c
#include <stdlib.h>
#include <mcheck.h>
extern void leaky_(); // this might be different on your system
// if it doesn't work, try to run:
// 1) gfortran leaky.f90 -c
// 2) nm leaky.o
// and then change this declaration and its use below
void main() {
mtrace();
leaky_();
muntrace();
}
leaky.f90
subroutine leaky()
real, allocatable, dimension(:) :: tmp
integer :: error
allocate (tmp(10), stat=error)
if (error /= 0) then
print*, "subroutine leaky could not allocate space for array tmp"
endif
tmp = 1
!of course the actual code makes more...
print*, ' subroutine leaky run '
return
end subroutine leaky
私はコンパイルします:
gfortran -g example.c leaky.f90
次に、次のように実行します。
export MALLOC_TRACE=`pwd`/raw.txt; ./a.out
raw.txt
mtrace
次に、出力を次のように解析します。
mtrace a.out raw.txt
そして得る:
メモリリークはありません。
私が間違っていることはありますか、または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にアクセスして、機能をリクエストしてください。本当に必要です。評判の向上は必要ありません)。