Differences

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

Link to this comparison view

so:laboratoare:laborator-07 [2019/03/30 12:07]
dragos_florin.costea [Exercițiul 1 - Custom Profiling]
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 259: Line 257:
 {{ :​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>​Folosiți arhiva [[http://elf.cs.pub.ro/so/res/laboratoare/lab07-tasks.zip | lab07-tasks.zip]] aferentă laboratorului.</note>+<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}''​.
  
 +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]]. 
  
  
Line 284: 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 ==== 
  
 +==== 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: +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''​. ​
-[[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]]+
  
 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 311: 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 363: 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 418: 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.1553940465.txt.gz · Last modified: 2019/03/30 12:07 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