Using Valgrind with Julia
Valgrind は、メモリデバッグ、メモリリーク検出、およびプロファイリングのためのツールです。このセクションでは、Juliaでメモリの問題をデバッグする際にValgrindを使用する際に留意すべき点について説明します。
General considerations
デフォルトでは、Valgrindは実行するプログラムに自己修正コードがないと仮定します。この仮定はほとんどのケースでうまく機能しますが、julia
のようなジャストインタイムコンパイラにはひどく失敗します。このため、--smc-check=all-non-file
をvalgrind
に渡すことが重要です。さもなければ、コードがクラッシュしたり、予期しない動作をする可能性があります(しばしば微妙な方法で)。
場合によっては、Valgrindを使用してメモリエラーをよりよく検出するために、julia
をメモリプールを無効にしてコンパイルすることが役立ちます。コンパイル時のフラグMEMDEBUG
はJuliaのメモリプールを無効にし、MEMDEBUG2
はFemtoLispのメモリプールを無効にします。両方のフラグを使用してjulia
をビルドするには、Make.user
に次の行を追加します:
CFLAGS = -DMEMDEBUG -DMEMDEBUG2
もう一つ注意すべき点は、プログラムが複数のワーカープロセスを使用している場合、親プロセスだけでなく、すべてのワーカープロセスをValgrindの下で実行したいと思う可能性が高いということです。これを行うには、--trace-children=yes
をvalgrind
に渡してください。
もう一つ注意すべき点があります: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 rrやRecord 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機構が有効になりますが、フルメモリチェッカーが有効なときよりもはるかに速く実行されます。