Differences

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

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
sesiuni:memory:2 [2013/07/08 13:10]
asendroiu [Stiva]
sesiuni:memory:2 [2013/07/09 16:07]
asendroiu [Virtual Memory. Stack]
Line 1: Line 1:
 += Virtual Memory. Stack =
 +* [[sesiuni:​memory:​| Back to workshop]]
 +* {{:​sesiuni:​memory:​session-02.pdf|Download slides}}
 +* {{:​sesiuni:​memory:​session-02-tasks.zip|Download tasks}}
 +
 +<​html>​
 +<​center>​
 +<iframe src="​http://​docs.google.com/​viewer?​url=http://​workshop.rosedu.org/​2013/​_media/​sesiuni/​memory/​session-02.pdf&​embedded=true&​time=0"​ width="​600"​ height="​470" ​  ​style="​border:​ none;"></​iframe>​
 +</​center>​
 +</​html>​
 = Tasks = = Tasks =
-== Memoria ​Virtuala. Spațiul de adresă ==+ 
 +Rulați ''​make''​ pentru a compila sursele din directorul session-02-tasks. 
 + 
 +== Memoria ​Virtuală. Spațiul de adresă ==
   - Formatul ELF   - Formatul ELF
-    * Compilati programul ''​adr_space.c''​. ​Folosiți utilitarul ''​readelf''​ pentru a afisa informații despre secțiunile executabilului ''​adr_space''​. (Hint: man readelf, search: sections)+    * Folosiți utilitarul ''​readelf''​ pentru a afisa informații despre secțiunile executabilului ''​adr_space''​. (Hint: man readelf, search: sections)
     * Identificați secțiunile ''​.text'',​ ''​.rodata'',​ ''​.data''​ și ''​.bss''​. Observați diferențele în coloana ''​Type''​ între ''​.bss''​ și ''​.data''​. Ce înseamnă ele?     * Identificați secțiunile ''​.text'',​ ''​.rodata'',​ ''​.data''​ și ''​.bss''​. Observați diferențele în coloana ''​Type''​ între ''​.bss''​ și ''​.data''​. Ce înseamnă ele?
   - Secțiunile unui executabil   - Secțiunile unui executabil
Line 19: Line 32:
   - Rulați programul ''​return_array''​. De ce nu funcționează?​ Corectați programul astfel încât să funcționeze corect.   - Rulați programul ''​return_array''​. De ce nu funcționează?​ Corectați programul astfel încât să funcționeze corect.
   - Rulați programul ''​params''​. Cum explicați comportamentul?​   - Rulați programul ''​params''​. Cum explicați comportamentul?​
-  - Rulați programul ''​stackframe''​. Programul realizează apelurile de funcții ''​main''​ -> ''​f''​ -> ''​g''​. Funcția g afișează conținutul stivei. Identificați frame-urile corespunzătoare funcțiilor ''​main'',​ ''​f''​ și ''​g''​.+  - Rulați programul ''​stackframe''​. Programul realizează apelurile de funcții ''​main''​ -> ''​f''​ -> ''​g''​. Funcția g afișează conținutul stivei. Identificați frame-urile corespunzătoare funcțiilor ''​main'',​ ''​f''​ și ''​g''​. Care sunt adresele de return? Folosiți utilitarul ''​addr2line''​ pentru a verifica faptul că adresa de return este într-adevăr imediat după apelul funcției. 
 + 
 +== GDB == 
 +  - Rulați programul ''​bug''​. Vom folosi GDB pentru a identifica motivul erorii. 
 + 
 +<​code>​ 
 +gdb ./bug 
 +</​code>​ 
 + 
 +<​code>​ 
 +(gdb) run 
 +</​code>​ 
 + 
 +Programul se va opri la linia care a cauzat accesul invalid. Pentru a afișa valorile variabilelor folosim comanda ''​print''​. 
 + 
 +După ce am identificat ce variabilă are o valoare nevalidă vrem să aflăm motivul pentru care a ajuns așa. Folosiți comanda ''​backtrace''​ pentru a afișa stiva de apeluri. 
 + 
 +<​code>​ 
 +(gdb) backtrace 
 +#0  0x0804846a in initialize (entries=0x0,​ num=5) at bug.c:15 
 +#1  0x080484c5 in allocate (n=5) at bug.c:31 
 +#2  0x080484df in main () at bug.c:41 
 +</​code>​ 
 + 
 +Folosiți comanda ''​frame''​ pentru a vă muta în cadrul unui alt frame din stiva de apeluri 
 +<​code>​ 
 +(gdb) frame 1 
 +#1  0x080484c5 in allocate (n=5) at bug.c:31 
 +31 initialize(w,​ n); 
 +</​code>​ 
 + 
 +Verificați valorile cu care a fost apelată funcția ''​initialize''​. De unde provin aceste valori? Folosiți comanda ''​list''​ pentru a afișa codul sursă din jurul liniei curente. Investigați celelalte variabile din funcție și identificați sursa problemei.
 == Fun == == Fun ==
   - Sunt informațiile despre secțiuni absolut necesare? Analizați programul elf_magic. Câte secțiuni conține programul? Câte segmente conține programul? Credeți că programul va rula?   - Sunt informațiile despre secțiuni absolut necesare? Analizați programul elf_magic. Câte secțiuni conține programul? Câte segmente conține programul? Credeți că programul va rula?
sesiuni/memory/2.txt · Last modified: 2013/07/09 16:07 by asendroiu