Using Valgrind with Julia
Valgrind は、メモリデバッグ、メモリリーク検出、およびプロファイリングのためのツールです。このセクションでは、Juliaでメモリの問題をデバッグする際にValgrindを使用する際に留意すべき点について説明します。
General considerations
デフォルトでは、Valgrindは実行するプログラムに自己修正コードがないと仮定します。この仮定はほとんどのケースでうまく機能しますが、juliaのようなジャストインタイムコンパイラにはひどく失敗します。このため、valgrindに--smc-check=all-non-fileを渡すことが重要です。さもなければ、コードがクラッシュしたり、予期しない動作をする可能性があります(しばしば微妙な方法で)。
メモリエラーをより良く検出するために、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 syscall に関する警告が表示されます。
--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機構が有効になりますが、フルメモリチェッカーが有効なときよりもはるかに速く実行されます。