SORU
10 NİSAN 2010, CUMARTESİ


saptayarak "koşullu atlama veya hareket değeri(s)" başlatılmamış bağlıdır; mesaj valgrind

Valgrind bazı gizemli başlatılmamış değerleri mesaj alıyorum ve kötü değerinden kaynaklı olarak oldukça gizemli oldu.

Bu valgrind unitialised değeri kullanılıyor, ama ilklenmemiş değer kökeni değil biter yeri gösterir gibi görünüyor.

==11366== Conditional jump or move depends on uninitialised value(s)
==11366==    at 0x43CAE4F: __printf_fp (in /lib/tls/i686/cmov/libc-2.7.so)
==11366==    by 0x43C6563: vfprintf (in /lib/tls/i686/cmov/libc-2.7.so)
==11366==    by 0x43EAC03: vsnprintf (in /lib/tls/i686/cmov/libc-2.7.so)
==11366==    by 0x42D475B: (within /usr/lib/libstdc  .so.6.0.9)
==11366==    by 0x42E2C9B: std::ostreambuf_iterator<char, std::char_traits<char> > std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::_M_insert_float<double>(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, char, double) const (in /usr/lib/libstdc  .so.6.0.9)
==11366==    by 0x42E31B4: std::num_put<char, std::ostreambuf_iterator<char, std::char_traits<char> > >::do_put(std::ostreambuf_iterator<char, std::char_traits<char> >, std::ios_base&, char, double) const (in /usr/lib/libstdc  .so.6.0.9)
==11366==    by 0x42EE56F: std::ostream& std::ostream::_M_insert<double>(double) (in /usr/lib/libstdc  .so.6.0.9)
==11366==    by 0x81109ED: Snake::SnakeBody::syncBodyPos() (ostream:221)
==11366==    by 0x810B9F1: Snake::Snake::update() (snake.cpp:257)
==11366==    by 0x81113C1: SnakeApp::updateState() (snakeapp.cpp:224)
==11366==    by 0x8120351: RoenGL::updateState() (roengl.cpp:1180)
==11366==    by 0x81E87D9: Roensachs::update() (rs.cpp:321)

Görüldüğü gibi, Sınıf diyerek olduğunda özellikle çünkü.. oldukça gizemli olur::MethodX, bazen düz noktaları başka vb. Belki de bu en iyi duruma getirme nedeniyle mi?

==11366==    by 0x81109ED: Snake::SnakeBody::syncBodyPos() (ostream:221)

Aynen böyle. Kaçırdığım bir şey mi var? Süper-uzun, basit bir beşgen kullanmaktır dedektif işe başvurmak zorunda kalmadan kötü değerleri yakalamak için en iyi yolu nedir?

Güncelleme:

Sorunun ne olduğunu, ama garip bir şey kötü değeri ilk kullanıldığında, valgrind rapor etmedin olduğunu öğrendim. Çarpım işlevi kullanılmıştır:

movespeed = stat.speedfactor * speedfac * currentbendfactor.val;

Nerede speedfac unitialised bir şamandıra oldu. Ancak o dönemde bildirilen ve değer hatası alıyorum, yazdırılacak kadar.. orada valgrind için bir ayar bu davranışı değiştirmek için mi?

CEVAP
10 NİSAN 2010, CUMARTESİ


7 ** valgrind seçeneği başlatılmamış değerleri kökeni izlemek için kullanın. Bu daha yavaş ve daha fazla bellek alacak, ama eğer başlatılmamış bir değer kökeni izlemek için çok yararlı olabilir.

Güncelleme:Hangi başlatılmamış değeri, the valgrind manual states bildirilen noktası ile ilgili:

Önemli program etrafında önemsiz () ilklenmemiş veri o kadar sever ki kopya olduğunu anlamak önemlidir. Memcheck bu gözlemler ve verileri takip eder, ama şikayet etmez. Şikayet programınızı programınızın etkileyebilecek bir şekilde ilklenmemiş veri kullanmak için girişimleri sadece verilen dışarıdan görünür bir davranış.

Valgrind FAQ:

İlklenmemiş bellek değerleri kopyalarını istekli bildirdiği gibi, bu birden çok kez ileri sürülmüştür. Ne yazık ki, neredeyse tüm programlar yasal ilklenmemiş bellek değerleri etrafında pad yapılar hizalama korumak için Derleyiciler (çünkü) kopyalayın ve istekli kontrol yanlış pozitif yüzlerce yol açar. Bu nedenle Memcheck bu zamanda istekli denetimi desteklemiyor.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • CZTUTORIALS

    CZTUTORIALS

    28 Ocak 2011
  • ThePhestor

    ThePhestor

    22 Mart 2011
  • TheXiaxue

    TheXiaxue

    3 AĞUSTOS 2009