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:22]
maria.mihailescu [Windows - Tips&Tricks]
so:laboratoare:resurse:windows-laborator [2021/02/27 22:28] (current)
maria.mihailescu
Line 4: Line 4:
 Resurse pentru lucrul cu Windows in cadrul materiei: Resurse pentru lucrul cu Windows in cadrul materiei:
   * [[so/​laboratoare/​resurse/​windows-laborator/​tutorial-visual-studio| Tutorial Visual Studio]]   * [[so/​laboratoare/​resurse/​windows-laborator/​tutorial-visual-studio| Tutorial 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 ]]
  
  
-{{indexmenu>​so:​laboratoare:​resurse:​windows-laborator#​0}} 
-===== 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.1614457369.txt.gz · Last modified: 2021/02/27 22:22 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