Öncelikle Merhabalar EgeÖzdemirden Alıntıdır EgeÖzdemirin Paylaştığı İle Bire Bir Kod Ve Eksiklik Yoktur Diğer Konularda Eksik Olan Kodlarda Vardır Bende Toparlayıp Paylaşmak İstedim Yanlış Anlamayın Benim Konum Değil Sadece İnsanların Yararına Paylaşıyorum Yöneticiler Her Hangi Bir Sorunda Kapatabilir Neyse Konuya Geçelim.
Şimdi 3 Tür Farklı Ch Kapanma Nedenleri Olabilir.
1= Game Taraflı
2= Sunucu Taraflı
3= ServerSide
Tabi bu 4-5 diye'de çıkabilir öncelikle ilk ch düştüğü zaman ne yapmamız gerek?
MySQL bootlog tablosunu açalım ch'nin düştüğü saat'e bakalım,baktıktan sonra
Syserr ve syslog'u açayım bunların içine girip en son yapılan işlem ne? eğer game taraflı ch düştüyse <shutdown> tarzında bir yazı olacaktır.
Game kaynak dosyasını yazan kişiler (YMİR) zaten güvenlik amacıyla "thecore_shutdown();" böyle bir fonksiyon oluşturmuş, yani siz mesela item_proto.sql'den bir itemi sildiniz ama bu ayritten mob_drop_item.txt'de var güvenlik amacıyla serverin çökmeme amacıyla "thecore_shutdown();" komudunu verdiriyor ve CH hiç açılmadan otomatik kapatıyor sistem.
Örnek fonksiyon ;
Kod:
if (decode_2bytes(data) != sizeof(TItemTable)) { sys_err("item table size error"); thecore_shutdown(); return; }
Bu tür taraflı ch kapanmalarında veya açılmadığı zaman hangi ch açılmıyorsa hemen oranın syserr ve syslog dosyalarına girin orada ne olduğu yazar.
CH ayritten saldırılardan dolayıda kapanabilir botnet saldırısı ddos attack gibi sürekli CH portuna paket gönderir ve o port iptal olur vefaf haline gelir Güzel yazılımsal bir firewall yazın CH portlarına 15 limit koyun ve 15 paket gönderdikten sonra karşı taraf bir daha paket gönderemesin.
Ve en büyük sorunumuz "game.core"
Game.core problemi birden bire ch'nin düşmesi ve bazen syserr-syslog hatta bootlog'a bile chnin düştüğünü yazmama problemidir.Aslında bu bir ch düşme sorunu değil direk o CH'nin çökmesi anlamına gelir, bu sorun herşeyden olabilir Game taraflı , quest taraflı , item_proto taraflı hatta hatırlarmısınız bilmem eski fileslerde Kafasız Savaşçı adlı bir boss mu slot mu artık neyse o vardı onu kesincede game.core veriyordu tabi o zaman syserr'e büyük ihtimal yazıyordur KILL:NPC kod vs diye ama 40K'ya geçmemle birlikte game.core veriyor ve hiçbir şekilde ne syserr ne syslog tutuyordu.
Ben kendi kendi game dosyamı (kendi dediğim mainline editlediğim dosyamı olacaktı ) FreeBSD 9.2'de compile ediyordum ama oyun sunucusu için yani serverimde FREEBSD 10.1 kullanıyordum ve game.core vermeye başladı bende syserr syslog göremeyince GDB ile game.core'yi debugger etmeye çalıştım.
Ama malesef FreeBSD 9.2'de compile ettiğim ve 10.1 kullandığım için debugger edemedim şu hatayı aldım;
Kod:
"/usr/game/cores/channel1/egegame.core" is not a core dump: File format is ambiguous
Farkettim ki hangi BSD versiyonunda compile ettiyseniz sadece onla debugger edebilirsiniz yani ben 9.2'ye geçiş yaptım.
Ve bundan sonrada ch düşmesi yaşamadım büyük ihtimal sunucu taraflıydı bir lib herhangibi bir versiyon bilmiyorum bu olay çok kapsamlı birşey ama eğer ki siz aynı Versiyonda compile edp çalıştırdığınız halde ch düşüyorsa yani game.core alıyorsanız.
FreeBSD'ye GDB yükleyin kurulum ;
Kod:
cd /usr/ports/devel/gdb/ && make install clean
Yükleme işlemi bittikten sonra eğer game.core verirse şu kodlarla açaçağız;
Kod:
gdb cd /usr/game/cores/channel1 (Ben burada channel1 yaptım sizin hangi ch'niz düştüyse onu yazın.) game game.core core game.core bt quit
Makale daha önce zannetmiyorum ki kimse tarafından paylaşıldı ilk olsun dedim Türk forumları her anlamda gelişmeli.
CH Düşmesine sebeb olacak belirli nedenler; (Önerim : FreeBSD 9.2 Kullanın.)
Kod:
HACK_DETECD CHECK POINT /WAR -777777777 /DICE -777777777 KAFASIZ SAVAŞÇI TİMER TRİGGER QUEST TİMER İLE SÜREKLİ MYSQL_QUERY FONKSİYONU
Debugger edilmiş bazı game.core dosyaları ;
1 =
Kod:
#0 0x08156079 in CItem::GetValue (this=0x3adb0f00, idx=0) at item.cpp:957 957 long CItem::GetValue(DWORD idx) [New Thread 29005500 (LWP 100508/game)] [New Thread 29005200 (LWP 100503/game)] [New Thread 29004f00 (LWP 100502/game)] [New Thread 29004300 (LWP 100883/game)] (gdb) bt #0 0x08156079 in CItem::GetValue (this=0x3adb0f00, idx=0) at item.cpp:957 #1 0x081b123c in quest::item_has_flag (L=0x3af9bdc0) at questlua_item.cpp:155 #2 0x08363cba in luaD_precall (L=0x3af9bdc0, func=0x3b1cedd8) at ldo.c:249 #3 0x0836ba86 in luaV_execute (L=0x3af9bdc0) at lvm.c:637 #4 0x08363fad in resume (L=0x3af9bdc0, ud=0xffffa164) at ldo.c:337 #5 0x0836393b in luaD_protectedparser (L=0x3af9bdc0, z=0x8363f80, bin=-24220) at ldo.c:462 #6 0x08363adb in lua_resume (L=0x0, nargs=1) at ldo.c:378 #7 0x08198952 in quest::CQuestManager::RunState (this=0xffffd940, qs=@0x3a3982a4) at questlua.cpp:846 #8 0x081cebdf in quest::CQuestManager::Input (this=0xffffd940, pc=99118, msg=0xffffa1fb "1") at questmanager.cpp:220 #9 0x08148f0f in CInputMain::QuestInputString (this=0x3a19d89c, ch=0x309fb800, c_pData=0x3a753006) at input_main.cpp:1963 #10 0x0814f778 in CInputMain::Analyze (this=0x3a19d89c, d=0x3a19d800, bHeader=<value optimized out>, c_pData=0x3a753006 "\0361") at input_main.cpp:3166 #11 0x0813844b in CInputProcessor::Process (this=0x3a19d89c, lpDesc=0x3a19d800, c_pvOrig=0x3a753000, iBytes=90, r_iBytesProceed=@0xffffa734) at input.cpp:103 #12 0x08101933 in DESC::ProcessInput (this=0x3a19d800) at desc.cpp:313 #13 0x0825b3f4 in io_loop (fdw=0x29bd4840) at main.cpp:1012 #14 0x0825be51 in idle () at main.cpp:946 #15 0x0825d4ac in main (argc=1, argv=0xffffde08) at main.cpp:610
2 =
Kod:
#0 CHARACTER::GetName (this=0x30303631) at char.cpp:571 571 return m_stName.empty() ? (m_pkMobData ? m_pkMobData->m_table.sz LocaleName : "") : m_stName.c_str(); [New Thread 29005500 (LWP 100892/game)] [New Thread 29005200 (LWP 100885/game)] [New Thread 29004f00 (LWP 100884/game)] [New Thread 29004300 (LWP 100205/game)] (gdb) bt #0 CHARACTER::GetName (this=0x30303631) at char.cpp:571 #1 0x0815c31d in ITEM_MANAGER::SaveSingleItem (this=0xffffa844, item=0x3cb85c00) at item_manager.cpp:453 #2 0x0815e3f4 in ITEM_MANAGER::Update (this=0xffffa844) at item_manager.cpp:484 #3 0x0825aec3 in heartbeat (ht=0x297d0bb0, pulse=863981) at main.cpp:330 #4 0x0825b04f in idle () at main.cpp:929 #5 0x0825c70c in main (argc=1, argv=0xffffde08) at main.cpp:602
Not: EgeÖzdemirden Alıntıdır.
Bir Teşekkürü Çok Görmeyin
İyi Forumlar
Metin2 Lobby: C++ - BSD CH Düşmesiyle Alakalı (GDB) Game-Core Fixed
Merhaba Metin2 geliştirici arkadaşlar,
Bugünkü makalemizde C++ tabanlı Metin2 özel sunucularında karşılaşılan ve genellikle BSD (Berkeley Software Distribution) tabanlı sistemlerde görülen CH düşmesi sorununa odaklanacağız. Bu sorun özellikle Game-Core üzerinde çalışırken, hata ayıklama sürecinde GDB (GNU Debugger) kullanıldığında daha belirgin hale gelmektedir. Bu yazıda, bu hatayı anlamak, teşhis etmek ve kalıcı olarak düzeltmek üzerine kapsamlı bir rehber sunacağız.
CH Düşmesi Nedir?
CH düşmesi, Metin2 özel sunucularında core dosyasının çökmesiyle oluşan bir durumdur. Genellikle game veya auth servisinin beklenmedik şekilde sonlanmasıyla sonuçlanır. Özellikle C++ ile yazılmış sistemlerde, bellek yönetimi, thread kullanımı ve sistem çağrıları gibi konularda oluşabilecek hatalar bu tip çökmeleri tetikleyebilir. BSD tabanlı sistemlerde bu hata, farklı derleyici sürümleri, sistem kütüphaneleri veya kernel seviyesindeki farklılıklar nedeniyle daha sık görülür.
Hatanın Belirtileri
CH düşmesi sırasında aşağıdaki belirtiler görülebilir:
- Game veya Auth servisi beklenmedik şekilde sonlanır.
- Sistem loglarında segmentation fault veya core dumped gibi mesajlar gözlemlenir.
- GDB üzerinden debug yapıldığında, stack trace içinde NULL pointer dereference gibi hatalar görülür.
- Sunucu belirli bir süre sonra rastgele şekilde çöker.
Nedenleri ve Teşhis Yöntemleri
Bu hatanın kök nedenleri genellikle şunlardır:
1. Bellek Sızıntısı veya Geçersiz Bellek Erişimi: C++ dilinde dinamik bellek yönetimi hatası, pointer hataları veya serbest bırakılmış bir belleğe erişim gibi durumlar çökmeye neden olabilir.
2. Thread Güvenliği Sorunları: Game-Core içinde eşzamanlı işlemler yapılırken, senkronizasyon eksikliği veya mutex hataları da çökmelere yol açabilir.
3. Sistem Uyumsuzlukları: BSD tabanlı sistemlerde, Linux ile uyumlu olmayan sistem çağrıları veya kütüphane versiyon farklılıkları da etkili olabilir.
Teşhis için şu adımlar önerilir:
- GDB kullanarak core dump dosyasını analiz edin.
- Valgrind gibi araçlarla bellek sızıntısını kontrol edin.
- Log seviyesini artırarak hangi fonksiyonda çökme olduğunu tespit edin.
Fix: Game-Core İçin Kalıcı Çözüm
Sunucunuzda CH düşmesini engellemek için aşağıdaki adımları takip edebilirsiniz:
1. Pointer Kontrolleri: Kodunuzda her pointer erişiminden önce NULL kontrolü yapın. Özellikle silinen objelere erişimlerde bu çok önemlidir.
2. Mutex Kullanımı: Çoklu thread işlemleri için mutex kilitleme mekanizmalarını doğru kullanın.
3. Derleme Ayarları: GCC veya Clang derleyicilerinde -O2 veya -O3 optimizasyon seviyelerini kullanın. Hata ayıklama için -g flag’i ile derleyin.
4. Core Dump Ayarları:[/BR][/BR]Sistem seviyesinde core dump oluşması için şu komutu çalıştırın:
Kod:
ulimit -c unlimited
Bu sayede, her çökmede core dosyası oluşturulur ve GDB ile analiz edilebilir.
Örnek GDB Komutları
Kod:
gdb ./game core
Kod:
(gdb) bt
Kod:
(gdb) info registers
Kod:
(gdb) list
Sonuç
Metin2 özel sunucularında CH düşmesi, özellikle BSD sistemlerde sıkça karşılaşılan ve debug etmesi zor bir problemdir. Ancak doğru analiz ve kod düzenlemeleriyle bu sorun kalıcı olarak çözülebilir. Metin2Lobby.com olarak siz geliştiriciler için bu gibi sorunlara yönelik detaylı rehberler hazırlamaya devam edeceğiz. Daha fazla C++, Python, Game-Core, Auth, DB ve PvP sistemleri ile ilgili içerikleri takip etmeyi unutmayın.
Kaynaklar ve Daha Fazlası:
Metin2Lobby - Metin2 Geliştirici Portalı
Metin2 Lobby: C++ - BSD CH Crash Related (GDB) Game-Core Fixed
Hello Metin2 developer friends,
In today's article, we'll focus on a problem encountered in C++ based Metin2 private servers, commonly seen on BSD (Berkeley Software Distribution) systems: CH crash. This issue becomes more apparent during debugging with GDB (GNU Debugger). In this article, we'll provide a comprehensive guide on understanding, diagnosing, and permanently fixing this error.
What Is CH Crash?
CH crash refers to a crash caused by the core file failure in Metin2 private servers. It usually results in unexpected termination of game or auth services. In C++ based systems, errors related to memory management, thread usage, and system calls can trigger such crashes. On BSD based systems, this issue may occur more frequently due to differences in compiler versions, system libraries, or kernel-level variations.
Symptoms of the Error
The following symptoms may appear during a CH crash:
- Game or Auth service terminates unexpectedly.
- Messages like segmentation fault or core dumped are observed in system logs.
- When debugging with GDB, errors such as NULL pointer dereference may be visible in the stack trace.
- The server crashes randomly after a certain period.
Causes and Diagnosis Methods[/BR][/BR]The root causes of this error typically include:
1. Memory Leak or Invalid Memory Access: Dynamic memory management errors in C++, pointer errors, or accessing freed memory can lead to crashes.
2. Thread Safety Issues: During concurrent operations within Game-Core, lack of synchronization or mutex errors can cause crashes.
3. System Incompatibilities: On BSD based systems, system calls or library version mismatches that are incompatible with Linux may also contribute.
Recommended diagnosis steps:
- Analyze the core dump file using GDB.
- Check for memory leaks using tools like Valgrind.
- Increase log level to detect which function causes the crash.
Fix: Permanent Solution for Game-Core
To prevent CH crashes on your server, follow these steps:
1. Pointer Checks: Perform NULL checks before every pointer access in your code. This is especially important when accessing deleted objects.
2. Mutex Usage: Properly use mutex locking mechanisms for multi-threaded operations.
3. Compilation Settings: Use -O2 or -O3 optimization levels in GCC or Clang compilers. Compile with -g flag for debugging.
4. Core Dump Settings:[/BR][/BR]Run the following command at system level to enable core dump generation:
Kod:
ulimit -c unlimited
This way, a core file will be created upon each crash and can be analyzed with GDB.
Sample GDB Commands
Kod:
gdb ./game core
Kod:
(gdb) bt
Kod:
(gdb) info registers
Kod:
(gdb) list
Conclusion
CH crash in Metin2 private servers is a common and difficult-to-debug issue, especially on BSD systems. However, with proper analysis and code adjustments, this issue can be resolved permanently. At Metin2Lobby.com, we continue to prepare detailed guides addressing such issues for developers like you. Don't forget to follow more content regarding C++, Python, Game-Core, Auth, DB, and PvP systems.
Resources and More:
Metin2Lobby - Metin2 Developer Portal
