- Katılım
- 6 Mayıs 2022
- Konular
- 48,291
- Mesajlar
- 48,601
- Tepkime puanı
- 75
- M2 Yaşı
- 3 yıl 11 ay 10 gün
- Trophy Puan
- 48
- M2 Yang
- 488,879
Öncelikle selamlar,
Şimdi 3 tür farklı ch kapanma nedeni olabilir.
1= game taraflı.
2= sunucu taraflı.
3= serverside taraflı.
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 ;
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;
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 ;
Yükleme işlemi bittikten sonra eğer game.core verirse şu kodlarla açaçağız;
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.)
Debugger edilmiş bazı game.core dosyaları ;
1 =
2 =
Metin2 Oyun Sunucusu Geliştirme Serisi
CH Düşmesi Hatalarında GDB Kullanımı
Metin2 özel sunucularında (private server) karşılaşılan en yaygın sorunlardan biri CH düşmeleridir. Bu hatalar genellikle C++ tabanlı Game Core dosyalarında meydana gelen bellek hataları, pointer sorunları ya da eksik kontrol yapıları sonucunda ortaya çıkar. Bu gibi durumlarda debug etmek için GDB (GNU Debugger) oldukça faydalı bir araçtır.
CH Düşmesinin Nedenleri
CH düşmesi genellikle segmentation fault (SIGSEGV) hatasıyla sonuçlanır. Bu durumda sunucu aniden çöker ve loglarda belirgin bir neden görülmezse GDB kullanarak hatayı adım adım takip etmek gerekir. En sık karşılaşılan nedenler şunlardır:
- NULL pointer erişimi
- Bellek sızıntısı
- Eksik veya yanlış mutex kullanımı
- Thread senkronizasyon problemleri
GDB ile Debug Süreci
GDB, GNU/Linux sistemlerde çalışan C/C++ uygulamalarının debug edilmesini sağlayan güçlü bir araçtır. Metin2 game sunucusunu debug etmek için aşağıdaki adımları takip edebilirsiniz:
1. Sunucuyu GDB ile başlatma
2. Hata oluştuğunda backtrace almak
3. Hataya neden olan fonksiyonu incelemek
4. Değişken değerlerini kontrol etmek
Olası Çözümler
CH düşmesine neden olan hatalar genellikle pointer ve bellek yönetimi ile ilgilidir. Aşağıdaki kontrolleri yapmanız önerilir:
- Null pointer kontrolleri yapın
- Mutex kilitleme ve açma işlemlerini dengeleyin
- Threadler arası veri paylaşımında volatile ve atomic kullanın
- Bellek tahsis ettikten sonra serbest bırakmayı unutmayın
Örnek Kod Hatası
Yukarıdaki örnekte, GetDesc() fonksiyonunun NULL döndürme ihtimali vardır. Bu durumda Packet fonksiyonuna NULL pointer üzerinden erişim olur ve CH düşmesine neden olur.
Sonuç
CH düşmeleri Metin2 özel sunucularında ciddi zaman kaybına neden olabilir. Ancak GDB gibi araçlarla bu hataları adım adım takip ederek kök nedeni bulmak mümkündür. Özellikle C++ tabanlı game core üzerinde çalışırken bu tür debugging becerileri geliştiriciler için kritik öneme sahiptir.
Kaynak: Metin2 Lobby
Metin2 Server Development Series
Using GDB for CH Crashes
One of the most common issues encountered in Metin2 private servers is CH crashes. These errors typically arise from memory faults, pointer problems, or missing checks within the C++ based Game Core files. In such cases, GDB (GNU Debugger) is a very helpful tool for debugging.
Causes of CH Crashes
CH crashes usually result in a segmentation fault (SIGSEGV). When the server crashes suddenly and there isn't a clear cause visible in logs, it's necessary to use GDB to trace the error step by step. Most frequent causes are:
- NULL pointer access
- Memory leaks
- Missing or incorrect mutex usage
- Thread synchronization issues
Debugging with GDB
GDB is a powerful tool for debugging C/C++ applications running on GNU/Linux systems. To debug a Metin2 game server, you can follow these steps:
1. Launching the server with GDB
2. Obtaining a backtrace when a crash occurs
3. Inspecting the function causing the error
4. Checking variable values
Possible Solutions
CH crashes are often related to pointer and memory management issues. It is recommended to perform the following checks:
- Check for null pointers
- Balance mutex lock/unlock operations
- Use volatile and atomic when sharing data between threads
- Don't forget to free allocated memory
Example Code Issue
In the above example, the GetDesc() function may return NULL. This would lead to accessing Packet through a NULL pointer, causing a CH crash.
Conclusion
CH crashes can cause significant time loss in Metin2 private servers. However, tools like GDB allow tracking down the root cause step by step. Especially when working with C++ based game cores, such debugging skills are critical for developers.
Source: Metin2 Lobby
Şimdi 3 tür farklı ch kapanma nedeni olabilir.
1= game taraflı.
2= sunucu taraflı.
3= serverside taraflı.
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
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ı
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.) file game core game.core bt (Daha detaylı görüntülemek için bt full yazabilirsiniz.) 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
Metin2 Oyun Sunucusu Geliştirme Serisi
CH Düşmesi Hatalarında GDB Kullanımı
Metin2 özel sunucularında (private server) karşılaşılan en yaygın sorunlardan biri CH düşmeleridir. Bu hatalar genellikle C++ tabanlı Game Core dosyalarında meydana gelen bellek hataları, pointer sorunları ya da eksik kontrol yapıları sonucunda ortaya çıkar. Bu gibi durumlarda debug etmek için GDB (GNU Debugger) oldukça faydalı bir araçtır.
CH Düşmesinin Nedenleri
CH düşmesi genellikle segmentation fault (SIGSEGV) hatasıyla sonuçlanır. Bu durumda sunucu aniden çöker ve loglarda belirgin bir neden görülmezse GDB kullanarak hatayı adım adım takip etmek gerekir. En sık karşılaşılan nedenler şunlardır:
- NULL pointer erişimi
- Bellek sızıntısı
- Eksik veya yanlış mutex kullanımı
- Thread senkronizasyon problemleri
GDB ile Debug Süreci
GDB, GNU/Linux sistemlerde çalışan C/C++ uygulamalarının debug edilmesini sağlayan güçlü bir araçtır. Metin2 game sunucusunu debug etmek için aşağıdaki adımları takip edebilirsiniz:
1. Sunucuyu GDB ile başlatma
Kod:
gdb ./game[BR][/BR](gdb) run --config /path/to/config.txt[BR][/BR]
2. Hata oluştuğunda backtrace almak
Kod:
(gdb) bt[BR][/BR]
3. Hataya neden olan fonksiyonu incelemek
Kod:
(gdb) frame 5[BR][/BR]
4. Değişken değerlerini kontrol etmek
Kod:
(gdb) print variable_name[BR][/BR]
Olası Çözümler
CH düşmesine neden olan hatalar genellikle pointer ve bellek yönetimi ile ilgilidir. Aşağıdaki kontrolleri yapmanız önerilir:
- Null pointer kontrolleri yapın
- Mutex kilitleme ve açma işlemlerini dengeleyin
- Threadler arası veri paylaşımında volatile ve atomic kullanın
- Bellek tahsis ettikten sonra serbest bırakmayı unutmayın
Örnek Kod Hatası
Kod:
LPCHARACTER ch = CHARACTER_MANAGER::instance().FindPC(pc_name);[BR][/BR]if (!ch)[BR][/BR] return false;[BR][/BR][BR][/BR]ch->GetDesc()->Packet(data, len); // Burada ch->GetDesc() NULL olabilir[BR][/BR]
Yukarıdaki örnekte, GetDesc() fonksiyonunun NULL döndürme ihtimali vardır. Bu durumda Packet fonksiyonuna NULL pointer üzerinden erişim olur ve CH düşmesine neden olur.
Sonuç
CH düşmeleri Metin2 özel sunucularında ciddi zaman kaybına neden olabilir. Ancak GDB gibi araçlarla bu hataları adım adım takip ederek kök nedeni bulmak mümkündür. Özellikle C++ tabanlı game core üzerinde çalışırken bu tür debugging becerileri geliştiriciler için kritik öneme sahiptir.
Kaynak: Metin2 Lobby
Metin2 Server Development Series
Using GDB for CH Crashes
One of the most common issues encountered in Metin2 private servers is CH crashes. These errors typically arise from memory faults, pointer problems, or missing checks within the C++ based Game Core files. In such cases, GDB (GNU Debugger) is a very helpful tool for debugging.
Causes of CH Crashes
CH crashes usually result in a segmentation fault (SIGSEGV). When the server crashes suddenly and there isn't a clear cause visible in logs, it's necessary to use GDB to trace the error step by step. Most frequent causes are:
- NULL pointer access
- Memory leaks
- Missing or incorrect mutex usage
- Thread synchronization issues
Debugging with GDB
GDB is a powerful tool for debugging C/C++ applications running on GNU/Linux systems. To debug a Metin2 game server, you can follow these steps:
1. Launching the server with GDB
Kod:
gdb ./game[BR][/BR](gdb) run --config /path/to/config.txt[BR][/BR]
2. Obtaining a backtrace when a crash occurs
Kod:
(gdb) bt[BR][/BR]
3. Inspecting the function causing the error
Kod:
(gdb) frame 5[BR][/BR]
4. Checking variable values
Kod:
(gdb) print variable_name[BR][/BR]
Possible Solutions
CH crashes are often related to pointer and memory management issues. It is recommended to perform the following checks:
- Check for null pointers
- Balance mutex lock/unlock operations
- Use volatile and atomic when sharing data between threads
- Don't forget to free allocated memory
Example Code Issue
Kod:
LPCHARACTER ch = CHARACTER_MANAGER::instance().FindPC(pc_name);[BR][/BR]if (!ch)[BR][/BR] return false;[BR][/BR][BR][/BR]ch->GetDesc()->Packet(data, len); // Here, ch->GetDesc() might be NULL[BR][/BR]
In the above example, the GetDesc() function may return NULL. This would lead to accessing Packet through a NULL pointer, causing a CH crash.
Conclusion
CH crashes can cause significant time loss in Metin2 private servers. However, tools like GDB allow tracking down the root cause step by step. Especially when working with C++ based game cores, such debugging skills are critical for developers.
Source: Metin2 Lobby
