Bir Metin2 sunucusu işletiyorsan, er ya da geç metin2 syserr dosyalarını okumak zorunda kalırsın. Core çöktüğünde, bir quest çalışmadığında ya da oyuncular "ışınlanınca düşüyorum" dediğinde cevap neredeyse her zaman bu log satırlarının içinde gizlidir. Sorun şu ki, çoğu kişi syserr'i açıp paniğe kapılır ve rastgele dosya değiştirmeye başlar. Oysa bu loglar belirli bir mantıkla yazılır; o mantığı bir kez kavradığında, hatanın kaynağını dakikalar içinde bulabilirsin.
Syserr, syslog ve diğer log dosyaları
Metin2 server tarafında her core ve veritabanı süreci kendi log dosyalarını üretir. Bunları karıştırmamak için önce ne işe yaradıklarını netleştirelim:
- syserr — Asıl odak noktan. C++ tarafındaki hatalar, quest derleme/çalıştırma hataları, eksik proto kayıtları ve çökme anındaki son uyarılar buraya düşer.
- syslog — Normal akış: oyuncu giriş/çıkışları, kanal başlangıçları, periyodik bilgi mesajları. Çökmenin ne zaman olduğunu syslog'un kesildiği yerden anlarsın.
- db tarafındaki log — DB core'unun (auth/db) syserr'i; SQL sorgu hataları ve player kaydetme sorunları burada görünür.
Her core'un kendi klasörü olur (genelde channel1/core1, core2 gibi). Hangi kanalda sorun olduğunu bilmek için doğru klasördeki dosyaya bakmalısın. Çökmeyi anlık yakalamak istiyorsan klasik yöntem:
tail -f channel1/core1/syserr
grep -i "error" syserr | tail -n 50
Bir syserr satırının anatomisi
Tipik bir satır şuna benzer:
SYSERR: Jun 27 21:14:03 :: pcg::Boot: cannot find proto file Data/object_proto
Bunu parçalara ayıralım. Baştaki SYSERR: etiketi satırın bir hata olduğunu söyler. Ardından tarih ve saat gelir — bunu mutlaka syslog'la ve oyuncuların çökme saatiyle karşılaştır. Sonra :: ile ayrılmış kaynak gösterimi vardır: çoğu zaman FonksiyonAdı: veya SınıfAdı::Metot biçiminde. Son kısım ise asıl mesaj: "cannot find", "null pointer", "no such", "syntax error" gibi. Okurken sırala: ne zaman → nerede → ne. Bu üçlüyü ayırdığında, hatanın hangi sistemden geldiğini (item, quest, network, DB) hızlıca daraltırsın.
En sık karşılaşılan hata kalıpları
Yıllar içinde syserr'de tekrar tekrar gördüğün birkaç kalıp vardır. Birkaçını ve gerçek nedenini sıralayalım:
- QUEST hataları —
QUEST ... attempt to index a nil valueya daattempt to call a nil value. Bu, quest içinde tanımsız bir değişkene veya fonksiyona eriştiğin anlamına gelir. Genelde yanlış yazılmış birpc./npc.fonksiyonu ya da silinmiş bir global yüzünden olur. - QUEST compile error —
LoadStateUserData ... errorveya quest_compile çıktısında syntax hatası. Lua dosyasında eksikend, kapanmayanwhenbloğu ya da yanlış kapanmış string vardır. - Proto/eksik kayıt —
cannot find item ...veyaVID ... mob proto not exist. Item veya mob proto ile DB arasında uyumsuzluk vardır; eklediğin yeni vnum bir tarafta eksiktir. - SQL hataları — DB syserr'inde
AsyncSQL ... Unknown columnya daDuplicate entry. Tablo yapısı ile core'un beklediği şema uyuşmuyordur. - Çökme imzaları —
SEGV,signal 11ya da satırın aniden kesilmesi. Bu, null pointer ya da bozuk veri yapısına erişimdir.
Çökme anını yakalamak
Çökmelerde tek bir satıra takılı kalma. Önemli olan çökmeden hemen önceki son birkaç satırdır. Süreç ölmeden önce ne yapıyordu? Bir mob mu spawn ediyordu, bir quest mi yüklüyordu, bir oyuncu mu giriş yapıyordu? Çoğu zaman çökmeyi tetikleyen işlem, son SYSERR satırında ya da hemen üstündeki uyarıda gizlidir.
Pratikte yaptığım şey şudur: çökme zamanını syslog'dan al, sonra aynı dakikadaki syserr satırlarını süz:
grep "Jun 27 21:14" syserr
tail -n 100 syserr
Eğer core gerçekten SEGV ile düşüyorsa ve sebep belirsizse, bir core dump üretilmiş olabilir. ulimit -c unlimited ayarlıysa, çökme klasöründe core.PID dosyası oluşur ve gdb ile backtrace alabilirsin:
gdb ./game core.12345
bt full
Backtrace, çökmenin tam olarak hangi C++ fonksiyonunda olduğunu gösterir — syserr'in tek başına söyleyemediği şeyi.
Kaynağa inerken izlenecek yol
Bir hata mesajını gördüğünde panikle dosya değiştirmek yerine şu sırayı izle:
- Mesajı aynen ara. SYSERR metnindeki ayırt edici kelimeleri (vnum, fonksiyon adı, tablo adı) quest dosyalarında ve config'de
grep -rnile ara. - Son değişikliği düşün. Hata yeni mi başladı? O zaman en son ne eklediysen (yeni item, yeni quest, yeni mob) oraya bak. Syserr'ler çoğunlukla "yeni eklenen şey eksik tanımlandı" der.
- İzole et. Şüpheli questi geçici olarak devre dışı bırak, core'u yeniden başlat, syserr'in temizlenip temizlenmediğine bak.
- Tek değişiklik, tek test. Aynı anda beş dosya değiştirirsen, hangisinin düzelttiğini asla bilemezsin.
Bu disiplin, "şansa düzeltme"yi "yöntemle düzeltme"ye çevirir. Metin2 server bakımında en değerli beceri budur.
Logları temiz tutmak
Sağlıklı bir sunucuda syserr sessizdir. Her gün büyüyen, tekrarlayan uyarılarla dolu bir syserr, gerçek bir hatayı gizleyen gürültüdür. Tekrarlayan ama zararsız uyarıları kaynağında düzelt; çünkü gerçek çökme geldiğinde, onu binlerce gürültü satırı arasında kaybetmek istemezsin. Düzenli olarak eski logları arşivle veya döndür (logrotate), böylece dosyalar yönetilebilir kalır ve grep hızlı çalışır.
Sık Sorulan Sorular
Syserr boş ama oyun çöküyor, ne yapmalıyım?
Bu genelde sürecin yazma fırsatı bulamadan aniden öldüğünü gösterir (sert SEGV). Önce doğru kanalın/core'un klasörüne baktığından emin ol, sonra ulimit -c unlimited ile core dump'ı etkinleştirip gdb backtrace al. Sistem seviyesinde dmesg çıktısı da out-of-memory veya segfault kaydı gösterebilir.
QUEST nil value hatasını nasıl bulurum?
Mesaj genelde quest adını veya satır numarasını içerir. O questi aç, belirtilen satırda hangi değişken/fonksiyonun çağrıldığına bak; büyük ihtimalle yanlış yazılmış bir fonksiyon adı veya tanımlanmamış bir global vardır. Questi yeniden derleyip core'u restart etmeyi unutma.
Aynı hata satırı saniyede yüzlerce kez yazılıyor?
Bir döngü içindeki kalıcı bir hatadır — örneğin sürekli spawn olan bozuk bir mob ya da her tick'te çağrılan hatalı bir timer quest. Önce tetikleyiciyi (mob/quest) devre dışı bırak ki log şişmesin, sonra kök nedeni sakince düzelt.
Syserr okumak, tahmin etmeyi bırakıp kanıta bakmaktır. Karmaşık bir çökme, takılan bir core ya da çözemediğin bir quest hatasıyla uğraşıyorsan, logları birlikte inceleyip kaynağına inebiliriz — benimle iletişime geç.