Baslangic

Platform tanitimi

Bu platform, eBPF öğrenmenize yardımcı olmak için yapılandırılmış bir ortam ve alıştırmalar sunar.

Editör, siz yazarken kodunuzu lokal olarak derler, ancak butonuna tıklayarak bunu devre dışı bırakabilirsiniz. Derleme hataları satır içinde vurgulanır.

Editöre bir şeyler yazmayı deneyin ve nasıl tepki verdiğini görün, ardından kodunuzu sunucuda çalıştırmak için ‘Run’ butonuna tıklayın.

‘vim mode’ tercih ediyorsanız, butonu bunu açıp kapatır.

Kısayol tuşları

  • Ctrl+Enter kodu çalıştırır.
  • Ctrl+Click type definition’lar üzerinde (my_struct, trace_event_raw_sched_process_exec) bir type definition popup’ı gösterir

Debug araçları

Programlarınızdan veri görüntülemek için birden fazla DEBUG_ macro’su mevcuttur. Her macro, ilk argüman olarak bir label (string constant) alır.

  • DEBUG_NUM(label, num) - u32 veya ssize_t gibi herhangi bir sayı alabilir
  • DEBUG_STR(label, buf) - char[64] gibi sabit boyutlu bir buf gerektirir
  • DEBUG_STR_LEN(label, ptr, len) - herhangi bir pointer alabilir, len byte debug eder
  • DEBUG_STRUCT(label, struct) - herhangi bir struct’ı değer olarak alabilir

Geliştirici araçları

Bir programı çalıştırdığınızda sağdaki panel, kernel’in içinde tam olarak ne olduğunu inceleyebileceğiniz sekmelere dönüşür:

  • Events — programınızın yaydığı her şeyin sıralı, canlı akışı.
  • Bytecode — derlenmiş BPF komutları; her biri geldiği C satırına bağlıdır. Bir komutun üzerine gelin, aynı kaynak satırdan gelen tüm komutlar vurgulanır.
  • Complexity — komut, map ve döngü sayısının canlı ölçümü; verifier limitlerine göre gösterilir, böylece programınızın ne kadar ağır olduğunu görürsünüz.
  • Timeline — kernel verifier’ının raporu, adım adım gezilir; böylece bir reddi tek bir log yığını yerine daha okunaklı görürsünüz.
  • Maps — programınızın yazdığı hash/array/lru_hash map’lerinin içeriği; hex artı bir tamsayı/string görünümüyle çözümlenir.
  • Rate — programınızın zaman içinde ne sıklıkla tetiklendiğini gösteren histogram.
  • Flame — yakalanan kernel stack’lerinin flame graph’ı (yalnızca bpf_get_stackid() ile stack kaydeden programlar için).
  • Steps — yayılan event’ler arasında tek tek ileri/geri adımlayıp programınızın yaptıklarını yeniden oynatan bir kontrol.

Editörün kendisi de yazarken yardımcı olur:

  • SEC("...") içinde otomatik tamamlama, bu kernel’de gerçekten var olan tracepoint ve kprobe’ları önerir; böylece bir attach noktasını tahmin etmezsiniz.
  • Helper otomatik tamamlama, çağırabileceğiniz eBPF helper’larını sunar. Dikkat: bir helper yalnızca belirli program tiplerinde çalışır — bu platform tracepoint, kprobe ve XDP programları çalıştırır, bu yüzden orada geçerli olan helper’ları belgeler. Kernel’de toplam ~200 helper var, ama LSM, sysctl, socket veya cgroup gibi aileler başka program tiplerine aittir ve verifier bunları burada reddeder — bozuk değiller, sadece bu alıştırmaların kapsamı dışındalar.
  • Satır içi verifier hataları, bir çalıştırma reddedildiğinde yalnızca panelde değil, ilgili satırda kırmızı bir işaret olarak görünür.
  • Derleyici ipuçları, bir derleme veya verifier hatası bilinen bir nedene uyduğunda bir düzeltme önerir (eksik bir flag, bir sınır kontrolü, bir header).

Ve iki kolaylık daha:

  • Share, mevcut kodunuzu kodlayan bir bağlantı kopyalar; böylece baktığınız programın tam halini birine verebilirsiniz.
  • Hints, bir alıştırma sağladığında yardımı adım adım açar; böylece tüm cevabı bir anda görmeden takıldığınız yerden çıkarsınız.

Cevap gönderme

Alıştırmaları çözmek için cevaplarınızı doğrudan kodunuzdan, SUBMIT_NUM(answer), SUBMIT_STR(answer) veya SUBMIT_STR_LEN(answer, len) kullanarak göndermeniz gerekir.

eBPF programınız birden fazla event’te tetiklenir, bu yüzden SUBMIT_X çağrılarınızı korumanız gerekir, çünkü birden fazla gönderim tüm cevapları geçersiz kılar.

SUBMIT_STR kullanırken sondaki null byte’lar kırpılır, ancak sondaki gereksiz veriler kırpılmaz. Null termination garantisi olmadığında SUBMIT_STR_LEN varyantını kullanın.

Bu alıştırmayı, SUBMIT_STR("the answer"); satırının yorum işaretlerini kaldırarak çözün.

Çalıştırma event'lerini burada görmek için kodunu çalıştır