Best Studio 1
Best Studio
D 1
delimuratt
Aliyldrim 1
Aliyldrim
Mt2Hizmet 1
Mt2Hizmet
noisiv 1
noisiv
Manwe Work 1
Manwe Work
melankolıa18 1
melankolıa18
Agora Metin2 1
Agora Metin2
Cannn6161 1
Cannn6161
kralhakan2009 1
kralhakan2009
Vahsi Uzman 1
Vahsi Uzman
Hikaye Ekle
Reklam vermek için turkmmo@gmail.com

Client Hata Ayıklama

  • Konuyu başlatan Konuyu başlatan kralcocuk
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 32
  • Görüntüleme Görüntüleme 6K

ROHAN2 WORLD 1-120 TR TİPİ OFFICIAL YOHARA, BALATHOR VE AMON! 80. GÜNÜNDE! +10.000 ONLİNE! HİLE VE BOT %100 ENGELLİ HEMEN TIKLA!

Emeğine sağlık güzel bir anlatım ve bilgi konusu olmuş.

Forum topluluğu metin2 ile uğraşan kitle yetersiz kalıyorsa 'Server files' yapmak yerine yazılım öğrenmeli ve bu altın konu ile bilgilerine bilgi katmaları lazım kendi düşüncem.
 
Paylaşım için teşekkürler
 
kral paylaşım. :) teşekkürler
 
Hi All,

Tried it step by step but my debugger is acting different from the one from the author.
Per instance:
1649687273224.png

1649687261603.png


Even If I stop the debugger, like it says there, the result it's the same when analysing the snapshots.

Any clue on this?

Many thanks!
 
Uzun zamandır konu açmıyordum, sebebini söylemeye gerek yok çoğu kişi biliyor zaten. Hem bir kaç kişi sorduğu için hem de almanların yaptığı gibi herkesin katkıda bulunabileceği bir konu olsun diye açıyorum bu konuyu.

Konunun ana mantığı:

Basitçe amaç hafızadan silinmeyen şeyleri tespit edip düzeltmek. Oyuna girdikten sonra her ışınlanmada bellek artışı oluyor, bunun sebebi oluşup tekrar silinmeyen her şey. Tek kişinin uğraşıp tamamını bulması ve aktif oyunda denemeden çözdüm demesi aylar sürer, o yüzden katılmak isteyenler katılırsa (sorunu düzeltemese bile bulup konuya atarsa çözen çıkacaktır) toplu bir çözüme ulaşırız.
Öncelikle oyuna debug modda girebilmek için gereken ayarları anlatayım;

Kendi client dosyalarını visual studioda açın, Solution (Türkçe kullananlarda "Çözüm") sekmesine sağ tıklayıp "Properties" (Özellikler) sekmesini açın.

Burada "Startup Project" bölümünde "Single startup project" yazan yeri seçip projelerden de "UserInterface" seçin.

