This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision Last revision Both sides next revision | ||
bune-practici [2015/11/30 16:48] catalin.vasile3004 [Segmentation Fault debugging: GDB quicky] |
bune-practici [2015/11/30 17:00] catalin.vasile3004 [Segmentation Fault debugging: GDB quicky] |
||
---|---|---|---|
Line 221: | Line 221: | ||
./segfault param1 param2 param3 < fisier.in > fisier.out | ./segfault param1 param2 param3 < fisier.in > fisier.out | ||
</code> | </code> | ||
- | ''set disassembly-flavor intel'' vă ajută pentru a afişa eventualele printări de cod de asamblare într-o sintaxă cunoscută. Limbajul de asamblare reprezintă un set de alias-uri pentru instrucţiunile din binarul unui program. Aceste alias-uri nu au o formă standardizată motiv pentru care acestea diferă de la un asamblor la altul. By default, tool-urile din Linux folosesc sintaxa [[https://en.wikibooks.org/wiki/X86_Assembly/GAS_Syntax|AT&T]]. 99% din tool-urile din Linux (gdb NU se află printre ele) pot primii argumentul ''-M intel'' pentru a afişa sau a trata codul de asamblare ca şi cum ar fi în sintaxa recomandată de Intel (care se regăseşte şi la NASM). Programe care pot primi acest flag sunt: gcc (gas), objdump, etc. | + | ''set disassembly-flavor intel'' vă ajută pentru a afişa eventualele printări de cod de asamblare într-o sintaxă cunoscută. Limbajul de asamblare reprezintă un set de alias-uri pentru instrucţiunile din binarul unui program. Aceste alias-uri nu au o formă standardizată motiv pentru care acestea diferă de la un asamblor la altul. By default, tool-urile din Linux folosesc sintaxa [[https://en.wikibooks.org/wiki/X86_Assembly/GAS_Syntax|AT&T]]. 99% din tool-urile din Linux (gdb NU se află printre ele) pot primii argumentul ''-M intel'' pentru a afişa sau a trata codul de asamblare ca şi cum ar fi în sintaxa recomandată de Intel (care se regăseşte şi la NASM). Programe care pot primi acest flag sunt: gcc (gas), objdump, etc.\\ |
**Revenind la gdb**, în momentul în care rulăm o să ne dea următoarea eroare: | **Revenind la gdb**, în momentul în care rulăm o să ne dea următoarea eroare: | ||
<code bash> | <code bash> | ||
Line 234: | Line 234: | ||
</code> | </code> | ||
Pentru a vedea ce instrucţiunea a provocat segfault, putem da următoarea comandă: | Pentru a vedea ce instrucţiunea a provocat segfault, putem da următoarea comandă: | ||
- | <code> | + | <code bash> |
(gdb) display/10i $pc | (gdb) display/10i $pc | ||
1: x/10i $pc | 1: x/10i $pc | ||
Line 251: | Line 251: | ||
* **display** face dump de la un pointer dat ca argument, în cazul nostru **$pc** | * **display** face dump de la un pointer dat ca argument, în cazul nostru **$pc** | ||
* **i**-ul îi spune lui **display** să interpreteze datele de acolo ca şi cum ar fi instrucţiuni | * **i**-ul îi spune lui **display** să interpreteze datele de acolo ca şi cum ar fi instrucţiuni | ||
- | * **10** îi sune lui **display** câţi operanzi/instrucţiuni de tipul **i** (instrucţiune) să afişeze\\ \\ | + | * **10** îi spune lui **display** câţi operanzi de tipul **i** (instrucţiune) să afişeze\\ \\ |
Prin ''<keep_printing+some_number>'', **gdb** incearcă să ne arate cam pe unde ar fi această instrucţiune. În cazul nostru instrucţiunea este aproape de label-ul **keep_printing**.\\ | Prin ''<keep_printing+some_number>'', **gdb** incearcă să ne arate cam pe unde ar fi această instrucţiune. În cazul nostru instrucţiunea este aproape de label-ul **keep_printing**.\\ | ||
Pentru a vedea ce valoare a avut un registru la momentul în care s-a declanşat **segfault**-ul, puteţi da: | Pentru a vedea ce valoare a avut un registru la momentul în care s-a declanşat **segfault**-ul, puteţi da: |