Differences

This shows you the differences between two versions of the page.

Link to this comparison view

so:laboratoare:resurse:windows-laborator [2021/02/27 22:06]
maria.mihailescu [Windows - Tips&Tricks]
so:laboratoare:resurse:windows-laborator [2021/02/27 22:28] (current)
maria.mihailescu
Line 2: Line 2:
 Informațiile din acesta pagina au rolul de a ajuta un student în rezolvarea laboratoarelor și a temelor pentru platforma Windows, din cadrul materiei Sisteme de Operare. Informațiile din acesta pagina au rolul de a ajuta un student în rezolvarea laboratoarelor și a temelor pentru platforma Windows, din cadrul materiei Sisteme de Operare.
  
-Continut+Resurse pentru lucrul cu Windows in cadrul materiei
-  * [[#​visual_studio ​| Visual Studio]] +  * [[so/​laboratoare/​resurse/​windows-laborator/​tutorial-visual-studioTutorial ​Visual Studio]] 
-  * [[#​powershell | PowerShell]] +  * [[so/​laboratoare/​resurse/​windows-laborator/​windows-cli#powershell | PowerShell]] 
-  * [[#​git_in_cygwin | Git in Cygwin ]] +  * [[so/​laboratoare/​resurse/​windows-laborator/​windows-cli#​git_in_cygwin | Git in Cygwin ]] 
-  * [[#​dr_memory | Dr. Memory ]]+  * [[so/​laboratoare/​resurse/​windows-laborator/​windows-cli#dr_memory | Dr. Memory ]]
  
-===== Visual Studio ===== 
-Găsiți [[https://​docs.microsoft.com/​en-us/​cpp|aici]] o gamă mai largă de tutoriale și explicații pentru folosirea Visual Studio. În continuare, prezentăm câteva aspecte generale care vă sunt necesare pentru lucrul cu platforma Windows pentru laborator și teme. 
  
-==== Terminologie ==== 
- 
-|Termen ​        ​|Explicație ​                                                                                                                                                                                                           | 
-|Solution (.sln)|Fișier cu extensia .sln care conține mai multe proiecte.\\ De exemplu, pentru fiecare laborator Windows, vi se furnizează un fișier .sln (soluție) care conține câte un proiect pentru fiecare exercițiu de laborator.| 
-|Project ​       |Colecție de fișiere sursă și headere care pot fi compilate împreună pentru a obține un singur executabil. ​                                                                                                            | 
- 
- 
-==== TLDR ==== 
- 
-|Ce?                                       ​|Cum? ​                                                                                     | 
-|Creare proiect nou                        |File->​New->​Project ​                                                                | 
-|Adăugare fișier nou la  proiect ​          ​|Select Source Files->​Click dreapta->​ Add -> New Item                               | 
-|Adăugare fișier existent la proiect ​      ​|Select Source Files->​Click dreapta->​ Add -> Existing Item                          | 
-|Deschidere proiect existent ​              ​|Selectare .sln -> Click dreapta -> Open with -> Microsoft …                        | 
-|Compilare Solution ​                       |Selectare tab Build -> Build Solution\\ Alternativ: F7                                    | 
-|Compilare Proiect ​                        ​|Selectare nume proiect din Solution Explorer->​ Selectare tab Build -> Build <nume proiect>​| 
-|Setare Start-up Project ​                  ​|Selectare nume proiect din Solution Explorer -> Click dreapta -> Set as Start-up Project ​ | 
-|Rulare proiect ​                           |Selectare tab Debug -> Start without Debugging\\ \\ Alternativ: Ctrl + F5                 | 
-|Rulare proiect specific ​                  ​|Selectare proiect ca startup project ​                               | 
-|Rulare proiect cu debugger ​               |Selectare tab Debug -> Start Debugging\\ \\ Alternativ: F5                                | 
-|Adăugare/​Ștergere breakpoint ​             |Click pe linia cu instrucțiunea + F9                                                      | 
-|Next step pentru debugger ​                ​|F10 ​                                                                                      | 
-|Continue pentru debugger ​                 |F5                                                                                        | 
-|Deschidere PowerShell din VS              |Selectare tab Tools->​PowerShell Command Prompt ​                                           | 
-|Rulare Aplicație din PowerShell ​          ​|Selectare tab Tools->​PowerShell Command Prompt-> .\<​nume-proiect>​.exe ​             | 
-|Rulare Aplicație din Cygwin ​              ​|Deschidere Cygwin-> cd “<Cale catre Proiect>/​Debug”->​./<​nume-proiect>​.exe ​         | 
-|Sugestii de completare ​                   |Ctrl+Space ​                                                                               | 
-|Căutarea definiției unei funcții/​variabile|Click dreapta -> Goto definition ​                                                         | 
- 
- 
-==== Creare proiect nou ==== 
- 
-Aplicația cu care vom lucra în cadrul laboratorului de Sisteme de Operare pentru platforma Windows este Microsoft Visual C++ 2010 Express. În cadrul mașinii virtuale de laborator, această aplicație este deja instalată și se poate găsi pe Desktop. 
- 
-Pentru a crea un proiect nou, apăsați File->​New->​Project. Se va deschide o fereastră precum cea de mai jos. 
- 
-{{:​so:​laboratoare:​resurse:​tutorial_create_project.png?​600|}} 
- 
-În fereastra nou deschisă, selectați Win32 Console Application (în partea de sus a imaginii, în chenar roșu) și completați informațiile referitoare la numele proiectului,​ precum și la locația în care se va afla proiectul. Apăsați OK.  
- 
-{{:​so:​laboratoare:​resurse:​tutorial_project_settings_1.png?​400|}} 
- 
-Apăsați butonul Next pentru a intra în meniul de configurații al aplicației. Se va deschide o fereastră nouă, similară celei de mai jos.  
- 
-{{:​so:​laboratoare:​resurse:​tutorial_application_settings.png?​400|}} 
- 
-În fereastra de configurări ale aplicației,​ asigurați-vă că alegeți “Console application” ca tip de aplicație (Application type) și “Empty project” ca setări adiționale ale proiectului (Additional options) deoarece dorim ca să adăugăm sursele noastre proprii. Pentru a finaliza crearea proiectului,​ apăsați butonul “Finish”. 
- 
-În acest moment, am creat un proiect nou, dar care nu are fișiere sursă sau headere. Fișierele corespunzătoare soluției, respectiv proiectului,​ se găsesc în locația specificată la creare. În cazul exemplului de mai sus, calea dată a fost: C->​Users->​Documents->​Visual Studio 2010->​Projects,​ ca în imaginea de mai jos. 
- 
-{{:​so:​laboratoare:​resurse:​tutorial_folders_files.png?​600|}} 
- 
-În continuare, vom analiza componența proiectului din ierarhia de fișiere: 
- 
-  * Fișierul ProiectSO.sln reprezintă un fișier care conține toată informația referitoare la organizarea proiectului. Acest fișier este folosit pentru deschiderea soluției (solution) și a tuturor proiectelor pe care le conține. 
-  * Fișierul ProiectSO.sdf conține o bază de date SQL ce poate fi folosită pentru dezvoltarea aplicației. Dacă baza de date nu este folosită în cadrul proiectului,​ atunci fișierul .sdf poate fi șters. 
-  * ProiectSO - folderul conține fișierele sursă ale proiectului ProiectSO. 
-  * ProiectSO/​ProiectSO.vcxproj - fișierul conține informații legate de setările proiectului ProiectSO. 
-  * ProiectSO/​ProiectSO.vcxproj.filters - fișier XML care conține împărțirea logică a proiectului. Uzual, conține secțiuni precum: Header Files (folosit, de obicei, pentru fișiere header - .h/hpp), Source Files (folosit, de obicei, pentru fișiere sursă - .c/cpp), Resource Files (folosit, de obicei, pentru fișiere de tip resursă, care nu sunt nici fișiere sursă, nici headere - exemplu: fișiere de configurație,​ pictograme etc.). 
- 
-==== Adăugare fișiere într-un proiect ==== 
- 
-În mod uzual, un proiect are 4 secțiuni vizibile din cadrul Solution Explorer (vezi poza de mai jos): 
-  * External Dependencies - dependențe externe adăugate automat de către program în momentul în care se folosesc directive de preprocesare de tipul #include. 
-  * Header Files - fișiere header adăugate de către programator 
-  * Resource File - fișiere folosite de aplicație, dar care nu sunt nici fișiere header, nici fișiere sursă. 
-  * Source Files - fișiere sursă folosite de către aplicație 
- 
-Atenție! Fișierele din External Dependencies sunt adăugate automat de către editor și nu pot fi șterse. 
- 
-{{:​so:​laboratoare:​resurse:​tutorial_project_files.png?​400|}} 
- 
-=== Adăugarea unui fișier nou în proiect === 
- 
-Pentru a adăuga un fișier nou în proiect, selectați secțiunea dorită (Header Files/​Resource Files/​Source Files), apăsați click dreapta și alegeți Add->New Item. 
- 
-De exemplu, pentru adăugarea unui fișier sursă nou, numit print.c, selectați Source Files și, folosind click dreapta, alegeți Add->New Item. Alegeți C++ File ca tip de fișier și numele fișierului. ​ 
- 
-{{:​so:​laboratoare:​resurse:​tutorial_add_new_item.png?​600|}} 
- 
-=== Adăugarea unui fișier existent în proiect === 
- 
-Pentru a adăuga un fișier existent la proiect, selectați secțiunea dorită din cadrul Solution Explorer (Header Files, Resource Files sau Source Files) și, folosind click dreapta, alegeți Add->​Existing Item. Folosind explorerul deschis, alegeți fișierul dorit. 
- 
-În imaginile de mai jos este exemplificat modul prin care se adaugă un fișier sursă nou în cadrul unui proiect. 
- 
-{{:​so:​laboratoare:​resurse:​tutorial_add_existing_item.png?​300|}} 
- 
-{{:​so:​laboratoare:​resurse:​tutorial_add_existing_item_2.png?​400|}} 
- 
-==== Deschidere proiect existent ==== 
- 
-De cele mai multe ori, atât la laboratoare,​ teme, cât și în industrie, veți lucra cu proiecte deja existente. 
- 
-Pentru a deschide un proiect existent, se poate alege una din variantele următoare: 
-  * Click dreapta pe fișierul .sln asociat proiectelor și selectați Open with -> Microsoft Visual C++ 2010 Express (ca în imaginea de mai jos)\\ 
-{{:​so:​laboratoare:​resurse:​tutorial_open_sln_2.png?​600|}} 
-  * Din cadrul aplicației Microsoft Visual C++ 2010 Express. Accesați File->​Open->​Project/​Solution și alegeți fișierul .sln care conține proiectele de interes.\\ 
-{{:​so:​laboratoare:​resurse:​tutorial_open_sln.png?​300|}} 
- 
-La prima deschidere a unui proiect existent (mai ales dacă este un proiect mai vechi), este posibil să apară o etapă de conversie a acestuia. În acest caz, navigați prin ferestrele de configurare folosind Next și/sau Finish. 
- 
-==== Lucrul uzual cu proiecte ==== 
- 
-Un fișier .sln conține unul sau mai multe proiect. În cazul în care există mai multe proiecte, fișierul .sln (Solution) trebuie să conțină un proiect principal (Start-up Project) care să fie rulat în mod implicit. 
- 
-În imaginea de mai jos, fișierul .sln numit lab02-win.sln conține 4 proiecte (Solution ‘lab02-win.sln’ (4 projects): 1-cat, 2-crc, 3-ls, 4-trouble. Proiectele au aceiași împărțire logică asemeni majorității proiectelor Visual Studio: External Dependencies,​ Header Files, Resource Files, Source Files. Proiectul principal (Start-up project) este cel al cărui nume este îngroșat, în cazul prezentat fiind vorba de proiectul 1-cat. 
- 
-{{:​so:​laboratoare:​resurse:​tutorial_solution_explorer.png?​350|}} 
- 
-=== Compilare === 
- 
-Pentru a compila toate proiectele din fișierul .sln, accesați tab-ul Build și alegeți “Build Solution”.  Alternativ,​ puteți folosi ca scurtătură tasta F7.  
- 
-Deoarece compilarea mai multor proiecte poate consuma destul de mult timp, se poate alege varianta de compilare a unui singur proiect. Pentru aceasta, trebuie să selectați proiectul dorit din Solution Explorer și puteți folosi una din următoarele variante: 
-  * Click dreapta pe numele proiectului din Solution Explorer și alegeți Build 
-  * Alegeți meniul Build din bara de meniu a aplicației Visual Studio și selectați Build <​nume-proiect>​ 
- 
-În imaginea de mai jos este exemplificat un fișier .sln care are mai multe proiecte. Pentru compilarea întregii colecții de proiecte se va alege “Build Solution”/​F7 din meniu. Pentru compilarea individuală a unui proiect, în cazul prezentat 2-crc, selectați proiectul 2-crc din Solution Explorer și alegeți Build 2-crc din meniul Build al aplicației Microsoft Visual C++ 2010 Express. 
- 
-{{:​so:​laboratoare:​resurse:​tutorial_build.png|}} 
- 
-<​note>​ 
-Folosind PowerShell, împreună cu utilitarul nmake, puteți compila sursele folosind fișiere Makefile. Mai multe detalii găsiți [[https://​www.google.com/​url?​q=https://​ocw.cs.pub.ro/​courses/​so/​laboratoare/​laborator-01%23nmake&​sa=D&​source=editors&​ust=1614456116382000&​usg=AOvVaw12S_FQkV3mzP6SQy4DOpoq|aici]]. 
-</​note>​ 
- 
-=== Setare StartUp Project === 
- 
-Pentru a seta un proiect ca proiect de pornire (StartUp Project), selectați numele proiectului din Solution Explorer, apăsați click dreapta și alegeți “Set as StartUp Project”. 
- 
-În imaginea de mai jos, dorim să setăm proiectul 2-crc ca proiect de pornire. 
- 
-{{:​so:​laboratoare:​resurse:​tutorial_startup_proj.png?​200|}} 
- 
-=== Rulare === 
- 
-O aplicație compilată folosind Visual Studio Poate fi rulată în mai multe moduri: 
-  * Din cadrul aplicației. Din meniul Debug al Microsoft Visual C++ 2010 Express, alegeți “Start without Debugging”. Alternativ, folosiți “Ctrl + F5”.\\ 
-Atenție! Dacă sunt mai multe proiecte în cadrul fișierului .sln, în mod implicit va rula proiectul de pornire (StartUp Project). Pentru a rula un proiect care nu este proiect de pornire, acesta trebuie setat ca StartUp Project. ​ 
-  * Din PowerShell. Din meniul Tools al Microsoft Visual C++ 2010 Express, alegeți “PowerShell Command Prompt”. Se va deschide o fereastră PowerShell în folderul în care se află executabilele obținute în urma compilării proiectelor. Pentru rulare din linie de comandă, folosiți .\<​nume-proiect>​.exe.\\ 
-În imaginea de mai jos, proiectul ProiectSO a fost compilat din cadrul aplicației Microsoft Visual C++ 2010 Express. Pentru rularea executabilului din linia de comandă, rulăm “.\ProiectSO.exe”. 
- 
-{{:​so:​laboratoare:​resurse:​tutorial_powershell1.png?​400|}} 
- 
-Atenție! Observați calea în care se află exercutabilele compilate: folderul Debug aflat în cadrul locației colecției de proiecte (în cazul de față, ProiectSO, în care se află fișierul ProiectSO.sln). 
- 
-  * Din Cygwin. Folosind comenzi precum cd (change directory), modificați folderul de lucru în folderul proiectului.\\ 
- 
-{{:​so:​laboratoare:​resurse:​tutorial_run_cygwin.png?​400|}} 
- 
-=== Debugging === 
- 
-Visual Studio permite opțiunea de a face debugging unui program. Pașii pentru a utiliza debuggerul din cadrul Microsoft Visual C++ 2010 Express sunt următorii: 
- 
-==== Adăugarea unui breakpoint ==== 
-Pentru a adăuga un breakpoint, click pe linia la care doriți să adăugați breakpoint-ul și apăsați tasta F9 SAU apăsați din cadrul aplicației pe bara gri din stânga codului, în dreptul liniei de cod dorite. În exemplul de mai jos, am adăugat un breakpoint la linia 4 a fișierului hello.c, la intrarea în funcția add. 
- 
-{{:​so:​laboratoare:​resurse:​tutorial_debugg_5.png|}} 
- 
-=== Rularea pentru debugging === 
-Din meniul Debug al Microsoft Visual C++ 2010 Express, alegeți “Start Debugging” (Alternativ,​ folosiți F5).  
- 
-=== Adăugarea variabilelor de vizionat === 
-În urma rulării programului în modul debugging, execuția programului va fi suspendată la prima instrucțiune din flow-ul de execuție care conține un breakpoint setat. În acest moment, în fereastra editorului de text, există o secțiune în care se pot adăuga variabilele a căror evoluție dorim să le verificăm. În exemplul de mai jos, am adăugat parametrii a, b și c ai funcției add, precum și variabila locală sum. Puteți observa valorile cu care a fost apelată funcția (a=2, b=3, c=o adresă de pe stivă care indică spre o valoare neinițializată),​ precum și faptul că nu s-a alocat încă variabila locală sum.\\ 
- 
-{{:​so:​laboratoare:​resurse:​tutorial_debugg_4.png?​400|}} 
- 
-=== Rularea următorului pas === 
-Pentru continuarea execuției, puteți alege din meniul Debug, opțiunea Continue (sau F5). Aceasta va continua execuția până la întâlnirea următorului breakpoint sau până la finalizarea programului. 
- 
-Pentru a continua execuția step-by-step,​ alegeți din meniul Debug opțiunea Step Over (sau F10). Observați săgeata galbenă care indică instrucțiunea următoare, precum și cum se modifică variabilele monitorizate. 
- 
-|{{:​so:​laboratoare:​resurse:​tutorial_debugg_2.png?​300}}|{{:​so:​laboratoare:​resurse:​tutorial_debugg_6.png?​300}}| 
-|{{tutorial_debugg_1.png?​300}}|{{:​so:​laboratoare:​resurse:​tutorial_debugg_3.png?​300}}| 
-|{{:​so:​laboratoare:​resurse:​tutorial_debugg_8.png?​300}} ​         |{{:​so:​laboratoare:​resurse:​tutorial_debugg_7.png?​300}}| 
- 
- 
- 
-===== PowerShell ===== 
-O listă cu comenzile uzuale din PowerShell puteți găsi [[https://​devblogs.microsoft.com/​scripting/​table-of-basic-powershell-commands/​|aici]]. Multe dintre comenzile Windows au alias-uri care sunt similare comenzilor din lumea Unix. 
- 
-Printre cele mai uzuale comenzi, amintim: 
- 
-|Comandă Windows ​ |Alias ce poate fi folosit în PowerShell|Utilitate ​                                                                          | 
-|ipconfig ​        ​| ​                                      ​|Afișează informații despre plăcile de rețea (adrese IP, mască, default gateway etc.)| 
-|Set-Location ​    ​|cd ​                                    ​|Schimbarea directorului de lucru                                                    | 
-|Get-ChildItem ​   |ls                                     ​|Afișează fișierele și folderele dintr-un director ​                                  | 
-|Get-Content ​     |cat                                    |Afișarea conținutului unui fișier ​                                                  | 
-|Copy-Item ​       |cp                                     ​|Copierea unui fișier ​                                                               | 
-|Move-Item ​       |mv                                     ​|Redenumirea/​Mutarea unui fișier ​                                                    | 
-|Compare-Object ​  ​|compare/​diff ​                          ​|Compară două fișiere ​                                                               | 
-|Write-Output ​    ​|echo ​                                  ​|Afișează un mesaj                                                                   | 
-|Get-Location ​    ​|pwd ​                                   |Afișează directorul curent de lucru                                                 | 
-|Set-Variable ​    ​|set ​                                   |Setarea unei variabile de mediu\\ \\ Exemplu: set A “alpha” ​                        | 
-|mkdir ​           |md                                     ​|Crează un director ​                                                                 | 
-|Get-Help ​        ​|man/​help ​                              ​|Afișează informații despre o comandă din PowerShell ​                                | 
-|alias ​           |                                       ​|Afișează o listă cu toate alias-urile din PowerShell ​                               | 
-|Stop-Process ​    ​|kill ​                                  ​|Oprește un proces ​                                                                  | 
-|Get-History ​     |history ​                               |Afișează istoricul de comenzi ​                                                      | 
-|Invoke-WebRequest|wget/​curl ​                             |Accesarea conținutului unei pagini web din terminal ​                                | 
-|Remove-Item ​     |del                                    |Ștergere un director sau un fișier ​                                                 | 
- 
- 
- 
- 
-===== Git în CygWin ==== 
-==== Informații generale despre Cygwin ==== 
- 
-Cygwin este un utilitar dedicat Windows prin intermediul căruia se emulează un sistem de operare Unix și prin intermediul căruia se poate rula cod și se pot executa comenzi Unix într-un sistem de operare Windows. 
- 
-Cygwin emulează un sistem de operare Unix. În consecință,​ acesta expune utlizatorului un sistem de fișiere similar celor întâlnite în Unix, în care rădăcina acestuia se află în “/”. Utilizatorul curent are și un director home pentru lucrul în Cygwin. În cazul mașinii virtuale de laborator, utilizatorul Student are directorul home în “/​home/​Student” (vezi imaginea de mai jos).  
- 
-Ierarhia virtuală de fișiere folosită de Cygwin se poate accesa și din cadrul sistemului de operare Windows și se găsește în calea “C:​\cygwin”. ​ 
- 
-{{tutorial_cygwin.png?​400|}} 
- 
-==== Setarea infrastructurii de lucru pentru laborator folosind Cygwin ==== 
- 
-Pentru a face setup-ul de laborator, deschideți utilitarul Cygwin Terminal. Pentru a clona repository-ul cu exerciții de laborator, rulați comanda ''​git clone github.com/​systems-cs-pub-ro/​so''​. 
- 
-{{tutorial_git_clone.png?​400}} 
- 
-În cadrul directorului nou creat, exercițiile pentru laborator pentru platforma Windows se află în calea “labs/​lab<​nr>/​skel/​win”,​ unde <nr> este numărul laboratorului (de exemplu, pentru laboratorul 01, calea pentru exercițiile de laborator este “labs/​lab01/​skel/​win”). 
- 
-<note warning> 
-Repository-ul trebuie clonat o singură dată pe mașina virtuală. La începutul fiecarui laborator, rulați ''​git pull origin master''​ pentru a actualiza exercițiile de laborator. 
-</​note>​ 
- 
-Pentru a accesa din interfață grafică exercițiile de laborator, deschideți Window Explorer și accesați C->​cygwin->​home->​Student->​so->​labs->​lab<​nr>​->​skel->​win. 
- 
-{{tutorial_folders_files_2.png?​400}} 
- 
-Puteți deschide o fereastră Windows Explorer din cadrul terminalului Cygwin folosind comanda: “explorer.exe <​path>​”,​ unde <​path>​ este locația pe care doriți să o deschideți într-o fereastră Windows Explorer. În exemplul de mai jos, am parcurs ierarhia de fișiere până la exercițiile pentru platforma Windows pentru laboratorul 1 și am deschis o fereastră Windows Explorer plecând de la directorul curent. 
- 
-{{tutorial_cygwin_explorer.png?​400}} 
- 
-Cygwin este deja instalat în cadrul mașinii virtuale de Windows pentru laborator. Mai multe informații despre instalare, dar și ghiduri de folosire găsiți [[https://​www.cygwin.com/​|aici]]. 
- 
-Bonus! Puteți consulta și cheatsheet-ul de [[http://​faculty.nps.edu/​kmsquire/​cs2900/​cygwin/​fwcygwinref.pdf|aici]]. 
-===== Dr. Memory ===== 
- 
-Dr. Memory este un utilitar de debugging disponibil atât pe Linux, cât și pe Windows sau Mac și are o funcționalitate relativ similară Valgrindului. Cele mai comune tipuri de erori afișate de acesta sunt trecute în tabelul de mai jos, împreuna cu o scurtă explicație pentru fiecare și prin comparație cu erorile afișate de Valgrind: 
- 
-|Valgrind ​                 |Dr. Memory ​           |Explicatie ​                                                                                                       | 
-|Invalid read              |Unaddressable access ​ |Desemnează orice fel de acces de citire sau scriere dintr-o zonă de memorie nealocată. ​                           | 
-|Use of uninitialised value|Uninitialized read    |Se folosește (de exemplu ca parametru al unei funcții sau drept condiție într-o buclă) o variabila neinițializată.| 
-|Invalid free() ​           |Invalid heap argument |Apare când parametrul lui free() nu pointeaza către o zona alocată în prealabil pe heap.                          | 
-|Memory leaks              |Memory leaks          |                                                                                                                  | 
- 
- 
-Pentru mai multe detalii despre erorile depistate de Dr. Memory, puteți consulta documentația acestuia, disponibilă [[https://​dynamorio.org/​drmemory_docs/​page_types.html|aici]]. 
- 
-==== Rulare ==== 
- 
-Un exemplu de rulare a Dr. Memory, împreună cu erorile afișate de acesta și codul cu care s-a generat executabilul pe care s-a rulat utilitarul se găsește mai jos: 
- 
-Vom compila codul de mai jos, care are un memory leak evident, și îl vom rula cu Dr. Memory. 
-<code C> 
-#include <​stdio.h>​ 
-#include <​stdlib.h>​ 
- 
-int main(void) 
-{ 
-    printf("​Sup?​\n"​);​ 
-    malloc(1000);​ 
- 
-    return 0; 
-} 
-</​code>​ 
- 
-În primul rând, pentru a avea simbolurile de debug în binarul nostru, este nevoie să-i pasam linkerului parametrul ''/​Zi'',​ după cum se poate vedea in Makefile-ul de mai jos. Acest parametru face ca linkerul să păstreze în binarul executabil informații precum numele funcțiilor,​ numerele liniilor și altele asemenea, informații care sunt preluate din fișierul obiect. 
-<code Makefile>​ 
-CPP = cl 
-UTILS_DIR=../​utils 
- 
-CFLAGS = /nologo /W3 /​D_CRT_SECURE_NO_WARNINGS /​I$(UTILS_DIR) 
-# https://​dynamorio.org/​drmemory_docs/​page_prep.html#​sec_prep_debuginfo 
- 
-LDFLAGS = /Zi 
- 
-FILE = test 
- 
-build: $(FILE).exe 
- 
-$(FILE).exe:​ $(FILE).obj 
-        $(CPP) $(LDFLAGS) /Fe$@ $%%**%% 
- 
-clean: 
-   del /Q /S /F *.obj *.exe *.ilk *.pdb 
- 
-</​code>​ 
- 
-Observăm acum că pe lângă fișierele ''​.obj''​ si ''​.exe''​ la care ne așteptam, au mai fost create și unul ''​.pdb''​ și unul ''​.ilk''​. Fișierul ''​.pdb''​ conține simbolurile de debug din program, iar cel ''​.ilk''​ este folosit de linker pentru a linka binarul final în mod incremental. 
- 
-<note important>​ 
-Dr. Memory trebuie rulat într-un shell Cygwin, pornit cu drepturi de administrator (“Run as administrator”). De asemenea, dacă lucrați pe mașina voastră fizică și aveți antivirus, va trebui să-l opriți când rulați Dr. Memory. 
-</​note>​ 
- 
-Astfel, ruland binarul creat cu Dr. Memory in , obtinem urmatorul output: 
- 
-<​code>​ 
-$ drmemory.exe -batch test.exe 
-~~Dr.M~~ Dr. Memory version 2.3.0 
-~~Dr.M~~ Running "​test.exe"​ 
-~~Dr.M~~ Using system call file C:​\Users\teodu\AppData\Roaming\Dr. Memory\symcache\syscalls_wow64.txt 
-Sup? 
-~~Dr.M~~ 
-~~Dr.M~~ Error #1: UNINITIALIZED READ: reading 0x00affdcc-0x00affdd0 4 byte(s) within 0x00affdb0-0x00affdd0 
-~~Dr.M~~ # 0 system call NtDeviceIoControlFile InputBuffer 
-~~Dr.M~~ # 1 aswhook.dll!?​                                                  +0x0          (0x74af3c2e <​aswhook.dll+0x3c2e>​) 
-~~Dr.M~~ # 2 KERNEL32.dll!ExitProcessImplementation 
-~~Dr.M~~ # 3 exit_or_terminate_process                                       [minkernel\crts\ucrt\src\appcrt\startup\exit.cpp:​143] 
-~~Dr.M~~ # 4 common_exit                                                     [minkernel\crts\ucrt\src\appcrt\startup\exit.cpp:​280] 
-~~Dr.M~~ # 5 exit                                                            [minkernel\crts\ucrt\src\appcrt\startup\exit.cpp:​293] 
-~~Dr.M~~ # 6 %%__%%scrt_common_main_seh                                          [d:​\agent\_work\3\s\src\vctools\crt\vcstartup\src\startup\exe 
-_common.inl:​295] 
-~~Dr.M~~ # 7 KERNEL32.dll!BaseThreadInitThunk 
-~~Dr.M~~ Note: @0:​00:​00.998 in thread 8464 
-~~Dr.M~~ 
-~~Dr.M~~ Error #2: LEAK 1000 direct bytes 0x01229850-0x01229c38 + 0 indirect bytes 
-~~Dr.M~~ # 0 replace_malloc                   [d:​\drmemory_package\common\alloc_replace.c:​2577] 
-~~Dr.M~~ # 1 main 
-~~Dr.M~~ 
-~~Dr.M~~ ERRORS FOUND: 
-~~Dr.M~~           0 unique,         0 total unaddressable access(es) 
-~~Dr.M~~           1 unique,         1 total uninitialized access(es) 
-~~Dr.M~~           0 unique,         0 total invalid heap argument(s) 
-~~Dr.M~~           0 unique,         0 total GDI usage error(s) 
-~~Dr.M~~           0 unique,         0 total handle leak(s) 
-~~Dr.M~~           0 unique,         0 total warning(s) 
-~~Dr.M~~           1 unique,         1 total,   1000 byte(s) of leak(s) 
-~~Dr.M~~           0 unique,         0 total,          0 byte(s) of possible leak(s) 
-~~Dr.M~~ ERRORS IGNORED: 
-~~Dr.M~~           1 potential error(s) (suspected false positives) 
-~~Dr.M~~              (details:​ C:​\Users\teodu\AppData\Roaming\Dr. Memory\DrMemory-test.exe.10596.000\potential_errors.txt) 
-~~Dr.M~~           2 potential leak(s) (suspected false positives) 
-~~Dr.M~~              (details:​ C:​\Users\teodu\AppData\Roaming\Dr. Memory\DrMemory-test.exe.10596.000\potential_errors.txt) 
-~~Dr.M~~          31 unique,   103 total,  25563 byte(s) of still-reachable allocation(s) 
-~~Dr.M~~              (re-run with "​-show_reachable"​ for details) 
-~~Dr.M~~ Details: C:​\Users\teodu\AppData\Roaming\Dr. Memory\DrMemory-test.exe.10596.000\results.txt 
-</​code>​ 
- 
-Observăm ca Dr. Memory găsește leakul de 1000 de octeți cauzat de apelul funcției ''​malloc()''​. Pe deasupra, Dr. Memory mai raporteaza și o citire invalida, dar aceasta este  de fapt un “fals positive” cauzat de runtime-ul care gestionează terminarea programului. 
- 
-În mod normal, Dr. Memory deschide fișierul menționat la final, si anume ''​C:​\Users\<​user>​\AppData\Roaming\Dr. Memory\DrMemory-test.exe.<​ID>​.000\results.txt''​ in Notepad. Acest fisier contine outputul de mai sus. Pentru a opri acest comportament,​ folosim parametrul ''​-batch'',​ așa cum este ilustrat mai sus. 
- 
-Dr. Memory ne recomandă să folosim și parametrul ''​-show_reachable''​. Acesta ne va afișa un număr mare de aparente leak-uri “still reachable”,​ care sunt tot false positives. Un astfel de leak este: 
-<​code>​ 
-~~Dr.M~~ Error #2: REACHABLE LEAK 132 direct bytes 0x014800f8-0x0148017c + 0 indirect bytes 
-~~Dr.M~~ <memory was allocated before tool took control> 
-</​code>​ 
- 
-Precizarea “memory was allocated before tool took control” ne explică faptul că eroarea își are originea de fapt în bibliotecile sistemului, care alocă memorie pe care nu mai are nevoie să o dealoce, din moment ce durata de viață a acesteia este aceeași cu cea a procesului. 
so/laboratoare/resurse/windows-laborator.1614456379.txt.gz · Last modified: 2021/02/27 22:06 by maria.mihailescu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0