Using Valgrind with Julia

Valgrind bellek hata ayıklama, bellek sızıntısı tespiti ve profil oluşturma aracıdır. Bu bölüm, Julia ile bellek sorunlarını ayıklarken Valgrind kullanırken akılda tutulması gereken şeyleri açıklar.

General considerations

Varsayılan olarak, Valgrind, çalıştırdığı programlarda kendini değiştiren kod olmadığını varsayar. Bu varsayım çoğu durumda iyi çalışır, ancak julia gibi bir anında derleyici için feci şekilde başarısız olur. Bu nedenle, valgrind'a --smc-check=all-non-file parametresini geçirmek çok önemlidir, aksi takdirde kod çökebilir veya beklenmedik şekilde davranabilir (genellikle ince yollarla).

Bazı durumlarda, Valgrind kullanarak bellek hatalarını daha iyi tespit etmek için julia'yı bellek havuzları devre dışı bırakılarak derlemek faydalı olabilir. Derleme zamanı bayrağı MEMDEBUG, Julia'da bellek havuzlarını devre dışı bırakır ve MEMDEBUG2, FemtoLisp'te bellek havuzlarını devre dışı bırakır. julia'yı her iki bayrakla derlemek için, Make.user dosyasına aşağıdaki satırı ekleyin:

CFLAGS = -DMEMDEBUG -DMEMDEBUG2

Başka bir not: Eğer programınız birden fazla işçi süreci kullanıyorsa, muhtemelen tüm bu işçi süreçlerinin Valgrind altında çalışmasını istersiniz, sadece ana süreç değil. Bunu yapmak için, valgrind'a --trace-children=yes parametresini geçin.

Başka bir not: valgrind kullanıyorsanız Sistem görüntüsünde uyumlu hedef bulunamıyor hatası alıyorsanız, sysimage'ı generic hedefi ile yeniden inşa etmeyi veya julia'yı JULIA_CPU_TARGET=generic ile derlemeyi deneyin.

Suppressions

Valgrind genellikle çalışırken sahte uyarılar gösterir. Bu tür uyarıların sayısını azaltmak için, Valgrind'a bir suppressions file sağlamak faydalıdır. Örnek bir bastırma dosyası, Julia kaynak dağıtımında contrib/valgrind-julia.supp içinde bulunmaktadır.

julia/ kaynak dizininden aşağıdaki gibi suppressions dosyası kullanılabilir:

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

Herhangi bir bellek hatası görüntülendiğinde, bunlar ya hata olarak bildirilmelidir ya da ek bastırmalar olarak katkıda bulunulmalıdır. Bazı Valgrind sürümlerinin shipped with insufficient default suppressions olduğu unutulmamalıdır, bu nedenle herhangi bir hata göndermeden önce dikkate alınması gereken bir şey olabilir.

Running the Julia test suite under Valgrind

Tamam, tüm Julia test suite'ini Valgrind altında çalıştırmak mümkündür, ancak bu genellikle birkaç saat sürer. Bunu yapmak için, julia/test/ dizininden aşağıdaki komutu çalıştırın:

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

Eğer "kesin" bellek sızıntılarına dair bir rapor görmek istiyorsanız, valgrind'a --leak-check=full --show-leak-kinds=definite bayraklarını da geçin.

Additional spurious warnings

Bu bölüm, bastırma dosyasına eklenemeyen ancak yine de göz ardı edilmesi güvenli olan Valgrind uyarılarını kapsar.

Unhandled rr system calls

Valgrind, herhangi bir system calls that are specific to rr, Record and Replay Framework ile karşılaşırsa bir uyarı verecektir. Özellikle, julia'nın rr altında çalışıp çalışmadığını tespit etmeye çalıştığında bir 1008 sistem çağrısı ile ilgili bir uyarı gösterilecektir:

--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.

Bu sorunu has been reported Valgrind geliştiricilerine iletin, çünkü bunu talep ettiler.

Caveats

Valgrind şu anda does not support multiple rounding modes, bu nedenle yuvarlama modunu ayarlayan kod, Valgrind altında çalıştırıldığında farklı davranacaktır.

Genel olarak, --smc-check=all-non-file ayarını yaptıktan sonra programınızın Valgrind altında farklı davrandığını bulursanız, daha fazla araştırma yaparken valgrind'a --tool=none geçişini yapmanız faydalı olabilir. Bu, en az Valgrind mekanizmasını etkinleştirecek ancak tam bellek denetleyicisi etkinleştirildiğinde olduğundan çok daha hızlı çalışacaktır.