CodeBlanks Logo Icon CodeBlanks

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

main.c
#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

main.c
#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

Soru
fprintf(stderr, "iz: başla n=%d
", ____);
Cevap
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.

Orta seviye bölümündeki tüm dersler