Arkadaşlar iyi forumlar. Karakterlerden yere atılan itemin kaybolma süresini configden çekme olayını anlatacağım.
Forumda konuyla ilgili 1-2 paylaşım gördüm fakat sanırım eksik ya da yanlış olduğundan kendi serverımda işe yaramamıştı.
Daha ayrıntılı şekilde bir çözüm buldum ve paylaşmak istedim. Umarım işinize yarar.
ADIM 1:
game/src/config.cpp açın ve int gPlayerMaxLevel kodunu aratıp hemen bir alt satırına şunu ekleyin: long int itemkaybolmasuresi = 0;
Devamında: Yine config.cpp içinden TOKEN("max_level") kodunu aratın ve kod bloğunun altına şu satırları ekleyin;
ADIM 2:
game/src/config.h dosyasını açın ve extern int gPlayerMaxLevel; kodunu aratıp bir alt satırına extern long int itemkaybolmasuresi; kodunu ekleyin.
ADIM3:
game/src/char_item.cpp dosyasını açın ve pkItemToDrop->StartDestroyEvent kodunu aratın. Sizde bu kodun sonunda parantez içinde farklı bir kod veya sayı olabilir.
pkItemToDrop->StartDestroyEvent(10) gibi.
Onu şu şekilde değiştirin: pkItemToDrop->StartDestroyEvent(itemkaybolmasuresi);
Buradan sonra srcyi build edin ve build sonrası gerekli işlemlerinizi halledin. Ardından aşağıdakileri uygulayın.
________________________________________
Son olarak channel1,channel2 vs. ve game99 içindeki CONFIG dosyalarını açıp hepsinin en alt satırına;
ITEM_KAYBOLMA_SURESI: 10
kodunu ekleyin. 10= saniye demektir.
İsteğinize göre değiştirebilirsiniz.
Ardından reboot atın ve işlem tamamdır.
GDB Breakpoint Kullanımı ve Compiler Versiyon Yükseltmesiyle Oluşan Yerden Toplama Sorununun Çözümü
Metin2 özel sunucularında geliştirme yaparken sıklıkla karşılaşılan sorunlardan birisi, derleyici versiyon değişikliklerinden sonra meydana gelen hata ayıklama (debugging) sorunlarıdır. Özellikle GDB (GNU Debugger) kullanırken, breakpoint koyulmasına rağmen bu breakpoint'lerin çalışmadığı ya da programın beklenmedik şekilde durduğu durumlarla karşılaşılabilir. Bu durum genellikle derleyici versiyon yükseltmeleri sonrasında ortaya çıkar. Bu yazıda, Metin2 geliştiricileri için bu sorunun neden oluştuğunu ve nasıl çözüleceğini detaylıca ele alacağız.
Compiler Versiyon Yükseltmesi Sonrası Beklenmeyen Davranışlar
Yeni compiler sürümleri, daha iyi optimizasyonlar sunsa da bazen debug sembollerini doğru şekilde üretmeme gibi problemlere yol açabilir. Özellikle GCC veya Clang gibi derleyicilerde yapılan yükseltmeler, debug sembolleri üzerinde etkili olabilir. Eğer debug sembolleri eksik veya hatalı derlenmişse, GDB breakpoint'leri doğru şekilde tanıyamaz.
GDB Breakpoint Koyma Teknikleri
Breakpoint koymak için farklı yollar kullanılabilir:
- Satır numarası bazlı breakpoint: break 120 komutuyla dosyanın 120. satırına breakpoint konabilir.
- Fonksiyon bazlı breakpoint: break function_name şeklinde fonksiyona breakpoint konabilir.
- Koşullu breakpoint: break 120 if variable == 5 gibi daha gelişmiş kontrol sağlar.
Ancak compiler yükseltmeleri sonrası bu komutların çoğu beklendiği gibi çalışmayabilir. Bunun temel nedenleri şunlardır:
1. Derleme sırasında -g flag'i eksik kalabilir. Bu flag debug sembollerini içerir.
2. -O2 veya daha yüksek optimizasyon seviyesi debug işlemini zorlaştırabilir.
3. Inline fonksiyonlar, stack frame’lerin doğru şekilde gösterilmesini engelleyebilir.
Sorunun Kök Nedeni Nedir?
Yeni compiler versiyonlarında varsayılan optimizasyon seviyeleri artabilir. Bu durumda bazı satırlar fiziksel olarak kodda yer değiştirebilir veya silinebilir. GDB, bu satırları artık tanıyamadığı için breakpoint çalışmaz. Ayrıca, bazı fonksiyonlar inline edildiği için breakpoint fonksiyon adıyla çalışmaz.
Çözüm Adımları
1. Derleme Ayarlarını Kontrol Edin: Debug modda derleme yaparken aşağıdaki flag'leri kullanın:
-g -O0 -fno-inline
Bu ayarlar, optimizasyonu kapatır ve inline fonksiyonları devre dışı bırakır.
2. Sembol Tablosunu Kontrol Edin: Aşağıdaki komutla binary dosyasının debug sembollerini kontrol edebilirsiniz:
objdump -t binary_name | grep -i 'func_name'
3. GDB İçinde Sembol Yükleme: Eğer semboller harici bir dosyada ise, GDB ile manuel olarak yükleyebilirsiniz:
symbol-file /path/to/symbols
4. CMake veya Makefile Ayarları: Build sistemlerinde debug yapılandırmasında gerekli flag'lerin aktif olduğundan emin olun. Örneğin CMakeLists.txt dosyasında:
set(CMAKE_BUILD_TYPE Debug)
Metin2 Geliştirme Ortamında Uygulama
Metin2 özel sunucularında, genellikle C++ tabanlı core sistemler kullanılır. Bu sistemlerde debug modda derleme yaparken, authserver, gameserver gibi bileşenler için ayrı ayrı kontrol yapılmalıdır. Özellikle game/src/ veya db/src/ dizinlerindeki kaynak kodlarda breakpoint koymak isteniyorsa, bu dizinlerin de debug sembolleriyle derlenmiş olması gerekir.
Sonuç
Compiler yükseltmeleri sonrası debug sürecinde yaşanılan breakpoint sorunları, genellikle derleme ayarlarının yeniden yapılandırılmasının ardından çözülebilir. Bu süreçte dikkat edilmesi gereken en önemli nokta, debug sembollerinin eksiksiz ve doğru şekilde derlenmiş olmasıdır. Metin2 geliştiricileri için bu tür teknik detaylar, server hatalarını hızlıca tespit etmede büyük kolaylık sağlar.
Using GDB Breakpoints and Solving Runtime Issues Caused by Compiler Version Upgrade
When developing private servers for Metin2, one frequently encountered issue is debugging problems that arise after compiler version changes. In particular, while using GDB (GNU Debugger), breakpoints may not work as expected or the program might behave unexpectedly. This situation usually occurs after upgrading the compiler. In this article, we will examine why this happens and how to solve it in detail for Metin2 developers.
Unexpected Behavior After Compiler Upgrades
Although newer compiler versions offer better optimizations, they can sometimes cause issues with correctly generating debug symbols. Especially upgrades to compilers like GCC or Clang may affect debug symbol generation. If debug symbols are missing or incorrectly compiled, GDB cannot recognize breakpoints properly.
Techniques for Setting GDB Breakpoints
There are several ways to set breakpoints:
- Line number-based breakpoint: Use break 120 to place a breakpoint at line 120 of the file.
- Function-based breakpoint: Use break function_name to place a breakpoint on a specific function.
- Conditional breakpoint: Use break 120 if variable == 5 for more advanced control.
However, after compiler upgrades, many of these commands may not work as expected. The main reasons for this are:
1. The -g flag may be missing during compilation. This flag includes debug symbols.
2. High optimization levels such as -O2 can complicate debugging processes.
3. Inline functions can prevent stack frames from being displayed correctly.
What Is the Root Cause of the Issue?
In newer compiler versions, default optimization levels may increase. In this case, certain lines may physically change places or be removed from the code. GDB may no longer recognize these lines, causing breakpoints to fail. Additionally, some functions may be inlined, preventing breakpoints from working by function name.
Solution Steps
1. Check Compilation Settings: When compiling in debug mode, use the following flags:
-g -O0 -fno-inline
These settings disable optimizations and inline functions.
2. Check Symbol Table: You can check debug symbols in the binary file with the command:
objdump -t binary_name | grep -i 'func_name'
3. Load Symbols Inside GDB: If symbols are located in an external file, you can load them manually into GDB:
symbol-file /path/to/symbols
4. CMake or Makefile Settings: Ensure required flags are active in debug configurations within build systems. For example, in CMakeLists.txt:
set(CMAKE_BUILD_TYPE Debug)
Application in Metin2 Development Environment
In Metin2 private servers, C++ based core systems are commonly used. When compiling in debug mode, components like authserver and gameserver must be individually checked. Especially when placing breakpoints in source code within directories like game/src/ or db/src/, it’s essential that these directories are also compiled with debug symbols.
Conclusion
Runtime breakpoint issues occurring after compiler upgrades can typically be resolved by reconfiguring compilation settings. The most important point to consider during this process is ensuring that debug symbols are fully and correctly compiled. For Metin2 developers, such technical details greatly assist in quickly identifying server errors.
Forumda konuyla ilgili 1-2 paylaşım gördüm fakat sanırım eksik ya da yanlış olduğundan kendi serverımda işe yaramamıştı.
Daha ayrıntılı şekilde bir çözüm buldum ve paylaşmak istedim. Umarım işinize yarar.
ADIM 1:
game/src/config.cpp açın ve int gPlayerMaxLevel kodunu aratıp hemen bir alt satırına şunu ekleyin: long int itemkaybolmasuresi = 0;
Devamında: Yine config.cpp içinden TOKEN("max_level") kodunu aratın ve kod bloğunun altına şu satırları ekleyin;
ADIM 2:
game/src/config.h dosyasını açın ve extern int gPlayerMaxLevel; kodunu aratıp bir alt satırına extern long int itemkaybolmasuresi; kodunu ekleyin.
ADIM3:
game/src/char_item.cpp dosyasını açın ve pkItemToDrop->StartDestroyEvent kodunu aratın. Sizde bu kodun sonunda parantez içinde farklı bir kod veya sayı olabilir.
pkItemToDrop->StartDestroyEvent(10) gibi.
Onu şu şekilde değiştirin: pkItemToDrop->StartDestroyEvent(itemkaybolmasuresi);
Buradan sonra srcyi build edin ve build sonrası gerekli işlemlerinizi halledin. Ardından aşağıdakileri uygulayın.
________________________________________
Son olarak channel1,channel2 vs. ve game99 içindeki CONFIG dosyalarını açıp hepsinin en alt satırına;
ITEM_KAYBOLMA_SURESI: 10
kodunu ekleyin. 10= saniye demektir.
İsteğinize göre değiştirebilirsiniz.
Ardından reboot atın ve işlem tamamdır.
GDB Breakpoint Kullanımı ve Compiler Versiyon Yükseltmesiyle Oluşan Yerden Toplama Sorununun Çözümü
Metin2 özel sunucularında geliştirme yaparken sıklıkla karşılaşılan sorunlardan birisi, derleyici versiyon değişikliklerinden sonra meydana gelen hata ayıklama (debugging) sorunlarıdır. Özellikle GDB (GNU Debugger) kullanırken, breakpoint koyulmasına rağmen bu breakpoint'lerin çalışmadığı ya da programın beklenmedik şekilde durduğu durumlarla karşılaşılabilir. Bu durum genellikle derleyici versiyon yükseltmeleri sonrasında ortaya çıkar. Bu yazıda, Metin2 geliştiricileri için bu sorunun neden oluştuğunu ve nasıl çözüleceğini detaylıca ele alacağız.
Compiler Versiyon Yükseltmesi Sonrası Beklenmeyen Davranışlar
Yeni compiler sürümleri, daha iyi optimizasyonlar sunsa da bazen debug sembollerini doğru şekilde üretmeme gibi problemlere yol açabilir. Özellikle GCC veya Clang gibi derleyicilerde yapılan yükseltmeler, debug sembolleri üzerinde etkili olabilir. Eğer debug sembolleri eksik veya hatalı derlenmişse, GDB breakpoint'leri doğru şekilde tanıyamaz.
GDB Breakpoint Koyma Teknikleri
Breakpoint koymak için farklı yollar kullanılabilir:
- Satır numarası bazlı breakpoint: break 120 komutuyla dosyanın 120. satırına breakpoint konabilir.
- Fonksiyon bazlı breakpoint: break function_name şeklinde fonksiyona breakpoint konabilir.
- Koşullu breakpoint: break 120 if variable == 5 gibi daha gelişmiş kontrol sağlar.
Ancak compiler yükseltmeleri sonrası bu komutların çoğu beklendiği gibi çalışmayabilir. Bunun temel nedenleri şunlardır:
1. Derleme sırasında -g flag'i eksik kalabilir. Bu flag debug sembollerini içerir.
2. -O2 veya daha yüksek optimizasyon seviyesi debug işlemini zorlaştırabilir.
3. Inline fonksiyonlar, stack frame’lerin doğru şekilde gösterilmesini engelleyebilir.
Sorunun Kök Nedeni Nedir?
Yeni compiler versiyonlarında varsayılan optimizasyon seviyeleri artabilir. Bu durumda bazı satırlar fiziksel olarak kodda yer değiştirebilir veya silinebilir. GDB, bu satırları artık tanıyamadığı için breakpoint çalışmaz. Ayrıca, bazı fonksiyonlar inline edildiği için breakpoint fonksiyon adıyla çalışmaz.
Çözüm Adımları
1. Derleme Ayarlarını Kontrol Edin: Debug modda derleme yaparken aşağıdaki flag'leri kullanın:
-g -O0 -fno-inline
Bu ayarlar, optimizasyonu kapatır ve inline fonksiyonları devre dışı bırakır.
2. Sembol Tablosunu Kontrol Edin: Aşağıdaki komutla binary dosyasının debug sembollerini kontrol edebilirsiniz:
objdump -t binary_name | grep -i 'func_name'
3. GDB İçinde Sembol Yükleme: Eğer semboller harici bir dosyada ise, GDB ile manuel olarak yükleyebilirsiniz:
symbol-file /path/to/symbols
4. CMake veya Makefile Ayarları: Build sistemlerinde debug yapılandırmasında gerekli flag'lerin aktif olduğundan emin olun. Örneğin CMakeLists.txt dosyasında:
set(CMAKE_BUILD_TYPE Debug)
Metin2 Geliştirme Ortamında Uygulama
Metin2 özel sunucularında, genellikle C++ tabanlı core sistemler kullanılır. Bu sistemlerde debug modda derleme yaparken, authserver, gameserver gibi bileşenler için ayrı ayrı kontrol yapılmalıdır. Özellikle game/src/ veya db/src/ dizinlerindeki kaynak kodlarda breakpoint koymak isteniyorsa, bu dizinlerin de debug sembolleriyle derlenmiş olması gerekir.
Sonuç
Compiler yükseltmeleri sonrası debug sürecinde yaşanılan breakpoint sorunları, genellikle derleme ayarlarının yeniden yapılandırılmasının ardından çözülebilir. Bu süreçte dikkat edilmesi gereken en önemli nokta, debug sembollerinin eksiksiz ve doğru şekilde derlenmiş olmasıdır. Metin2 geliştiricileri için bu tür teknik detaylar, server hatalarını hızlıca tespit etmede büyük kolaylık sağlar.
Using GDB Breakpoints and Solving Runtime Issues Caused by Compiler Version Upgrade
When developing private servers for Metin2, one frequently encountered issue is debugging problems that arise after compiler version changes. In particular, while using GDB (GNU Debugger), breakpoints may not work as expected or the program might behave unexpectedly. This situation usually occurs after upgrading the compiler. In this article, we will examine why this happens and how to solve it in detail for Metin2 developers.
Unexpected Behavior After Compiler Upgrades
Although newer compiler versions offer better optimizations, they can sometimes cause issues with correctly generating debug symbols. Especially upgrades to compilers like GCC or Clang may affect debug symbol generation. If debug symbols are missing or incorrectly compiled, GDB cannot recognize breakpoints properly.
Techniques for Setting GDB Breakpoints
There are several ways to set breakpoints:
- Line number-based breakpoint: Use break 120 to place a breakpoint at line 120 of the file.
- Function-based breakpoint: Use break function_name to place a breakpoint on a specific function.
- Conditional breakpoint: Use break 120 if variable == 5 for more advanced control.
However, after compiler upgrades, many of these commands may not work as expected. The main reasons for this are:
1. The -g flag may be missing during compilation. This flag includes debug symbols.
2. High optimization levels such as -O2 can complicate debugging processes.
3. Inline functions can prevent stack frames from being displayed correctly.
What Is the Root Cause of the Issue?
In newer compiler versions, default optimization levels may increase. In this case, certain lines may physically change places or be removed from the code. GDB may no longer recognize these lines, causing breakpoints to fail. Additionally, some functions may be inlined, preventing breakpoints from working by function name.
Solution Steps
1. Check Compilation Settings: When compiling in debug mode, use the following flags:
-g -O0 -fno-inline
These settings disable optimizations and inline functions.
2. Check Symbol Table: You can check debug symbols in the binary file with the command:
objdump -t binary_name | grep -i 'func_name'
3. Load Symbols Inside GDB: If symbols are located in an external file, you can load them manually into GDB:
symbol-file /path/to/symbols
4. CMake or Makefile Settings: Ensure required flags are active in debug configurations within build systems. For example, in CMakeLists.txt:
set(CMAKE_BUILD_TYPE Debug)
Application in Metin2 Development Environment
In Metin2 private servers, C++ based core systems are commonly used. When compiling in debug mode, components like authserver and gameserver must be individually checked. Especially when placing breakpoints in source code within directories like game/src/ or db/src/, it’s essential that these directories are also compiled with debug symbols.
Conclusion
Runtime breakpoint issues occurring after compiler upgrades can typically be resolved by reconfiguring compilation settings. The most important point to consider during this process is ensuring that debug symbols are fully and correctly compiled. For Metin2 developers, such technical details greatly assist in quickly identifying server errors.
