Umarım bu soru çok açık uçlu değildir. an "out of memory" from calling next
on an Iterator
trait object'u bulduğum Rust ile ilgili bir bellek sorunuyla karşılaştım. Hata ayıklama konusunda emin değilim. Baskılar beni sadece hatanın meydana geldiği noktaya getirdi. Ben ltrace gibi diğer araçlara çok aşina değilim, bu yüzden bir iz oluşturabilirim (231MiB, pff), gerçekten onunla ne yapacağımı bilmiyordum. Böyle bir iz yararlı mı? Gdb/lldb'yi ele geçirmek için daha iyisini yapar mıyım? Ya da Valgrind?Rust'taki bir bellek sorununu nasıl ayırım?
cevap
Genelde ben aşağıdaki yaklaşımı yapmaya çalışacağını söyledi:
Demirbaş azalma: etrafta çok fazla ek kod yok ki, OOM sorununu daraltmak için deneyin. Diğer bir deyişle: programınız ne kadar hızlı çöker, o kadar iyidir. Bazen, belirli bir kod parçasını parçalamak ve soruşturma için ekstra bir ikili haline getirmek de mümkündür.
Sorun boyut küçültme: Alt aslında bir OOM neden olmadığını ancak bazı parça atıklar şey söyleyebilirim ki basit bir "çok fazla belleğe" için OOM gelen sorunu. Sorunu görüp görmediğinizi anlamak çok zorsa, bellek sınırını düşürebilirsiniz. Linux'ta bu
ulimit
kullanılarak yapılabilir:ulimit -Sv 500000 # that's 500MB ./path/to/exe --foo
Bilgi toplama: Sorunun kadar küçük, bir düşük ses seviyesine bilgi toplamak için hazır. Denemeniz için birçok yol var. Sadece programınızı debug sembolleri ile derlemeyi unutmayın. Ayrıca, genellikle bilgi kaybına yol açtığı için optimizasyonu kapatmak bir avantaj olabilir. Her ikisi de derleme sırasında
--release
bayrağını kullanarak DEĞİL tarafından arşivlenebilir.Öbek profilleme: Tek yol çok gperftools kullanmak edilir:
LD_PRELOAD="/usr/lib/libtcmalloc.so" HEAPPROFILE=/tmp/profile ./path/to/exe --foo pprof --gv ./path/to/exe /tmp/profile/profile.0100.heap
Bu size programın parçaları bellek hangi miktarda yemek hangi simgeleyen grafiğini gösterir. Daha fazla bilgi için official docs'a bakın.
rr: Bazen, özellikle bir profil oluşturulduktan sonra gerçekte ne olduğunu anlamak çok zor. 2. adımda iyi bir iş yaptı varsayarsak, rr kullanabilirsiniz:
rr record ./path/to/exe --foo rr replay
Bu süper güçleri olan bir GDB doğacaktır. Normal bir hata ayıklama oturumu arasındaki fark, yalnızca
continue
değil, aynı zamandareverse-continue
. Temel olarak programınız istediğiniz gibi ileri geri atlayabileceğiniz bir kayıttan yürütülür. This wiki page bazı ek örnekler sağlar. Dikkat edilmesi gereken bir nokta, rr'nin sadece GDB ile çalıştığı görülmektedir.Eski iyi hata ayıklama: Bazen, hala çok büyük izler ve kayıtlar alırsınız. Bu durumda (
ulimit
hile ile birlikte) sadece programı çöker kadar GDB kullanabilir ve bekleyebilir:gdb --args ./path/to/exe --foo
Bu sayede, program mevcut durumu ne inceleyebilirsiniz normal hata ayıklama oturumu almalısınız . GDB aynı zamanda coredumps ile de piyasaya sürülebilir. Bu yaklaşımla ilgili genel sorun, zamanda geriye gidemeyeceğiniz ve yürütmeye devam edemeyeceğiniz yönündedir. Böylece sadece tüm yığın çerçeveleri ve değişkenleri içeren mevcut durumu görüyorsunuz. İsterseniz LLDB'yi de kullanabilirsiniz.
(Potansiyel) + tekrarı düzeltmek: size kodunu değiştirmek için deneyebileceğiniz yanlış gidebileceğini ne tutkal sonra. Sonra tekrar dene. Hala çalışmıyorsa, 3. adıma dönün ve tekrar deneyin.
Genelde, hata ayıklamak için, günlük tabanlı bir yaklaşım kullanabilirsiniz (günlükleri kendiniz ekleyerek veya ltrace
, ptrace
, ... sizin için günlükleri oluşturmak için). Bir hata ayıklayıcı kullanın.
Not: ltrace
, ptrace
veya hata ayıklayıcı tabanlı yaklaşımlar, sorunu yeniden oluşturabilmenizi gerektirir; Manuel günlükleri destekleme eğilimindeyim çünkü hata raporlarının hemen yeniden üretime izin vermeyecek kadar kesin olmadığı bir endüstride çalışıyorum (ve böylece yeniden üreteci senaryosunu oluşturmak için günlükleri kullanıyoruz).
Pas her iki yaklaşımı destekler ve C veya C++ programları için kullanılan standart araç takımı bunun için iyi çalışır.
Kişisel yaklaşımım, sorunun oluştuğu yerlerin hızlı bir şekilde daraltılması için numaralı oturumunun günlüğe kaydedilmesi ve günlüğe kaydetmenin, daha ince bir denetim için bir hata ayıklayıcısını tetiklemek için yetersiz kalmasıdır. Bu durumda hata ayıklayıcısına hemen gitmenizi öneriyorum.
panic
A, bir panik kancasına yapılan çağrıyı keserek, işlerin kötüye gittiği anda hem çağrı yığınını hem de bellek durumunu görebildiğiniz anlamına gelir.
Programınızı hata ayıklayıcınızla başlatın, panik kancada bir kesme noktası ayarlayın, programı çalıştırın, kar edin.
- 1. CUDA bellek parçalanması sorununu çözmek mümkün mü?
- 2. Bir Birlik Kapsayıcısında "Çözümle" hatalarını nasıl ayırım?
- 3. Bir GitHub sorununu taahhütte bulunmadan nasıl kapatabilirim?
- 4. Yazı tipindeki bir diziden nasıl bir tip ayırım?
- 5. Bir Postgres zaman damgası alanını java kullanarak nasıl ayırım?
- 6. Sayısal 2d dizisinden bir alt diziyi nasıl ayırım?
- 7. Perl'deki bir metin dosyasından tablo verilerini nasıl ayırım/ayrıştırabilirim?
- 8. Scala 2.10 yansıma, bir alan sınıfından alan değerlerini nasıl ayırım
- 9. Google'ın API'sında CORS sorununu nasıl giderebilirim?
- 10. sqlite ve C# içindeki "'" sorununu nasıl çözebilirim?
- 11. sonsuz alıcı sorununu geri getiriyor
- 12. GCD sorgu sorununu askıya alma
- 13. Excel'de, on harf dizesinin son dört harfini nasıl ayırım? Örneğin
- 14. COM'dan çağrıldığında yönetilen koddaki işlenmeyen özel durum hatalarını nasıl ayırım?
- 15. VB6'da bir ADO zaman aşımı sorununu çözme
- 16. UISearchBar ile hazırForSpag ile indexPath.row sorununu giderme
- 17. Bash - Curl (6) sistem sorununu çözemedi
- 18. Bu küçük girinti sorununu vim ile nasıl giderebilirim?
- 19. temel kimlik doğrulama sorununu rapor yöneticisine nasıl iletilir url
- 20. C# Koşullu deyimler sorununu geçersiz kılma
- 21. Harita Sorununu Eclipse projesini Studio'ya Aktarırken
- 22. Mercurial'da Tek bir dosyanın değişikliklerini başka bir dalda uygulamak için Changeset'ten nasıl ayırım?
- 23. Bir CSS Akışkan Izgarası'nda Alt Piksel yuvarlama sorununu düzeltme
- 24. Bellek kullanımı nasıl görüntülenir?
- 25. bellek sınıfı bellek filtresi
- 26. CSV okuyucusu bir bellek dosyasını nasıl okuyacaktır?
- 27. Ext.js'de bir bellek proxy'si nasıl yazılır
- 28. Bir Windows işleminin bellek haritası nasıl görünüyor?
- 29. Bellek
- 30. .NET derlemesinin bir derlemesi tarafından oluşturulan .resources dosyasındaki görüntüleri nasıl ayırım?
Valgrind her zaman iyi bir başlangıçtır. Kodunuzu da optimize etmeyi deneyin. –
@EliSadoff Kodumu optimize etmek, hata ayıklama sorunları ile nasıl yardımcı olur? – Apanatshka