MaviAyGames | [C ++] Bellek Sızıntısı SDB'sini Düzeltme

  • Konbuyu başlatan Konbuyu başlatan Admin
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 0
  • Görüntüleme Görüntüleme 34

Admin

Metin2Lobby
Yönetici
Founder
Katılım
6 Mayıs 2022
Mesajlar
52,647
Ticaret : 1 / 0 / 0
EterPack.cpp

Arat:
Kod:
if( !m_pCSHybridCryptPolicy->DecryptMemory(std::string(filename), static_cast<const BYTE*>(*data), index->data_size, *zObj) ) { return false; }

Değiştir:
Kod:
if( !m_pCSHybridCryptPolicy->DecryptMemory(std::string(filename), static_cast<const BYTE*>(*data), index->data_size, *zObj) ) { delete zObj; return false; }


Arat:
Kod:
if( !m_pCSHybridCryptPolicy->GetSupplementaryDataBlock(std::string(filename), pSDBData, iSDBSize) ) { return false; }

Değiştir:

Kod:
if( !m_pCSHybridCryptPolicy->GetSupplementaryDataBlock(std::string(filename), pSDBData, iSDBSize) ) { delete zObj; return false; }

Arat:

Kod:
else if (COMPRESSED_TYPE_PANAMA == index->compressed_type) { CLZObject * zObj = new CLZObject; __Decrypt_Panama(filename, static_cast<const BYTE*>(*data), index->data_size, *zObj); out_file.BindLZObjectWithBufferedSize(zObj); *data = zObj->GetBuffer();

Değiştir:

Kod:
else if (COMPRESSED_TYPE_PANAMA == index->compressed_type) { CLZObject * zObj = new CLZObject; if (!__Decrypt_Panama(filename, static_cast<const BYTE*>(*data), index->data_size, *zObj)) { delete zObj; return false; } out_file.BindLZObjectWithBufferedSize(zObj); *data = zObj->GetBuffer(); }

MaviAyGames | C++ Bellek Sızıntısı SDB'sini Düzeltme

Metin2 özel sunucularında performans ve kararlılık açısından kritik öneme sahip olan konulardan birisi de bellek yönetimidir. Özellikle uzun süre çalışan oyun sunucularında bellek sızıntıları zamanla ciddi sorunlara yol açabilir. Bu yazıda, MaviAyGames tarafından geliştirilen C++ tabanlı sistemde ortaya çıkan SDB bellek sızıntısının nasıl düzeltileceği üzerinde duracağız. Bu rehber, Metin2 özel sunucu geliştirme, oyun sunucu programlama, C++ sistemleri ve DB yönetimi ile ilgilenen geliştiriciler için önemli bir kaynak niteliğinde olacaktır.

SDB Nedir?
SDB, yani Secure Database (Güvenli Veritabanı), Metin2 oyun sunucusunun veritabanı bağlantılarını ve işlemlerini yöneten kritik bir bileşendir. Bu modül, genellikle oyun içi verilerin güvenli ve hızlı bir şekilde veritabanına yazılması veya okunması için kullanılır. Ancak bazı durumlarda, özellikle uzun süre çalışan süreçlerde, bellek sızıntısı yaşanabilir. Bu da sunucunun zamanla yavaşlamasına, hatta çökmesine neden olabilir.

Bellek Sızıntısı Nedenleri
C++ gibi düşük seviyeli dillerde, bellek yönetimi manuel olarak yapılır. Eğer bir bellek bloğu ayrıldıysa ancak serbest bırakılmazsa, bellek sızıntısı meydana gelir. SDB modülünde bu, genellikle şu durumlarda görülür:
- SQL sorgusu sonuçlarının işlendikten sonra silinmemesi
- Veritabanı bağlantısının kapandıktan sonra bellekte tutulan nesnelerin silinmemesi
- Hatalı sorgu sonucu işleme
- Döngülerde dinamik bellek tahsis edilip serbest bırakılmaması

SDB Bellek Sızıntısının Tespiti
Bellek sızıntısını tespit etmek için öncelikle sunucuyu izlemek gerekir. Linux tabanlı sistemlerde valgrind aracı oldukça faydalıdır. Bu aracın çıktısında, SDB modülüne ait fonksiyonlarda bellek sızıntısı olup olmadığı kolayca görülebilir. Ayrıca, sunucu loglarında zamanla artan bellek kullanımı da bir göstergedir.

Düzeltme Adımları
1. SQL Sorgusu Sonuçlarını Serbest Bırakın: Her SELECT işleminden sonra alınan sonuç seti, mutlaka temizlenmelidir. Örneğin MySQL için mysql_free_result() fonksiyonu kullanılmalıdır.

2. Bağlantı Kapatma: Sunucu kapanırken tüm SDB bağlantıları kapatılmalı ve ilgili nesneler bellekten silinmelidir.

3. Otomatik Bellek Yönetimi: C++11 ve sonrası sürümlerde smart pointers (örneğin std::unique_ptr) kullanarak bellek yönetimini daha güvenli hale getirebilirsiniz.

Örnek Kod
Kod:
SQLResult* result = SDBManager().DirectQuery('SELECT * FROM player');[BR][/BR]if(result)[BR][/BR]{[BR][/BR]    // İşlemler burada yapılır[BR][/BR]    mysql_free_result(result->GetP());[BR][/BR]    delete result;[BR][/BR]}

Sonuç
Metin2 özel sunucularında bellek sızıntıları, özellikle uzun süreli stabilite açısından büyük risk oluşturur. SDB modülündeki bu tür hataların erken tespiti ve düzeltilmesi, sunucunuzun daha güçlü ve daha az çöküşle çalışmasını sağlar. C++ tabanlı sistemlerde dikkat edilmesi gereken en önemli konulardan biri budur. Geliştiricilerin bu tür hataları analiz etmek ve çözmek için bolca test yapması, logları takip etmesi ve gerektiğinde profiling araçları kullanması önerilir.

Daha fazla Metin2 geliştirici rehberi ve kaynak kod paylaşımları için Metin2Lobby'yi ziyaret edin.


MaviAyGames | Fixing Memory Leak in SDB with C++

Memory management is one of the critical issues for performance and stability in Metin2 private servers. Especially on long-running game servers, memory leaks can cause serious problems over time. In this article, we will discuss how to fix a memory leak issue in the SDB module of a C++ based system developed by MaviAyGames. This guide will be an important resource for developers working with Metin2 private server development, game server programming, C++ systems, and database management.

What is SDB?
SDB, also known as Secure Database, is a key component that manages database connections and operations in Metin2 game servers. It is typically used to securely and quickly write or read in-game data from the database. However, under certain conditions, especially during long-running processes, memory leaks can occur. This may lead to the server slowing down or even crashing over time.

Reasons for Memory Leaks
In low-level languages like C++, memory management is done manually. If a block of memory is allocated but not released afterward, a memory leak occurs. In the SDB module, this usually happens in cases such as:
- Not freeing SQL query results after processing
- Not deleting objects held in memory after closing the database connection
- Improper handling of query results
- Allocating dynamic memory inside loops without releasing it

Detecting SDB Memory Leaks
To detect a memory leak, you first need to monitor your server. On Linux-based systems, tools like valgrind are very helpful. The output of this tool can easily reveal whether there are memory leaks in SDB-related functions. Additionally, increasing memory usage over time in server logs can also indicate a leak.

Fixing Steps
1. Free SQL Query Results: After each SELECT operation, the result set must be cleaned up. For example, use mysql_free_result() for MySQL.

2. Close Connections: All SDB connections should be closed and associated objects deleted from memory when the server shuts down.

3. Automatic Memory Management: You can make memory management safer in C++11 and later versions by using smart pointers like std::unique_ptr.

Sample Code
Kod:
SQLResult* result = SDBManager().DirectQuery('SELECT * FROM player');[BR][/BR]if(result)[BR][/BR]{[BR][/BR]    // Operations are performed here[BR][/BR]    mysql_free_result(result->GetP());[BR][/BR]    delete result;[BR][/BR]}

Conclusion
Memory leaks in Metin2 private servers pose a significant risk for long-term stability. Early detection and fixing of such errors in the SDB module ensure your server runs more robustly with fewer crashes. This is one of the most important aspects to consider in C++-based systems. Developers are advised to run extensive tests, monitor logs, and use profiling tools when necessary to analyze and resolve such issues.

For more guides and source code related to Metin2 development, visit Metin2Lobby.
 

Şuan Bu Konuyu Görüntüleyen Kullanıcılar (Toplam : 0, Üye : 0, Misafir : 0)

Benzer konular

Geri
Üst Alt