C
printf debugging
printf ile hata ayıklama taktiklerini öğrenirsin.
printf ile izleme
Bazen gdb kullanmak pratik değildir; örneğin program çok yavaşsa veya bir sunucuda çalışıyorsa. Böyle durumlarda printf ile hata ayıklama en hızlı yoldur. Kodun içine geçici printf veya fprintf(stderr, ...) çağrıları koyarsın.
Örnek: fprintf(stderr, "iz: başla n=%d\n", n);. stderr kullanmak, normal çıktıdan ayrı tuttuğu için izlemeyi kolaylaştırır; istersen ./prog 2> log.txt ile dosyaya yönlendirirsin. İyi bir izleme iletisi, fonksiyon adını ve önemli değişkenlerin değerlerini içerir. Hata bulununca bu çağrılar kaldırılır; kalıcı kodda bırakılmaz.
İşlev girişi ve çıkışı
Bir fonksiyonun çağrılıp çağrılmadığını ve hangi değerlerle girdiğini denetlemek için, girişte ve çıkışta izleme satırları koyarsın. Bu, fonksiyonun akışını baştan sona görmeni sağlar.
Örnek: int process(int n) { fprintf(stderr, "iz: başla n=%d\n", n); int result = n * 2; fprintf(stderr, "iz: bit result=%d\n", result); return result; }. Giriş iletisi parametreleri, çıkış iletisi dönüş değerini gösterir. main bu fonksiyonu çağırıp sonucu yazdırdığında, hem iz çıktısını hem sonucu birlikte görürsün. Bu desen, özellikle derin çağrı zincirlerinde hatanın hangi katmanda olduğunu bulmaya yarar.
Uygulama İzlemeli fonksiyon yaz
int process(int n) fonksiyonunu yaz. Girişte fprintf(stderr, "iz: başla n=%d\n", n);, int result = n * 2; hesapla, çıkışta fprintf(stderr, "iz: bit result=%d\n", result); yazdır ve return result; yap. main içinde printf("%d\n", process(5)); ile çağır.
Örnek çözümü göster
#include <stdio.h>
int process(int n) {
fprintf(stderr, "iz: başla n=%d\n", n);
int result = n * 2;
fprintf(stderr, "iz: bit result=%d\n", result);
return result;
}
int main(void) {
printf("%d\n", process(5));
return 0;
}
Kendini test et
-
İzleme desenlerini eşle
- fprintf(stderr,...)
- Hata akışına iz
- printf(...)
- Standart çıktıya iz
- 2> log.txt
- İzlemeyi dosyaya al
- iz: başla
- Fonksiyon girişi
-
İzleme çıktısını tamamla
fprintf(stderr, "iz: başla n=%d
", ____);
Cevabı göster
fprintf(stderr, "iz: başla n=%d
", n);
-
printf debugging neden stderr kullanır?
- Çünkü stdout kullanılamaz
- Çünkü stderr daha hızlıdır
- Çünkü stderr stdout'tan ayrı akış
- Çünkü stderr derleyiciyi hızlandırır
Cevabı göster
Çünkü stderr stdout'tan ayrı akış — stderr, stdout'tan ayrı olduğu için izlemeyi normal çıktıdan ayırır.
Sıradaki ders: Özet - Hata ayıklama