2010-11-01 52 views
10

UNIX'te C/C++ üzerinde çalışıyorum ve çoğunlukla çekirdek dosyaları gördüm. Çekirdek dosyalarının çoğu zaman, çekirdek ya da bölümleme hatasının gerçek nedenini bulmak için hata ayıklaması zordur. Lütfen bana verimli bir hata ayıklayıcıyı önerir misiniz?C ve C++ için en iyi hata ayıklama aracı

+3

Hangi derleyiciyi kullanıyorsunuz? Hata ayıklayıcının, derleyiciniz tarafından oluşturulan hata ayıklama sembollerini okuması gerekir. Genel olarak gdb gcc, Sun CC, vb. Ile en iyi şekilde çalışır. – Rup

+0

UNIX –

+1

üzerinde cc kullanıyorum Sachin: Bu aslında bize pek bir şey söylemiyor. Hangi cc? Hangi UNIX? – Ken

cevap

8

Ben nesne dosyaları içindeki sembolleri ayıklama dahil etmek * Nix destek -g çoğu tatlar en C derleyiciler düşünüyorum, bu yüzden bunu yaparsanız:

cc -g -c file1.c 
cc -g -c file2.c 
cc -g file1.o file2.o -o program 
./program 

program çalıştırdığınızda O zaman bunun bir üretmelidir çökerse Daha kolay hata ayıklama çekirdek dosya. İlk iki satır sadece kaynak dosyaları derler (.o dosyaları üretir), üçüncü satır derleyiciye kaynak dosyaları bir yürütülebilir dosyaya bağlamak için bağlayıcıyı çağırmasını söyler (buradaki -g ileticinin yapması gerekmiyorsa, aslında hiçbir şey yapamaz. hata ayıklama sembolleri ile bir yürütülebilir üretmek için özel bir şey, ama hiçbir şey zarar vermemelidir) ve son satır programı çalıştırır. Derleyiciye, hata ayıklamaya çalıştığınızda (optimizasyonlar açık olmadıkça hataların bulunmadığını fark etmedikçe) optimizasyonlar yapmamasını sağladığınızdan emin olmanız gerekir, çünkü optimizasyonlar genellikle izlemeyi daha zor hale getirir.

Hangi platformda olduğunuzu veya hangi araçların bulunduğunu (ya da gerçekten C derleyicisini kullandığınız) bilmediğimden, daha spesifik tavsiyeler vermek zordur. Komiserliğiniz için man sayfasını (el ile) okumalısınız.

man cc 

Ve bu sisteminizde derleyici hakkında çok şey söyleyen bir kılavuz sayfasını getirecektir: Komut satırı türünden. Bu, derleyiciye programlarınızı çalıştırmadan önce hatalarınızı bulmanıza yardımcı olabilecek daha fazla uyarı mesajı üretmesini nasıl söyleyeceğinizi size söyleyebilir. (bazı optimizasyonların sadece belirli optimizasyonları açtığınızda üretilebileceğini unutmayın, bu yüzden optimize edilmiş programın hatalarını ayıklamak istemeyseniz bile optimizasyonlarla derlemek isteyebilirsiniz. sana bir şey söyle).

Unix sisteminizde muhtemelen bir tür hata ayıklayıcısı kurulu. C geliştirme için kurulan çoğu Linux makinesinin kurulu olduğu gdb vardır. gdb, programınızı hata ayıklama modunda çalıştırmak veya bir çekirdek dosyasını analiz etmek için kullanılabilir.Eğer gdb'niz varsa, programınızı çalıştırmaya hazır olursunuz:

. Bunu yaparsanız:

gdb ./program ./core 

Eğer hata ayıklama ve program çöktü sanki olacağı haricinde benzer bir şekilde çalışır. Bu durumda itibaren yapabileceğiniz en hızlı ve en yararlı şey İşte

(gdb) bt 

(gdb) için istemi ve bt bir arka iz üretmek için yazan bir komut olmasıdır. Bu, başarısızlık olduğunda programın hangi işlevi yürüttüğünü gösteren bir çağrı yığını ve bu işlev olarak adlandırılan işlevi ve bu işlev olarak adlandırılan işlevi ve ilk işleve kadar olan işlevi gösterir. Bu, kafa karıştırıcı olabilir, çünkü çoğunlukla en son aranan kitaplık işlevlerini gösterecektir, ancak bu genellikle soruna neden olan yol boyunca birtakım kötü verilerden geçtiğiniz anlamına gelir.

gdb büyük ve karmaşık bir programdır, bu yüzden sisteminizde bulunuyorsa okumaya zaman ayırmalısınız.

Sisteminizde değilse, benzer araçların neler olduğunu öğrenmelisiniz. Bazı grafik hata ayıklayıcıları (IDE içinde olsun ya da olmasın) komut satırı ayıklayıcılarına komut vermek için ön uç görevi görür ve hatta bazı farklı komut satırı hata ayıklayıcılarını destekler, bu nedenle grafik hata ayıklayıcılarından birini kullanabiliyorsanız, endişelenmenize gerek olmayabilir. gerçek arka uç komut satırı hata ayıklayıcısının kullanıldığı hakkında.

2

Genel olarak, gdb mükemmel bir hata ayıklayıcısıdır (öğrenmesi biraz gerekir). Ayrıca DDD veya cgdb gibi bir GUI'ye sahip çeşitli ön cepheler de vardır.

Özellikle sorun yaşadığınız yeri açıklarsanız, hangi hata ayıklayıcınızın size en iyi şekilde yardımcı olacağını daha iyi önerebiliriz.

7

gdb'u kullanın. Bu, standart Unix C/C++ hata ayıklayıcıdır ve 7.0 sürümünden itibaren tersine çevrilebilir hata ayıklama özelliklerine sahiptir (geriye doğru zamanda gidebilirsiniz). Bu nedenler tek başına kontrol etmek için en azından faydalıdır.

10

Segmentasyon hataları, bellek sızıntısı, başlatılmamış veri ve bunun için programınızı valgrind aracılığıyla çalıştırmak her zaman iyi bir fikirdir. Özellikle bellek sızıntılarıyla ilgileniyorsanız, "--leak-check = full" seçeneği kapanır.

Ve evet, gdb'yi öğren. Biraz zaman alır, ama buna değer.

+0

Not Bu, bir çekirdeği çoğaltmanın tutarlı bir yoluna sahipseniz ve sebebi belirlemek istediğinizde yapabileceğiniz bir şeydir. valgrind, önceden oluşturulmuş çekirdek dosyalarını işlemez. – aschepler

3

Totalview'i gerçekten çok seviyorum. Paralel hata ayıklama özellikleri, beni benim yaptığım kadar sevdiren özellikler.

İlgili konular