UserInterface projesine sağ tıklayıp Properties penceresini açın. "Debugging" bölümünde "Working Directory" göreceksiniz, oraya kendi client (oyuna girdiğiniz klasör(pack, dll vs.) yolunuzu girin. Resimdeki gibi .. şeklinde olmak zorunda değil direkt "C:/Oyun" gibi de yazılabilir.

Üst bardaki "Local Windows Debugger" veya F5 tuşuna basarak oyunu başlatabilirsiniz. Visual Studio yönetici yetkisiyle açılmamışsa yeniden başlatmamız gerekiyor diye uyarı çıkar, evet dediğinizde kapanıp yeniden açılacak, tekrar F5 bastığınızda oyun başlayacaktır.

Not: Herhangi bir anticheat kullanıyorsanız anti-debugger kontrolü bulunacağı için oyuna girmeyecektir. Anticheati devre dışı bırakın.
Not2:Oyun açıldığında antivirüs kullanıyorsanız debug modda olduğu için visual studionun internet erişimini kapatacaktır. Ekrana uyarı geliyor zaten, erişim izni verirsiniz.

Oyun açıldığında sağ tarafta bu "Diagnostic Tools" penceresini görmüyorsanız üst bardan sırasıyla "Debug -> Windows -> Show Diagnostic Tools" veya "CTRL + ALT + F2" kombinasyonuyla açabilirsiniz.
Sonra aşağıdaki resimdeki gibi "Memory Usage" sekmesine geçin. "Heap Profiling" tıkladığınızda "Take Snapshot" butonu aktifleşecek.
Not: Listede memory usage yoksa Select Tools yazan çark var, ona tıklayıp "memory usage" işaretleyin.


Ekli dosyayı görüntüle 75930

Oyuna girin, karakter oyunda göründüğü anda hiç bir işlem yapmadan "Take snapshot" diyerek 1. kalıbı alın. "warp nick" komutuyla kendinize ışınlanın, karakter göründükten sonra yeniden take snapshot basın. son olarak da oyundan çıkış atın (login ekranına dönün oyun tamamen kapanmasın).
Diagnostic ekranı aşağıdaki resimdeki gibi olacak. Buradan "Allocations (diff)" kısmında memory iniş çıkışlarını görüyorsunuz. Ok işaretinin yanındaki sayıya tıklayarak işlemleri görebilirsiniz.

Ekli dosyayı görüntüle 75931

Önünüze kullanılan fonksiyonları içeren bir işlem ağacı gelecek. Orada yeni oluşturulan ve yok edilen her şeyi görebilirsiniz. Oluşmuş, yok edilmemiş olanları tespit edip düzeltmek gerekiyor. Örnek olarak numberline seçtim. Skillerin üzerinde "m1" gibi detayların yazdığı küçük yazı yani. Çift tıklayınca detaylı bir işlem ağacı açılıyor.

Ekli dosyayı görüntüle 75932

Buradan da üzerlerine 1 kere tıklayınca altta çağırma sırasıyla fonksiyonları görüyorsunuz.

Ekli dosyayı görüntüle 75933

Bu resimde taskbardaki skill slotu var. Oluşturma aşamalarında bir sorun yok, CSlotWindow classında destroy aşamasında da bir eksiklik yok, numberline oluşturuyor ve işi bitince delete ile siliyor.
Class mantıkları kurucu ve yıkıcılardan oluşuyor. Classın ismini :: ile tekrar çağırınca bu kurucu oluyor.

CNumberLine::CNumberLine()
gibi.
araya ~ koyunca yıkıcı oluyor. Slotwindow classında delete ile numberline silindiğinde bu yıkıcı fonksiyonu çalışıyor.

C++:
    CNumberLine::~CNumberLine()
    {
        ClearNumber();
    }

ClearNumber fonksiyonuna yönlendiriyor, burada da oluşturduğu resimleri tuttuğu listeyi temizliyor. Resimler akıllı işaretçiye sahip olmadığı için hafızada kalmaya devam ediyor.
Bunu test etmek için kullandığım yöntem, üretilen resimlerin pointer adreslerini alıp vectoru temizledikten sonra pointer adresiyle baktığımda resmin durduğunu gördüm.
Benzer şekilde bakabilirsiniz.

Ekli dosyayı görüntüle 75935

Burada olması gereken şey normalde şudur
C++:
    void CNumberLine::ClearNumber()
    {
        for (auto ins : m_ImageInstanceVector)
        {
            CGraphicImageInstance::Delete(ins);
        } /* Clear number memory leak fix */

        m_ImageInstanceVector.clear();
        m_dwWidthSummary = 0;
        m_dwMaxHeight = 0;
        m_strNumber = "";
    }

Bu şekilde işi bitince resimleri bellekten silecek, sorun kalmayacak. Yabancı srclerinde "shared_ptr" kullanılan versiyonları görenler vardır. Bu şekilde silmek yerine shared_ptr gibi akıllı işaretçiler kullanarak işi bitince otomatik temizletenler var ama hiç biri kapsamlı olmadığı için %100 çözüm değil.

Bakıp bellekten silinmeyen, kalan şeyleri bulabilirsiniz. Hata ve çözümlerinizi konu altına ekleyerek konuyu ilerletebilirsiniz.
Anlattıklarımda hata olabilir, varsa düzeltilecek bir şey iletirseniz düzeltirim.
Konu başında bahsedilen konumlandırma yapıp "Local Windows Debugger" ile uğraşmadan direkt olarak ta başlatabilirsiniz;
Oyun açık iken vs'da,
1.PNG

İşleme iliştir diyip çıkan pencerede aşağıdaki resimdeki arama kısmına clientiniz ismini yazarak bulun ve işlemi seçin daha sonra aşağıdaki iliştir butonuna bastığınızda hata ayıklama işlemi başlamış olucaktır.

1.PNG

Not: VS'yi yönetici çalıştırmadıysanız aşağıdaki gibi uyarı ekranı gelir;
1.PNG

Farklı kimlik bilgileri altında yeniden başlata tıklayıp ve yukarıdaki işleme iliştirmeyi tekrar yapın.
 

Şu an konuyu görüntüleyenler (Toplam : 0, Üye: 0, Misafir: 0)

Geri
Üst