5

mtraceFortran プログラムでメモリ リークを検出するために使用しようとしています。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_arraymalloc を呼び出す可能性があるものがあります)。他のアイデアはありますか?

再度編集: 回答を投稿しましたが、受け入れることができません ( http://stackoverflow.uservoice.com/pages/general/suggestions/39426にアクセスして、機能をリクエストしてください。本当に必要です。評判の向上は必要ありません)。

4

4 に答える 4

1

私はmtraceの専門家ではないので、それを手伝うことはできません。サポートされているシステムを使用している場合は、 valgrindツールを試してメモリリークを見つけることをお勧めします。valgrindを使用してメモリリークを見つけるのは、を呼び出すのと同じくらい簡単valgrind --leak-check=full ./a.outです。

于 2008-11-04T07:46:03.027 に答える
1

私はFortranプログラムのデバッグの経験がありますが、正直なところ、あなたの質問を本当に理解することはできませんでした。これは、Fortranとは異なるC /C++のデバッグ経験があまりないためだと思います。それにもかかわらず、これはあなたに利益をもたらすと思います:

インテル®コンパイラーを以下のコンパイル・オプションとともに使用すると、実行時にほとんどすべてのメモリー・リーク、誤ったアドレス・アクセス、または初期化されていないポインター/変数の使用が検出されます。

Intel:-O0 -debug -traceback -check -ftrapuv

Gfortranの場合も、これらのコンパイラオプションを使用すると、上記のエラーのいずれかが発生する可能性があります。

gfortran:-g -O0 -fbounds-check -Wuninitialized

エラーが発生するまで、サブルーチン呼び出しのトレースバックを出力します。2つの異なるコンパイラでコンパイルすることは常に役立ちます。私の経験では、この後、メモリリークはほとんど発生しません。

于 2012-02-16T16:03:50.180 に答える
1

Steve Kargl は答えを持っていました。簡単に言うと、コンパイラが標準に準拠している場合はリークがないため、mtrace はリークを検出しないということです。http://gcc.gnu.org/ml/fortran/2008-11を参照してください。詳細については、 /msg00163.htmlを参照してください。

実際、私はFortranの専門家ではありません(私は主にC / C ++ / Javaの男です)、別のコンパイラも使用していましたが、そのような状況ではリークします(質問を簡単にするために言及しませんでした) )。したがって、gfortranにもリークがあると誤って考えましたが、そうではありません(トップで確認しました)

于 2008-12-11T18:46:39.150 に答える
1

Valgrind は Linux のみです。Windows 製品については、Forcheck を参照してください。 http://www.forcheck.nl/features.htm

于 2008-11-04T15:29:29.597 に答える