Differences

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

Link to this comparison view

so:laboratoare:laborator-07 [2019/03/30 11:14]
dragos_florin.costea
so:laboratoare:laborator-07 [2022/04/19 17:47] (current)
teodor_stefan.dutu [Nice to Watch]
Line 1: Line 1:
 ====== Laborator 07 - Profiling & Debugging ====== ====== Laborator 07 - Profiling & Debugging ======
  
-===== Materiale ajutătoare ===== 
- 
-  *[[http://​elf.cs.pub.ro/​so/​res/​laboratoare/​lab07-slides.pdf | lab07-slides.pdf]] ​ 
  
 ==== Nice to Watch ==== ==== Nice to Watch ====
   *[[http://​www.youtube.com/​watch?​v=73IyVBMf2uY | Google I/O 2010 - Measure in milliseconds:​ Meet Speed Tracer]]   *[[http://​www.youtube.com/​watch?​v=73IyVBMf2uY | Google I/O 2010 - Measure in milliseconds:​ Meet Speed Tracer]]
-  *[[http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-172-performance-engineering-of-software-systems-fall-2010/​video-lectures/​lecture-5-performance-engineering-with-profiling-tools/​ | MIT Lecture: Performance Engineering with Profiling Tools]]+  *[[https://www.youtube.com/​watch?​v=7a89iFEEpTo&​ab_channel=MITOpenCourseWare | MIT Lecture: Performance Engineering with Profiling Tools]] 
 +  *[[https://​dspace.mit.edu/bitstream/handle/​1721.1/​122680/​6-172-fall-2010/contents/​video-lectures/​lecture-5-performance-engineering-with-profiling-tools/​MIT6_172F10_lec05.pdf|slides]]
  
 ==== Latency Comparison Numbers ==== ==== Latency Comparison Numbers ====
Line 29: Line 27:
   * Originally by Peter Norvig: http://​norvig.com/​21-days.html#​answers   * Originally by Peter Norvig: http://​norvig.com/​21-days.html#​answers
  
 +===== Link-uri către secțiuni utile =====
 +==== Linux ====
 +  * [[#Profiler și tehnici de profiling|Profiler și tehnici de profiling]]
 +  * [[#Unelte de profiling|Unelte de profiling]]
 +  * [[#​Utilizare perf|Utilizare perf]]
 +  * [[#Unelte de debugging|Unelte de debugging]]
 ===== Profiler și tehnici de profiling ===== ===== Profiler și tehnici de profiling =====
  
Line 39: Line 43:
   ***hardware**,​ unele procesoare sunt dotate cu contoare de temporizare ([[http://​en.wikipedia.org/​wiki/​Time_Stamp_Counter |Time Stamp Counter - TSC]]) sau contoare de performanță care numără evenimente precum cicluri de procesor sau TLB miss-uri.   ***hardware**,​ unele procesoare sunt dotate cu contoare de temporizare ([[http://​en.wikipedia.org/​wiki/​Time_Stamp_Counter |Time Stamp Counter - TSC]]) sau contoare de performanță care numără evenimente precum cicluri de procesor sau TLB miss-uri.
  
-==== Tehnica de instrumentare ====+Două moduri prin care se realizează profiling-ul sunt prezentate în continuare:​ 
 + 
 +==== Tehnica de instrumentare ​(instrumentation) ​====
 Profiler-ele bazate pe această tehnică necesită de obicei **modificări** în codul programului:​ se inserează secțiuni de cod la începutul și sfârșitul funcției ce se dorește analizată. De asemenea, se rețin și funcțiile apelate. Astfel, se poate estima timpul total al apelului în sine cât și al apelurilor de subfuncții. Profiler-ele bazate pe această tehnică necesită de obicei **modificări** în codul programului:​ se inserează secțiuni de cod la începutul și sfârșitul funcției ce se dorește analizată. De asemenea, se rețin și funcțiile apelate. Astfel, se poate estima timpul total al apelului în sine cât și al apelurilor de subfuncții.
 **Dezavantajul** major al acestor profilere este legat de modificarea codului: în funcții de dimensiune scăzută și des apelate, acest overhead poate duce la o interpretare greșită a rezultatelor. **Dezavantajul** major al acestor profilere este legat de modificarea codului: în funcții de dimensiune scăzută și des apelate, acest overhead poate duce la o interpretare greșită a rezultatelor.
Line 49: Line 55:
  
  
-===== Unelte =====+===== Unelte ​de profiling ​=====
  
 În continuare sunt prezentate câteva unelte folosite în profiling. În continuare sunt prezentate câteva unelte folosite în profiling.
Line 71: Line 77:
 Un tutorial despre perf găsiți [[https://​perf.wiki.kernel.org/​index.php/​Tutorial|aici]]. Un tutorial despre perf găsiți [[https://​perf.wiki.kernel.org/​index.php/​Tutorial|aici]].
  
-===== Utilizare ====+===== Utilizare ​perf ====
 <code bash> <code bash>
 $ perf [--version] [--help] COMMAND [ARGS] $ perf [--version] [--help] COMMAND [ARGS]
Line 208: Line 214:
 </​code>​ </​code>​
  
-===== Debugging ​=====+===== Unelte de debugging ​=====
 ==== strace ==== ==== strace ====
  
-strace interceptează şi înregistrează apelurile de sistem făcute de un proces şi semnalele pe care acesta le primeşte. În cea mai simplă formă ''​strace''​ rulează comanda specificată până când procesul asociat se încheie.+''​strace'' ​interceptează şi înregistrează apelurile de sistem făcute de un proces şi semnalele pe care acesta le primeşte. În cea mai simplă formă ''​strace''​ rulează comanda specificată până când procesul asociat se încheie.
  
 <code bash> <code bash>
Line 234: Line 240:
  </​code>​  </​code>​
 Un alt utilitar înrudit cu ''​strace''​ este [[http://​linux.die.net/​man/​1/​ltrace | ltrace]]. Acesta urmăreşte apelurile de bibliotecă. Un alt utilitar înrudit cu ''​strace''​ este [[http://​linux.die.net/​man/​1/​ltrace | ltrace]]. Acesta urmăreşte apelurile de bibliotecă.
 +
 ==== gdb ==== ==== gdb ====
-Scopul unui debugger (de exemplu GDB) este să ne permită să inspectăm ce se întâmplă //în interiorul//​ unui program în timp ce acesta rulează sau în momentul când s-a produs o eroare fatală.+Scopul unui debugger (de exemplu GDB, prin comanda ''​gdb''​) este să ne permită să inspectăm ce se întâmplă //în interiorul//​ unui program în timp ce acesta rulează sau la terminarea execuției acestuia, ​în momentul când s-a produs o eroare fatală, pe baza fișierului //​coredump//​ creat de către acesta.
  
 Mai multe detalii în secțiunea de [[http://​ocw.cs.pub.ro/​courses/​so/​laboratoare/​resurse/​gdb | resurse]]. Mai multe detalii în secțiunea de [[http://​ocw.cs.pub.ro/​courses/​so/​laboratoare/​resurse/​gdb | resurse]].
 ==== valgrind ==== ==== valgrind ====
  
 +Valgrind reprezintă o suită de utilitare folosite pentru debugging și profiling. Printre cele mai folosite tool-uri sau unelte din această suită sunt:
 + 
 +  *''​memcheck'' ​  - Realizează analiza utilizării memoriei ​
 +  *''​cachegrind''​ - Realizează analiza performanței cache-ului
 +  *''​helgrind'' ​  - Folosit pentru depanarea condițiilor de cursă în cadrul programelor cu multiple fire de execuție (multithreaded).
 + 
 Mai multe detalii [[http://​ocw.cs.pub.ro/​courses/​so/​laboratoare/​laborator-05#​valgrind | aici]]. Mai multe detalii [[http://​ocw.cs.pub.ro/​courses/​so/​laboratoare/​laborator-05#​valgrind | aici]].
 ==== Alte utilitare ==== ==== Alte utilitare ====
 {{ :​so:​laboratoare:​tools.png?​700x500 }} {{ :​so:​laboratoare:​tools.png?​700x500 }}
  
-  *[[ http://elf.cs.pub.ro/so/​wiki/​laboratoare/​resurse/​oprofile ​|Oprofile]] ​+  *[[ http://oprofile.sourceforge.net/download ​|Oprofile]] ​
   *[[http://​www.microsoft.com/​downloads/​details.aspx?​familyid=d6e95259-8d9d-4c22-89c4-fad382eddcd1&​displaylang=en|Kernrate]] este un echivalent al oprofile pentru Windows.   *[[http://​www.microsoft.com/​downloads/​details.aspx?​familyid=d6e95259-8d9d-4c22-89c4-fad382eddcd1&​displaylang=en|Kernrate]] este un echivalent al oprofile pentru Windows.
   *[[http://​kcachegrind.sourceforge.net/​html/​Home.html|KCachegrind]]   *[[http://​kcachegrind.sourceforge.net/​html/​Home.html|KCachegrind]]
   *[[http://​code.google.com/​p/​google-perftools/​ | perf-tools]]   *[[http://​code.google.com/​p/​google-perftools/​ | perf-tools]]
-  *[[http://blogs.msdn.com/ntdebugging/archive/2008/​04/​03/​windows-performance-toolkit-xperf.aspx|XPerf]]+  *[[http://metadataconsulting.blogspot.com/2017/05/How-to-install-and-use-Windows-Performance-Toolkit.html|XPerf]]
   *[[ http://​sourceware.org/​binutils/​docs/​gprof |GNU gprof]]   *[[ http://​sourceware.org/​binutils/​docs/​gprof |GNU gprof]]
 ====== Exerciții ====== ====== Exerciții ======
  
 +<note important>​
 +În cadrul laboratoarelor vom folosi repository-ul de git al materiei SO - https://​github.com/​systems-cs-pub-ro/​so. Va trebui sa clonați repository-ul pe masinile virtuale folosind comanda: ''​git clone https://​github.com/​systems-cs-pub-ro/​so''​. Dacă doriți să descărcați repositoryul în altă locație, folosiți comanda ''​git clone https://​github.com/​systems-cs-pub-ro/​so ${target}''​.
  
-===== Exerciții laborator ​Linux =====+Pentru a actualiza repository-ul,​ folosiți comanda ''​git pull origin master''​ din interiorul directorului în care se află repository-ul. Recomandarea este să îl actualizați cât mai frecvent, înainte să începeți lucrul, pentru a vă asigura că aveți versiunea cea mai recentă. În cazul în care gitul detectează conflicte la nivelul vreunui fişier, folosiți următoarele comenzi pentru a vă păstra modificările:​ 
 +<​code>​ 
 +git stash 
 +git pull origin master 
 +git stash pop 
 +</​code>​
  
-===== Exercițiul 0 - Joc interactiv =====+Pentru mai multe informații despre folosirea utilitarului git, urmați ghidul de la https://​gitimmersion.com. 
 +</​note>​
  
-  * Detalii desfășurare [[http://​ocw.cs.pub.ro/​courses/​so/​meta/​notare#​joc_interactiv|joc]]. 
  
-<note important>​Folosiți arhiva [[http://​elf.cs.pub.ro/​so/​res/​laboratoare/​lab07-tasks.zip | lab07-tasks.zip]] aferentă laboratorului.</​note>​+ 
 +===== Linux =====
  
 <note important>​ <note important>​
Line 268: Line 289:
  
 <note important>​ <note important>​
-Pentru a putea face exercițiile e nevoie de utilitarul ​''​linux-tools''​. Puteți verifica asta rulând comanda ''​perf %%--%%help''​. Dacă comanda ​nu găsită, trebuie să instalați pachetul:+Pentru a putea face exercițiile e nevoie de pachetul ​''​linux-tools''​. Puteți verifica asta rulând comanda ''​perf %%--%%help''​. Dacă utilitarul ''​perf'' ​nu este găsit, trebuie să instalați pachetul ​folosind comenzile:
  
 <code bash> <code bash>
 student@so:​~$ sudo apt-get update student@so:​~$ sudo apt-get update
 +student@so:​~$ sudo apt-get install linux-tools-generic
 +</​code>​
 +<​hidden>​
 +<code bash>
 +Pachetul de mai jos este prea vechi, cred că așa că am pus meta-pachetul generic
 student@so:​~$ sudo apt-get install linux-tools-4.15.0-34-generic student@so:​~$ sudo apt-get install linux-tools-4.15.0-34-generic
 </​code>​ </​code>​
 +</​hidden>​
 </​note>​ </​note>​
  
-==== Exercițiul 1 - Custom Profiling ==== 
  
  
-//Perf// pune la dispoziție un mod de a extrage datele importante din profiling prin suportul de scripting oferit de ''​perf script''​. Acesta funcționează împreună cu ''​perf record''​ care obține lista de sample-uri și o salvează în fișierul ''​perf.data''​. ​Cu ajutorul lui ''​perf script''​ se pot parsa eventurile înregistrate în sample-uri în metoda ''​process_event''​. Mai multe informații despre ''​perf script''​ se pot găsi la: + 
-[[http://​man7.org/​linux/​man-pages/​man1/​perf-script-python.1.html|man perf-script-python]] și [[https://​lwn.net/​Articles/​620900/​|exemplu de utilizare]]+==== Exercițiul 1 - Custom Profiling ==== 
 + 
 +Scopul exercițiului este să analizăm numărul de instrucțiuni executate de către procesor pe baza unui executabil. ​Perf pune la dispoziție un mod de a extrage datele importante din profiling prin suportul de scripting oferit de ''​perf script''​. Acesta funcționează împreună cu ''​perf record''​ care obține lista de sample-uri și o salvează în fișierul ''​perf.data''​. ​
  
 Intrați în directorul ''​1-custom''​. Primul pas este să generăm fișierul ''​perf.data''​ care conține sampleurile. Pentru asta executați : Intrați în directorul ''​1-custom''​. Primul pas este să generăm fișierul ''​perf.data''​ care conține sampleurile. Pentru asta executați :
Line 293: Line 320:
 Folosiți ''​wc -l''​ pentru a număra liniile outputului și ''​grep'' ​ pentru a filtra după simbolul ''​hash_search_index''​. Pentru a face calcule cu numere raționale folosiți o comandă de tipul: ''​echo 7/2 | bc -l''​. Folosiți ''​wc -l''​ pentru a număra liniile outputului și ''​grep'' ​ pentru a filtra după simbolul ''​hash_search_index''​. Pentru a face calcule cu numere raționale folosiți o comandă de tipul: ''​echo 7/2 | bc -l''​.
 </​note>​ </​note>​
 +
 +Opțional, puteți folosi script-ul pus la dispoziție în cadrul laboratorului pentru a calcula numărul de accese în cadrul funcției ''​hash_search_index''​. Cu ajutorul lui perf script se pot parsa eventurile înregistrate în sample-uri în metoda ''​process_event''​. Mai multe informații despre ''​perf script''​ se pot găsi la: [[http://​man7.org/​linux/​man-pages/​man1/​perf-script-python.1.html|man perf-script-python]] și [[https://​lwn.net/​Articles/​620900/​|exemplu de utilizare]]
  
 Verificați rezultatul utilizând comanda ''​perf report''​. Verificați rezultatul utilizând comanda ''​perf report''​.
Line 345: Line 374:
  
 Observați că diferența între adresa variabilei ''​access''​ și adresa bufferului ''​name''​ este de 0x10 (16) octeți, ceea ce înseamnă că variabila ''​access''​ se află imediat la sfârșitul datelor din bufferul ''​name''​. Observați că diferența între adresa variabilei ''​access''​ și adresa bufferului ''​name''​ este de 0x10 (16) octeți, ceea ce înseamnă că variabila ''​access''​ se află imediat la sfârșitul datelor din bufferul ''​name''​.
 +
 +<note important>​
 +Este posibil ca diferența dintre ''​access''​ și ''​name''​ să difere în funcție de arhitectura pe care lucrați. Calculați diferența dintre cele două adrese folosind valorile printate de ''​gdb''​
 +</​note>​
  
 Folosindu-vă de informațiile obținute, construiți un input convenabil pe care să îl oferiți executabilului ''​exploit'',​ astfel încât acesta să vă afișeze stringul "Good job, you hacked me!". Folosindu-vă de informațiile obținute, construiți un input convenabil pe care să îl oferiți executabilului ''​exploit'',​ astfel încât acesta să vă afișeze stringul "Good job, you hacked me!".
Line 400: Line 433:
  
 /* [[http://​elf.cs.pub.ro/​so/​res/​laboratoare/​lab12-sol.zip | lab12-sol.zip]] */ /* [[http://​elf.cs.pub.ro/​so/​res/​laboratoare/​lab12-sol.zip | lab12-sol.zip]] */
-====== Soluții ====== 
-  *[[http://​elf.cs.pub.ro/​so/​res/​laboratoare/​lab07-sol.zip | Soluții laborator 7]] 
  
 ====== Resurse utile ====== ====== Resurse utile ======
so/laboratoare/laborator-07.1553937260.txt.gz · Last modified: 2019/03/30 11:14 by dragos_florin.costea
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