In acest tutorial voi folosi sursa martysama 5.8 p23, insa debugging-ul il puteti face pe orice sursa. Recomand sa faceti un backup inainte, in caz de omiteti ceva la un pas sau in caz de va pierdeti prin setari/configurari.
Optional, insa recomand: Stergeti folderul ".vs" din folderul sursei binary (Este un folder ascuns generat automat care are rolul de a stocha date temporare și configuratii specifice sesiunii de lucru pentru a imbunătăți performanta si experienta utilizatorului. Practic, daca il stergi stergi Cache-ul.) + fisierele .obj / .pch / .tlog etc (efectiv folderele "Release") <--> Curatare totala
Automat, daca vrem sa facem debugging, trebuie sa recompilam sursa in modul Debug, dar mai intai trebuie sa schimbam niste setari in proiectul .sln.
Deschide .sln-ul si seteaza modul de build pe Debug Win32
![[Tutorial] Binary Debugging + Hot Reload - Visual Studio - Mesaj 1 - Imagine 1 [Tutorial] Binary Debugging + Hot Reload - Visual Studio - Mesaj 1 - Imagine 1](https://i.imgur.com/AdMAZFX.png)
Intra in Options in meniul Debug
![[Tutorial] Binary Debugging + Hot Reload - Visual Studio - Mesaj 1 - Imagine 2 [Tutorial] Binary Debugging + Hot Reload - Visual Studio - Mesaj 1 - Imagine 2](https://i.imgur.com/6wQF7Rv.png)
si bifeaza optiunea Show disassembly if source is not available
![[Tutorial] Binary Debugging + Hot Reload - Visual Studio - Mesaj 1 - Imagine 3 [Tutorial] Binary Debugging + Hot Reload - Visual Studio - Mesaj 1 - Imagine 3](https://i.imgur.com/CcMRAhs.png)
Apoi, da click dreapta pe UserInterface -> Options si intra in tabul "Linker" -> "Debugging". Acolo seteaza:
Generate Debug Info: Generate Debug Information optimized for sharing and publishing (/DEBUG:FULL)
Generate Map File: Yes (/MAP)
Map Exports: Yes (/MAPINFO:EXPORTS) (optional, dar util pentru diagnosticarea crash-urilor complexe)
Debuggable Assembly: Yes (/ASSEMBLYDEBUG)
![[Tutorial] Binary Debugging + Hot Reload - Visual Studio - Mesaj 1 - Imagine 4 [Tutorial] Binary Debugging + Hot Reload - Visual Studio - Mesaj 1 - Imagine 4](https://i.imgur.com/0I4LBLU.png)
Acum selecteaza toate cele 16 proiecte (de la CWebBrowser la UserInterface) , apasa click-dreapta si intra la options.
In tabul "C/C++" -> "General" seteaza Debug Information Format: Program Database for Edit And Continue (/ZI)
In tabul "C/C++" -> "Optimization" seteaza Optimization: Disabled (/Od)
Verifica inca o data daca aceste doua setari s-au schimbat in toate cele 16 proiecte (Important)
Recompileaza sursa folosind optiunea "Rebuild Solution" sau "Clean Solution" + "Build Solution" . Nu folosi "Build Solution" !
Este foarte posibil ca in modul "Debug" sa iti apara mult mai multe warning-uri decat de obicei. (Este normal) . Modul "Debug" este mai "exigent"/"aspru".
Dupa ce ai compilat sursa, copiaza launcherul debug (.exe) + fisierul .pdb (are acelasi nume ca launcherul) in folderul clientului tau. Fara fisierul .pdb debugging-ul nu va arata liniile de cod cand apare o eroare. PDB = Program Debug Database, practic este "traducerea" erorilor, definindu-le si localizandu-le.
Exemplu:
![[Tutorial] Binary Debugging + Hot Reload - Visual Studio - Mesaj 1 - Imagine 5 [Tutorial] Binary Debugging + Hot Reload - Visual Studio - Mesaj 1 - Imagine 5](https://i.imgur.com/NjdhT6Z.png)
Acum ai doua variante prin care poti porni debugging-ul:
A. Varianta I - Direct prin intermediul Visual Studio
Intra in setarile Solutiei (Proiectul cel mare <-> cel care contine cele 16 proiecte; de obicei numit "Solution 'Metin2Client'")
In tabul Common Properties -> Configure Startup Projects seteaza Single startup project: UserInterface
UserInterface -> Properties
In tabul Configuration Properties -> Debugging:
Working Directory: selecteaza locatia clientului tau. Atentie: asigura-te ca linia cu destinatia se incheie cu "\". Exemplu: D:\Client\
Command: selecteaza launcherul tau (debug .exe)
Acum poti rula clientul in modul debug direct din Visual Studio apasand tasta F5 sau dand click pe "Local Windows Debugger"
![[Tutorial] Binary Debugging + Hot Reload - Visual Studio - Mesaj 1 - Imagine 6 [Tutorial] Binary Debugging + Hot Reload - Visual Studio - Mesaj 1 - Imagine 6](https://i.imgur.com/AQSMM63.png)
Daca se deschide o fereastra care te anunta ca ai nevoie de permisiuni de administrator nu este nicio problema. Selecteaza "Restart under different credentials" iar Visual Studio va reporni cu drepturi de administrator.
Iar de aici incolo incepi un nou capitol in development si testing. Poti testa orice functie din client incetinind-o (pas cu pas), poti verifica CPU/GPU Usage, efectiv ai acces total la orice test. In caz de crash-uri erori <-> vei primi exact raspunsul si cauza.
B. Varianta a II-a de rulare a debugging-ului:
Mai intai pornesti clientul normal si dupa in Visual Studio in tabul Debug selectezi "Attach to Process" si dupa selectezi procesul clientului tau.
![[Tutorial] Binary Debugging + Hot Reload - Visual Studio - Mesaj 1 - Imagine 7 [Tutorial] Binary Debugging + Hot Reload - Visual Studio - Mesaj 1 - Imagine 7](https://i.imgur.com/4p1hD1x.png)
Eu sincer prefer prima varianta pentru ca beneficiezi si de acea consola tip CMD + raspunsuri mai fluente/exacte.
Si sa nu ziceti ca sunt baiat rau va arat si cum sa folositi Hot Reload (modificari in sursa "live" <-> fara a recompila toata sursa si fara a iesi din client)
UserInterface -> Properties. In tabul Linker -> General seteaza Enable Incremental Linking: Yes (/INCREMENTAL)
Dupa ce activezi Incremental Linking -> "Rebuild Solution"
Sa fii atent la finalul recompilarii daca apare "ignoring '/INCREMENTAL'" . Asta va duce la dezactivarea Incremental Linking iar Hot Reload nu va functiona.
In 90% din cazuri va aparea:
Problema este cauzata de faptul ca optiunile LTCG (Link Time Code Generation) si Incremental Linking sunt incompatibile. /LTCG este o tehnica de optimizare finala care necesita o analiza completa a codului, in timp ce /INCREMENTAL are ca scop viteza, recompiland doar bucatile modificate. In cazul de fata compilerul a detectat o librarie care a fost compilata cu /GL deci va compila toata sursa cu /LTCG.libjpeg-MTd.lib(jerror.obj) : MSIL .netmodule or module compiled with /GL found; restarting link with /LTCG; add /LTCG to the link command line to improve linker performance
LINK : warning LNK4075: ignoring '/INCREMENTAL' due to '/LTCG' specification
Insa problema si mai mare este ca nu putem modifica din setarile sursei deoarece libraria compilata cu /GL este una externa si anume libjpeg-MTd.lib, codul ei sursa fiind greu de gasit, deci nici nu o putem recompila separat folosind setarile necesare.
INSA exista o rezolvare, bineinteles. Exista pentru orice
Instaleaza CMAKE si NASM.
Descarca https://github.com/libjpeg-turbo/libjpeg-turbo (Fie normal fie prin comanda git clone)
Deschide PowerShell in folderul libjpeg-turbo
Ruleaza comanda mkdir build , apoi cd build
Ruleaza comanda cmake -G "Visual Studio 17 2022" -A Win32 .. (Daca folosesti Visual Studio 2022)
cmake -G "Visual Studio 16 2019" -A Win32 .. (Daca folosesti Visual Studio 2019)
Dupa ce ai rulat comanda anterioara ruleaza: cmake --build . --config Debug
Dupa compilare intra in folderul debug din build si cauta jpeg-static.lib
Copiaza-l, redenumeste-l si inlocuieste-l cu libjpeg-MTd.lib din Extern/lib
Acum vei putea compila sursa binary fara probleme folosind si flag-ul /INCREMENTAL .
Si ai castigat si viteza marita in gestionarea imaginilor din client (aproximativ 5x)
Observatie: Daca vrei sa folosesti acelasi lib si pe Release o sa trebuiasca sa il recompilezi cu CMAKE folosind comanda cmake --build . --config Release
Insa mai avem un pas de facut.
Intra in extern/cryptopp/crytplib.sln
Seteaza Buildul pe Debug Win32
cryptlib -> Properties. In tabul C/C++ -> General selecteaza Debug Information Format: Program Database for Edit And Continue (/ZI)
Compileaza.
Acum poti recompila sursa binary. Dupa ce o recompilezi si pornesti debuggerul din Visual Studio fa orice modificare in sursa, apoi apasa pe acest buton:
![[Tutorial] Binary Debugging + Hot Reload - Visual Studio - Mesaj 1 - Imagine 8 [Tutorial] Binary Debugging + Hot Reload - Visual Studio - Mesaj 1 - Imagine 8](https://i.imgur.com/pboB5rk.png)
sau apasa tastele ALT + F10 pentru a actualiza sursa instant.

