Metin2 Sunucu Sahiplerinin Kabusu: 'Core Veren' Hatalar ve Adım Adım Çözüm Yöntemleri
Eğer bir Metin2 sunucusu yönetiyorsanız, "core verdi", "server core dumped" veya sadece "core" gibi ifadeleri duymak kadar can sıkıcı çok az şey vardır. Bu hatalar, sunucunuzun aniden çökmesi ve genellikle arkasında ne olduğuna dair net bir syserr.txt kaydı bırakmaması anlamına gelir. Peki bu gizemli "core" dosyası nedir ve bu kabusu nasıl bir çözüme kavuşturabiliriz?Bu rehberde, yeni başlayanlar için bile anlaşılır bir dille, core hatasının ne olduğunu ve bu hatayı nasıl analiz edip çözebileceğinizi adım adım anlatacağız.
Core Dosyası Nedir? Bir Olay Yeri Raporu
Bir core dosyası, sunucu programınızın (game dosyası) çöktüğü andaki hafızasının bir "fotoğrafıdır". Tıpkı bir kaza sonrası olay yeri incelemesi gibi, bu dosya da çökme anında programın içinde neler olup bittiğine dair tüm kanıtları içerir. Hangi fonksiyonun çalıştığını, hangi değişkenlerin kullanıldığını ve en önemlisi, hatanın tam olarak nerede meydana geldiğini bu dosyayı inceleyerek bulabiliriz.Adım 1: Core Dosyasını Bulmak ve Hazırlanmak
Core dosyaları genellikle çöken game dosyasının bulunduğu klasörde oluşur. FreeBSD sunucularda bu genellikle /usr/game/g1/ veya /usr/game/share/ gibi bir dizindir.- g1.core, auth.core veya db.core gibi isimlerle karşılaşabilirsiniz.
- Çok Önemli: Analiz yapabilmek için, bu core dosyasını oluşturan game dosyasının debug sembolleri içeren bir versiyonuna ihtiyacınız var. Eğer dosyalarınızı derlerken -g parametresini kullanmadıysanız, elde edeceğiniz bilgiler anlamsız olacaktır. Genellikle "game_debug" veya "game.dbg" adıyla bu dosya elinizde bulunur.
Adım 2: Olay Yeri İncelemesi - GDB ile Core Analizi
FreeBSD'nin standart hata ayıklama aracı olan gdb (GNU Debugger) ile core dosyasını analiz edeceğiz. Sunucunuza SSH ile bağlandıktan sonra aşağıdaki komutu girin:Bash:
gdb /usr/game/g1/game_debug /usr/game/g1/g1.core
Not: Yukarıdaki yolları kendi sunucunuzdaki game_debug ve core dosyasının konumuna göre değiştirmeyi unutmayın.Bu komutu girdiğinizde, gdb programı açılacak ve size bir komut satırı sunacaktır.
Adım 3: Suçluyu Bulmak - "Backtrace" Komutu
gdb açıldıktan sonra, en önemli komutu girme zamanı geldi. Bu komut, çökme anına yol açan fonksiyon çağrılarının bir listesini, yani "suçun izini" bize gösterecektir.Komut satırına şunu yazın ve Enter'a basın:
Bash:
bt
veya daha detaylı bir çıktı için:
Bash:
bt full
Karşınıza, en üstte hatanın oluştuğu an olmak üzere, aşağıya doğru giden bir fonksiyon listesi çıkacaktır. Bu listenin en üst sıralarındaki satırlar, hatanın kaynağını size söyleyecektir.
Örnek Bir Çıktı ve Yorumlama:
Kod:
#0 0x080a4b9c in CInputMain::Analyze (this=0xbfbfd5f0, d=0x83e2b40,
c_pData=0x96f6e01 "", uiBytes=4) at input_main.cpp:115
#1 0x081f9b3b in CInputProcessor::Process (this=0x83e2b40,
lpDesc=0x92f6d80, c_pData=0x96f6e00 "", iBytes=5,
piExtraBytes=0xbfbfd64c) at input.cpp:55
#2 0x08169d25 in CHARACTER::PointChange (this=0x94b4a00, a_pkChr=0x96d0e00,
a_points=100, a_bAmount=1 ' '
, a_bBroadcast=false) at char_point.cpp:150
...
Bu örnekte, hata char_point.cpp dosyasının 150. satırındaki PointChange fonksiyonunda meydana gelmiş. Bu bilgiyle, doğrudan kaynak kodunuzda o satıra giderek neyin yanlış olduğunu (örneğin, olmayan bir karaktere puan vermeye çalışmak gibi) analiz edebilir ve sorunu çözebilirsiniz.
En Sık Karşılaşılan Core Sebepleri
- Null Pointer: Olmayan veya silinmiş bir nesneye (karakter, item, NPC) erişmeye çalışmak. bt çıktısında genellikle -> operatörünün kullanıldığı satırlarda görünür.
- Eksik veya Hatalı Database Sorguları: Database'den çekilen bir verinin eksik olması ve kodun bu durumu kontrol etmemesi.
- Yanlış Fonksiyon Parametreleri: Bir fonksiyona beklemediği türde veya sayıda parametre göndermek.
- Hatalı Quest Fonksiyonları: Lua tarafından C++ tarafına gönderilen hatalı veriler.



