Ferramentas do usuário

Ferramentas do site


prog2:depuracao

Diferenças

Aqui você vê as diferenças entre duas revisões dessa página.

Link para esta página de comparações

Ambos lados da revisão anterior Revisão anterior
Próxima revisão
Revisão anterior
prog2:depuracao [2019/04/30 12:23]
maziero
prog2:depuracao [2019/10/09 15:30] (atual)
maziero
Linha 11: Linha 11:
 </​code>​ </​code>​
  
 +Feito isso, o programa está pronto para ser depurado com as ferramentas apresentadas a seguir.
 ===== Depuração de execução ===== ===== Depuração de execução =====
  
Linha 120: Linha 121:
 ==== Depuradores de memória ==== ==== Depuradores de memória ====
  
-  * [[https://​en.wikipedia.org/​wiki/​Mtrace|Mtrace]] +Ferramentas como [[https://​en.wikipedia.org/​wiki/​Mtrace|Mtrace]] ​[[http://​valgrind.org/​|Valgrind]] ​realizam a análise dinâmica do programa ​(ou seja, durante sua execuçãopara encontrar erros relacionados à memória.
-  * [[http://​valgrind.org/​|Valgrind]] (vide opções ''​--tool=memcheck'' ​ou ''​--tool=exp-sgcheck''​)+
  
-análise dinâmica do programa {{:​prog2:​memerror.c|}} pela ferramenta Valgrind ​permite encontrar todos os erros de acesso à memória presentesO Valgrind ​é particularmente útil para encontrar problemas de vazamento de memória (//memory leaks//).+A ferramenta ​mais usada e popular é sem dúvida o **Valgrind**Ele é particularmente útil para encontrar problemas de vazamento de memória (//memory leaks//), mas pode realizar diversas análises envolvendo memória, caches e //​profiling//​ da execução.
  
-FIXME colocar um roteiro simples ​de uso do Valgrind, com exemplo.+Algumas opções usuais do Valgrind são: 
 + 
 +  * ''​--tool=toolname''​ : escolhe a ferramenta de análise, que pode ser: 
 +    * ''​memcheck''​ : análise de acesso à memória (default) 
 +    * ''​cachegrind''​ : análise ​de uso dos caches 
 +    * ''​exp-sgcheck''​ : análise mais detalhada de variáveis globais e do stack 
 +    * ... 
 +  * ''​--leak-check=full''​ : relatório detalhado sobre //memory leaks// 
 + 
 +Eis abaixo um programa com alguns erros de memória frequentes:​ 
 + 
 +<code c errors.c>​ 
 +#include <​stdio.h>​ 
 +#include <​stdlib.h>​ 
 + 
 +#define VETSIZE 100 
 + 
 +int main() 
 +
 +  int *vet1*vet2 ; 
 +  int x ; 
 + 
 +  vet1 = malloc(VETSIZE * sizeof(int)) ; 
 +  vet2 = malloc(VETSIZE * sizeof(int)) ; 
 + 
 +  // erro 1: acesso a uma posição fora do vetor (buffer overflow) 
 +  vet1[VETSIZE] = 0 ; 
 + 
 +  // erro 2: leitura de uma variável não inicializada 
 +  if (x == 0) 
 +    printf ("x vale zero\n"​) ; 
 + 
 +  free (vet2) ; 
 + 
 +  // erro 3: liberar duas vezes a mesma área (double free) 
 +  free (vet2) ; 
 + 
 +  // erro 4: usar uma área após tê-la liberado (use after free) 
 +  vet2[0] = 0 ; 
 + 
 +  // erro 5: a área de vet1 não foi liberada (memory leak) 
 +
 +</​code>​ 
 + 
 +Primeiro, deve-se compilar o código ​com a opção ''​-g''​. Em seguida, executar o Valgrind com as opções de depuração de memória: 
 + 
 +<​code>​ 
 +~> gcc -Wall -g errors.c -o errors 
 +~> valgrind --leak-check=full ./errors 
 +</​code>​ 
 + 
 +O relatório gerado pelo Valgrind pode ser extenso e deve ser analisado com atenção. A seguir destacamos os trechos do relatório relativos aos quatro erros de memória do código acima. 
 + 
 +Este trecho diz respeito ao **erro 1**: 
 +  
 +<​code>​ 
 +==29519== Invalid write of size 4 
 +==29519== ​   at 0x1086F8: main (errors.c:​15) 
 +==29519== ​ Address 0x522d1d0 is 0 bytes after a block of size 400 alloc'​d 
 +==29519== ​   at 0x4C2FB0F: malloc (in /​usr/​lib/​valgrind/​vgpreload_memcheck-amd64-linux.so) 
 +==29519== ​   by 0x1086DB: main (errors.c:​11) 
 +</​code>​ 
 + 
 +Este trecho diz respeito ao **erro 2**: 
 + 
 +<​code>​ 
 +==29519== Conditional jump or move depends on uninitialised value(s) 
 +==29519== ​   at 0x108702: main (errors.c:​18) 
 +</​code>​ 
 + 
 +Este trecho diz respeito ao **erro 3**: 
 + 
 +<​code>​ 
 +==29519== Invalid free() / delete / delete[] / realloc() 
 +==29519== ​   at 0x4C30D3B: free (in /​usr/​lib/​valgrind/​vgpreload_memcheck-amd64-linux.so) 
 +==29519== ​   by 0x108727: main (errors.c:​24) 
 +==29519== ​ Address 0x522d210 is 0 bytes inside a block of size 400 free'​d 
 +==29519== ​   at 0x4C30D3B: free (in /​usr/​lib/​valgrind/​vgpreload_memcheck-amd64-linux.so) 
 +==29519== ​   by 0x10871B: main (errors.c:​21) 
 +==29519== ​ Block was alloc'​d at 
 +==29519== ​   at 0x4C2FB0F: malloc (in /​usr/​lib/​valgrind/​vgpreload_memcheck-amd64-linux.so) 
 +==29519== ​   by 0x1086E9: main (errors.c:​12) 
 +</​code>​ 
 + 
 +Este trecho diz respeito ao **erro 4**: 
 + 
 +<​code>​ 
 +==29519== Invalid write of size 4 
 +==29519== ​   at 0x10872C: main (errors.c:​27) 
 +==29519== ​ Address 0x522d210 is 0 bytes inside a block of size 400 free'​d 
 +==29519== ​   at 0x4C30D3B: free (in /​usr/​lib/​valgrind/​vgpreload_memcheck-amd64-linux.so) 
 +==29519== ​   by 0x10871B: main (errors.c:​21) 
 +==29519== ​ Block was alloc'​d at 
 +==29519== ​   at 0x4C2FB0F: malloc (in /​usr/​lib/​valgrind/​vgpreload_memcheck-amd64-linux.so) 
 +==29519== ​   by 0x1086E9: main (errors.c:​12) 
 +</​code>​ 
 + 
 +Este trecho diz respeito ao **erro 5**: 
 + 
 +<​code>​ 
 +==29519== 400 bytes in 1 blocks are definitely lost in loss record 1 of 1 
 +==29519== ​   at 0x4C2FB0F: malloc (in /​usr/​lib/​valgrind/​vgpreload_memcheck-amd64-linux.so) 
 +==29519== ​   by 0x1086DB: main (errors.c:​11) 
 +</​code>​ 
 + 
 +Como exercício, analise o programa {{memerror.c|}} usando o Valgrind.
  
 ===== Tracing ===== ===== Tracing =====
Linha 205: Linha 310:
  
  
-Um exemplo de relatório de saída do programa ''​gprof''​ pode ser encontrado {{unix:​exemplo.gprof.txt|neste arquivo}}. Mais detalhes e opções de relatório podem ser obtidas no [[http://www.gnu.org/software/binutils/manual/gprof-2.9.1/|manual GNU gprof]].+Um exemplo de relatório de saída do programa ''​gprof''​ pode ser encontrado {{unix:​exemplo.gprof.txt|neste arquivo}}. Mais detalhes e opções de relatório podem ser obtidas no [[https://sourceware.org/​binutils/​docs/​gprof/​|manual GNU gprof]].
  
 O grafo de chamadas (//call graph//) pode ser visualizado de forma gráfica através da ferramenta [[https://​github.com/​jrfonseca/​gprof2dot|Gprof2dot]]. O grafo de chamadas (//call graph//) pode ser visualizado de forma gráfica através da ferramenta [[https://​github.com/​jrfonseca/​gprof2dot|Gprof2dot]].
prog2/depuracao.1556637814.txt.gz · Última modificação: 2019/04/30 12:23 por maziero