Pagini
Workshops
Parteneri
This shows you the differences between two versions of the page.
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? |