Using Valgrind with Julia

Valgrind は、メモリデバッグ、メモリリーク検出、およびプロファイリングのためのツールです。このセクションでは、Juliaでメモリの問題をデバッグする際にValgrindを使用する際に留意すべき点について説明します。

General considerations

デフォルトでは、Valgrindは実行するプログラムに自己修正コードがないと仮定します。この仮定はほとんどのケースでうまく機能しますが、juliaのようなジャストインタイムコンパイラにはひどく失敗します。このため、--smc-check=all-non-filevalgrindに渡すことが重要です。さもなければ、コードがクラッシュしたり、予期しない動作をする可能性があります(しばしば微妙な方法で)。

場合によっては、Valgrindを使用してメモリエラーをよりよく検出するために、juliaをメモリプールを無効にしてコンパイルすることが役立ちます。コンパイル時のフラグMEMDEBUGはJuliaのメモリプールを無効にし、MEMDEBUG2はFemtoLispのメモリプールを無効にします。両方のフラグを使用してjuliaをビルドするには、Make.userに次の行を追加します:

CFLAGS = -DMEMDEBUG -DMEMDEBUG2

もう一つ注意すべき点は、プログラムが複数のワーカープロセスを使用している場合、親プロセスだけでなく、すべてのワーカープロセスをValgrindの下で実行したいと思う可能性が高いということです。これを行うには、--trace-children=yesvalgrindに渡してください。

もう一つ注意すべき点があります:valgrindを使用している場合にUnable to find compatible target in system imageというエラーが出たら、ターゲットをgenericに設定してsysimageを再構築するか、JULIA_CPU_TARGET=genericを使ってjuliaを再ビルドしてみてください。

Suppressions

Valgrindは実行中に通常、虚偽の警告を表示します。このような警告の数を減らすために、Valgrindにsuppressions fileを提供することが役立ちます。サンプルの抑制ファイルは、Juliaのソース配布のcontrib/valgrind-julia.suppに含まれています。

suppressionsファイルは、julia/ソースディレクトリから次のように使用できます:

$ valgrind --smc-check=all-non-file --suppressions=contrib/valgrind-julia.supp ./julia progname.jl

表示されるメモリエラーは、バグとして報告するか、追加の抑制として貢献する必要があります。 Valgrindの一部のバージョンは shipped with insufficient default suppressions であるため、バグを提出する前に考慮すべきことの一つかもしれません。

Running the Julia test suite under Valgrind

全てのJuliaテストスイートをValgrindの下で実行することは可能ですが、かなりの時間がかかります(通常は数時間)。 そうするには、julia/test/ディレクトリから以下のコマンドを実行してください:

valgrind --smc-check=all-non-file --trace-children=yes --suppressions=$PWD/../contrib/valgrind-julia.supp ../julia runtests.jl all

「明確な」メモリリークのレポートを見たい場合は、valgrindにフラグ--leak-check=full --show-leak-kinds=definiteを渡してください。

Additional spurious warnings

このセクションでは、抑制ファイルに追加できないが、それでも無視しても安全なValgrindの警告について説明します。

Unhandled rr system calls

Valgrindは、system calls that are specific to rrRecord and Replay Frameworkのいずれかに遭遇すると警告を発します。特に、juliaがrrの下で実行されているかどうかを検出しようとすると、未処理の1008システムコールに関する警告が表示されます。

--xxxxxx-- WARNING: unhandled amd64-linux syscall: 1008
--xxxxxx-- You may be able to write your own handler.
--xxxxxx-- Read the file README_MISSING_SYSCALL_OR_IOCTL.
--xxxxxx-- Nevertheless we consider this a bug.  Please report
--xxxxxx-- it at http://valgrind.org/support/bug_reports.html.

この問題 has been reported を Valgrind 開発者に送信してください。彼らが要求しています。

Caveats

Valgrindは現在 does not support multiple rounding modes であるため、丸めモードを調整するコードはValgrindの下で実行されると異なる動作をします。

一般的に、--smc-check=all-non-fileを設定した後にプログラムがValgrindの下で異なる動作をすることがわかった場合、さらに調査する際にvalgrind--tool=noneを渡すと役立つかもしれません。これにより、最小限のValgrind機構が有効になりますが、フルメモリチェッカーが有効なときよりもはるかに速く実行されます。