Cum imi depanez aplicatia pe alta versiune de Windows?
Aveam o aplicatie care rula perfect pe sistemul meu cu Windows Vista, dar nu si pe Windows XP. Cum sa fac sa vad de ce nu merge? Prima solutie evidenta: o masina virtuala cu Windows XP si aplicatia rulata in ea. Dar ce te faci atunci cand vrei sa faci si putin debugging pentru a vedea fix la ce linie din codul sursa crapa aplicatia ta?
Pentru exemplu, am luat o aplicatie simpla MFC ce simuleaza comportamentul descris mai sus. Codul relevant arata cam asa si va executa anumite instructiuni numai daca ruleaza pe Windows XP:
Aplicatia e compilata cu Visual Studio 2005 SP1. Masina virtuala contine un XP SP1 proaspat instalat. Daca incerc sa copiez EXE-ul intr-un director in masina virtuala (de exemplu: C:\Test ) si sa-l execut, nu va merge si-mi va da o eroare de genul:
deoarece aplicatia este link-ata dinamic cu CRT-ul si cu MFC si are nevoie de DLL-urile respective. Pentru a putea rula aplicatia, voi copia librariile necesare in directorul aplicatiei. Din directorul: C:\Program Files\Microsoft Visual Studio 8\VC\redist\Debug_NonRedist\x86 de pe masina gazda, voi copia directoarele Microsoft.VC80.DebugCRT si Microsoft.VC80.DebugMFC in directorul aplicatiei din masina virtuala (C:\Test). Am folosit DLL-urile din directorul Debug_NonRedist deoarece aplicatia mea este compilata in modul Debug.
Dupa ce am rulat aplicatia si am dat click pe butonul Ok, aceasta a crapat.
Dar cum sa-mi dau seama exact unde a crapat aplicatia? Sa instalez Visual Studio in masina virtuala? Nu am timpul necesar pentru asa ceva. Care e solutia? Remote debugging cu VMWare
Incepand cu versiunea 6, VMWare ofera optiunea de remote debugging din Visual Studio si Eclipse. Asa ca am deschis aplicatia mea in Visual Studio si apoi din meniul VMWare -> Options m-am apucat sa configurez aplicatia pentru remote debugging.
Prima data am setat ce se va executa in masina virtuala. Am indicat calea C:\Test\TestMFC.exe pentru ca acolo se va gasi executabilul in masina virtuala si Run Command as a guest path pentru a indica faptul ca este o comanda ce va rula in masina virtuala.
Apoi am setat calea masinii virtuale cu care voi lucra (in cazul meu un Windows XP SP1).
Daca fac niste modificari in aplicatie, va trebui sa copiez din nou fisierul executabil in masina virtuala. VMWare poate face acest lucru pentru mine, asa ca-I voi seta ca inainte de debug sa-mi copieze fisierul de pe masina gazda, pe masina virtuala.
La sfarsit, optional, pentru a face putina curatenie ii voi spune sa stearga fisierul de acolo dupa ce s-a terminat sesiunea de debugging.
Suntem aproape gata. Inainte de a face debugging mai trebuie sa ne asiguram ca pe masina virtuala avem acelasi cont si aceeasi parola ca si pe masina gazda. Altfel vom avea parte de urmatorul mesaj:
Daca incercam acum sa rulam aplicatia si sa facem debugging in masina virtuala, vom vedea urmatorul dialog:
Apasam No si pentru a rezolva problema mergem pe masina virtuala in Control Panel -> Administrative Tools -> Local Security Policy -> Local Policies -> Security Options si setam la Network access: Sharing and security model for local accounts optiunea Classic "“ local users authentificate as themselves
Gata. Acum putem da drumul aplicatiei: Din meniul VMWare -> Start sau apasand F6. Astfel VMWare va porni Visual Studio Remote Debugging Monitor in masina virtuala.
Daca apasam pe butonul Ok, ne vom intoarce la Visual Studio si vom vedea eroarea si linia la care s-a produs. Asadar putem observa ca un pointer NULL era sursa erorii noastre atunci cand codul se executa pe Windows XP.
(click pe poza pentru a o mari)
In concluzie, am facut debugging la aplicatia mea pe un Windows XP SP1 si nu a fost nevoie sa instalez Visual Studio in masina virtuala. Eficient, nu?













June 14th, 2007 - 23:37
Toate ca toate dar schimba fontul ca nu se vede mai nimic
Bun post.
June 15th, 2007 - 10:48
Alex, da un click pentru zoom.
June 15th, 2007 - 15:41
Asta e ceea ce se numeste “continut de calitate”. Tocmai ma uitam pe blogul lui Salo si am vazut ca are si el un articol interesant. Foarte frumos!