printf debugging
- C kursu
- Orta seviye
- Ders 98/116
- 5 dk
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.
Başlangıç kodu
#include <stdio.h>
// process fonksiyonunu yaz: girişte ve çıkışta iz yaz
// main'de process(5) çağır ve yazdır
int main(void) {
return 0;
}Örnek çözüm
#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;
}Beklenen çıktı
iz: başla n=5 iz: bit result=10 10
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 İzleme desenlerini eşle
| Kavram | Anlamı |
|---|---|
fprintf(stderr,...) |
Hata akışına iz |
printf(...) |
Standart çıktıya iz |
2> log.txt |
İzlemeyi dosyaya al |
iz: başla |
Fonksiyon girişi |
2 İzleme çıktısını tamamla
fprintf(stderr, "iz: başla n=%d
", ____);
fprintf(stderr, "iz: başla n=%d
", n);
Açıklama: fprintf(stderr, ..., n) ile n değeri iz akışına yazılır.
3 printf debugging neden stderr kullanır?
- Çünkü stdout kullanılamaz
- Çünkü stderr daha hızlıdır
- Çünkü stderr stdout'tan ayrı akış Doğru cevap
- Çünkü stderr derleyiciyi hızlandırır
Açıklama: stderr, stdout'tan ayrı olduğu için izlemeyi normal çıktıdan ayırır.