{"id":92,"date":"2021-12-15T14:34:23","date_gmt":"2021-12-15T14:34:23","guid":{"rendered":"http:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/?p=92"},"modified":"2022-08-18T10:31:18","modified_gmt":"2022-08-18T13:31:18","slug":"introducao-ao-gdb","status":"publish","type":"post","link":"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/index.php\/2021\/12\/15\/introducao-ao-gdb\/","title":{"rendered":"Introdu\u00e7\u00e3o ao GDB"},"content":{"rendered":"\n<p>Um dos grandes problemas dos alunos de gradua\u00e7\u00e3o na \u00e1rea de tecnologia \u00e9 que grande parte n\u00e3o utilizam algum tipo de depurador na \u00e9poca ainda de estudos. Postergando isso para quando os mesmo est\u00e3o trabalhando. Segue uma dica de uso do sistema GDB (GNU Debugger), depurador que, como muitos outros, permite voc\u00ea ver profundamente, o que est\u00e1 acontecendo com um programa na sua execu\u00e7\u00e3o.<\/p>\n\n\n\n<p>De acordo com a documenta\u00e7\u00e3o do <a rel=\"noreferrer noopener\" href=\"https:\/\/www.sourceware.org\/gdb\/\" data-type=\"URL\" data-id=\"https:\/\/www.sourceware.org\/gdb\/\" target=\"_blank\">GDB<\/a>, ele pode fazer quatro tipos principais de coisas para ajud\u00e1-lo a identificar bugs:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Inicie seu programa, especificando qualquer coisa que possa afetar seu comportamento.<\/li><li>Fa\u00e7a seu programa parar em condi\u00e7\u00f5es especificadas.<\/li><li>Examine o que aconteceu, quando seu programa parar.<\/li><li>Mude as instru\u00e7\u00f5es em seu programa, para que voc\u00ea possa experimentar corrigir os efeitos de um bug e continuar a aprender sobre outro.<\/li><\/ul>\n\n\n\n<p>Para in\u00edcio com GDB vamos utilizar o seguinte c\u00f3digo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"c\" class=\"language-c line-numbers\">\/*\n ============================================================================\n Name        : main.c\n Author      : Anderson Moreira\n Version     :\n Copyright   : Your copyright notice\n Description : Ansi-style to execute GDB\n ============================================================================\n*\/\n\n#include <stdio.h>\n#include <stdlib.h>\n\nint main(void){\n\tprintf(\"Ola mundo!\\n\");\n\tFILE *fp;\n\tint a = 1;\n\ta = a + 2;\n\n\tfp = fopen(\"\/home\/alsm\/out.txt\", \"w+\");\n    fprintf(fp, \"Este e um teste do fprintf...\\n\");\n    fputs(\"Este e um teste do fputs...\\n\", fp);\n    fclose(fp);\n    printf(\"a: %d\\n\", a);\n\n    return EXIT_SUCCESS;\n}<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Compile e Execute<\/strong><\/h2>\n\n\n\n<p>Para compilar estamos utilizando o VSCODE, mas o mesmo tamb\u00e9m pode ser compilador em um terminal em que o GCC esteja instalado na m\u00e1quina. Por\u00e9m para depurar deve ser utilizada a flag \u201c-g\u201d que permite habilitar e usar informa\u00e7\u00f5es extras.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"637\" height=\"331\" src=\"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2021\/12\/post1.png\" alt=\"\" class=\"wp-image-94\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>GDB<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"330\" src=\"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2021\/12\/post2.png\" alt=\"\" class=\"wp-image-95\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Executando o Programa<\/strong><\/h2>\n\n\n\n<p>Agora que temos o GDB aberto, pode come\u00e7ar a executar o programa usando o comando <code><em>run<\/em><\/code>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"642\" height=\"332\" src=\"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2021\/12\/post3.png\" alt=\"\" class=\"wp-image-96\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Ponto de interrup\u00e7\u00e3o (breakpoint)<\/strong><\/h2>\n\n\n\n<p>Pontos de interrup\u00e7\u00e3o s\u00e3o lugares no c\u00f3digo, por exemplo, uma linha no c\u00f3digo, que voc\u00ea pode especificar e sempre que o computador atinge este ponto, ele faz uma pausa antes de executar a linha especificada e mostra o prompt do depurador. Para criar um ponto de interrup\u00e7\u00e3o usamos o comando <code><em>break<\/em><\/code>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"334\" src=\"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2021\/12\/post4.png\" alt=\"\" class=\"wp-image-97\"\/><\/figure>\n\n\n\n<p>No exemplo, estamos criando um <em>breakpoint <\/em>na linha <code>18<\/code> ou seja onde tem <code>a = a + 2<\/code>;<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>An\u00e1lise de Dados<\/strong><\/h2>\n\n\n\n<p>Agora que temos um <em>breakpoint<\/em>, podemos executar o programa novamente e come\u00e7ar a analisar os dados.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"336\" src=\"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2021\/12\/post5.png\" alt=\"\" class=\"wp-image-98\"\/><\/figure>\n\n\n\n<p>Para ver o valor atual armazenado na vari\u00e1vel <code>a<\/code> usamos o comando <code><em>print<\/em><\/code>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"640\" height=\"334\" src=\"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2021\/12\/post6.png\" alt=\"\" class=\"wp-image-99\"\/><\/figure>\n\n\n\n<p>Lembre-se que a linha atual <span class=\"has-inline-color has-vivid-red-color\"><strong>ainda n\u00e3o foi executada<\/strong><\/span>. Ent\u00e3o, se quisermos executar a linha atual e parar no pr\u00f3ximo, executamos o comando <code>next<\/code>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"641\" height=\"335\" src=\"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2021\/12\/post7.png\" alt=\"\" class=\"wp-image-100\"\/><\/figure>\n\n\n\n<p>Se imprimirmos a vari\u00e1vel <code>a<\/code> novamente, devemos ver um valor diferente.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"643\" height=\"336\" src=\"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2021\/12\/post8.png\" alt=\"\" class=\"wp-image-101\"\/><\/figure>\n\n\n\n<p>Tudo funcionou como esperado, agora podemos continuar a execu\u00e7\u00e3o usando o comando <code>continue<\/code>, que retomar\u00e1 a execu\u00e7\u00e3o do programa at\u00e9 que um breakpoint seja atingido.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"643\" height=\"336\" src=\"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2021\/12\/post9.png\" alt=\"\" class=\"wp-image-102\"\/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Comandos B\u00e1sicos<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table><tbody><tr><td class=\"has-text-align-left\" data-align=\"left\"><strong>Comando<\/strong><\/td><td><strong>Vers\u00e3o resumida<\/strong><\/td><td><strong>Descri\u00e7\u00e3o<\/strong><\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">run<\/td><td>r<\/td><td>O comando de execu\u00e7\u00e3o faz com que a execu\u00e7\u00e3o do programa comece desde o in\u00edcio<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">quit<\/td><td>q<\/td><td>Sai do GDB<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">breakpoint <em>localiza\u00e7\u00e3o<\/em><\/td><td>b localiza\u00e7\u00e3o<\/td><td>O comando breakpoint define um ponto de interrup\u00e7\u00e3o em um determinado local. (linha, fun\u00e7\u00e3o, etc)<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">print express\u00e3o<\/td><td>p express\u00e3o<\/td><td>Isso imprimir\u00e1 o valor da express\u00e3o dada.<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">continue<\/td><td>c<\/td><td>Continua a execu\u00e7\u00e3o ap\u00f3s um breakpoint, at\u00e9 o pr\u00f3ximo ou o t\u00e9rmino do programa.<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">step<\/td><td>s<\/td><td>Executa uma \u00fanica linha ap\u00f3s um breakpoint.<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">next<\/td><td>n<\/td><td>Executa uma \u00fanica linha. Se esta linha for uma chamada de subprograma, execute e retorne da chamada.<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">list<\/td><td>l<\/td><td>Lista algumas linhas ao redor da localiza\u00e7\u00e3o de origem atual.<\/td><\/tr><tr><td class=\"has-text-align-left\" data-align=\"left\">backtrace<\/td><td>bt<\/td><td>Exibe um backtrace da cadeia de chamadas.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Controle de Execu\u00e7\u00e3o<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table><thead><tr><th>Comando<\/th><th>Vers\u00e3o resumida<\/th><th>Descri\u00e7\u00e3o<\/th><\/tr><\/thead><tbody><tr><td>run<\/td><td>r<\/td><td>Inicia a execu\u00e7\u00e3o do programa<\/td><\/tr><tr><td>run <em>argumentos<\/em><\/td><td>r <em>argumentos<\/em><\/td><td>Inicia a execu\u00e7\u00e3o do programa com op\u00e7\u00f5es<\/td><\/tr><tr><td>run <<em>stdin-file<\/em>> <em>stdout-file<\/em><\/td><td>r < <em>stdin-file<\/em> > <em>stdout-file<\/em><\/td><td>Inicia a execu\u00e7\u00e3o do programa com redirecionamento da E\/S<\/td><\/tr><tr><td>continue<\/td><td>c<\/td><td>Continua a execu\u00e7\u00e3o do programa at\u00e9 encontrar um breakpoint<\/td><\/tr><tr><td>kill<\/td><td><\/td><td>Finaliza o processo atual<\/td><\/tr><tr><td>quit<\/td><td>q<\/td><td>Sai do GDB<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Gerenciamento do breakpoint<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table><thead><tr><th>Comando<\/th><th>Descri\u00e7\u00e3o<\/th><\/tr><\/thead><tbody><tr><td>break nome-da-fun\u00e7\u00e3o<\/td><td>Defina um ponto de interrup\u00e7\u00e3o na fun\u00e7\u00e3o especificada<\/td><\/tr><tr><td>break n\u00famero-linha<\/td><td>Defina um ponto de interrup\u00e7\u00e3o na linha especificada<\/td><\/tr><tr><td>break NomeClasse::nomeFuncao<\/td><td>Define um ponto de interrup\u00e7\u00e3o numa fun\u00e7\u00e3o espec\u00edfica<\/td><\/tr><tr><td>break +offset<\/td><td>Defina um ponto de interrup\u00e7\u00e3o num n\u00famero espec\u00edfico de linhas para a frente a partir da posi\u00e7\u00e3o atual<\/td><\/tr><tr><td>break -offset<\/td><td>Defina um ponto de interrup\u00e7\u00e3o num n\u00famero espec\u00edfico de linhas para a tr\u00e1s a partir da posi\u00e7\u00e3o atual<\/td><\/tr><tr><td>break nome-arquivo:fun\u00e7\u00e3o<\/td><td>Define um ponto de interrup\u00e7\u00e3o em uma fun\u00e7\u00e3o espec\u00edfica dentro de um arquivo<\/td><\/tr><tr><td>break nome-arquivo:n\u00famero-linha<\/td><td>Define um ponto de interrup\u00e7\u00e3o em um n\u00famero espec\u00edfico de linha em um arquivo<\/td><\/tr><tr><td>break *endere\u00e7o<\/td><td>Defina um ponto de interrup\u00e7\u00e3o no endere\u00e7o de instru\u00e7\u00e3o especificado<\/td><\/tr><tr><td>break n\u00famero-linha if condi\u00e7\u00e3o<\/td><td>Define um ponto de interrup\u00e7\u00e3o se a condi\u00e7\u00e3o \u00e9 alcan\u00e7ada<\/td><\/tr><tr><td>break linha thread n\u00famero-thread<\/td><td>Define um ponto de interrup\u00e7\u00e3o em um thread especificado pelo um n\u00famero de linha<\/td><\/tr><tr><td>tbreak<\/td><td>Define uma parada tempor\u00e1ria (para uma vez apenas)<\/td><\/tr><tr><td>watch condi\u00e7\u00e3o<\/td><td>Suspende a execu\u00e7\u00e3o quando uma condi\u00e7\u00e3o \u00e9 executada<\/td><\/tr><tr><td>clear<\/td><td>Apaga os pontos de interrup\u00e7\u00e3o<\/td><\/tr><tr><td>clear fun\u00e7\u00e3o<\/td><td>Apaga todos os pontos de interrup\u00e7\u00e3o em uma fun\u00e7\u00e3o<\/td><\/tr><tr><td>clear <em>linha-n\u00famero<\/em><\/td><td>Apaga os pontos de interrup\u00e7\u00e3o at\u00e9 um n\u00famero de linha espec\u00edfico<\/td><\/tr><tr><td>delete<\/td><td>Exclua todos os pontos de interrup\u00e7\u00e3o, pontos de observa\u00e7\u00e3o ou pontos de captura<\/td><\/tr><tr><td>delete <em>breakpoint-n\u00famero<\/em><\/td><td>Exclua um ponto de interrup\u00e7\u00e3o espec\u00edfico<\/td><\/tr><tr><td>delete <em>breakpoint-n\u00famero<\/em>\u2013<em>breakpoint-n\u00famero<\/em><\/td><td>Exclua um ponto de interrup\u00e7\u00e3o dentro de um intervalo especificado. exemplo: delete 1-4<\/td><\/tr><tr><td>disable <em>breakpoint-n\u00famero<\/em><\/td><td>Desabilitar um ponto de interrup\u00e7\u00e3o especificado<\/td><\/tr><tr><td>disable <em>breakpoint-n\u00famero<\/em>\u2013<em>breakpoint-n\u00famero<\/em><\/td><td>Desabilitar um ponto de interrup\u00e7\u00e3o dentro de um intervalo especificado. exemplo: disable 1-4<\/td><\/tr><tr><td>enable <em>breakpoint-n\u00famero<\/em><\/td><td>Habilita um ponto de interrup\u00e7\u00e3o especificado<\/td><\/tr><tr><td>enable <em>breakpoint-n\u00famero<\/em>\u2013<em>breakpoint-n\u00famero<\/em><\/td><td>Habilita um ponto de interrup\u00e7\u00e3o especificado dentro de um intervalo. exemplo: enable 1-4<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Pilha de an\u00e1lise<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table><thead><tr><th>Comando<\/th><th>Vers\u00e3o resumida<\/th><th>Descri\u00e7\u00e3o<\/th><\/tr><\/thead><tbody><tr><td>backtrace<\/td><td>bt<\/td><td>Imprime o rastreio da pilha<\/td><\/tr><tr><td>backtrace full<\/td><td><\/td><td>Imprime valores das vari\u00e1veis locais<\/td><\/tr><tr><td>frame<\/td><td>f<\/td><td>Mostra o quadro da pilha corrente<\/td><\/tr><tr><td>frame n\u00famero<\/td><td>f n\u00famero<\/td><td>Mostra um n\u00famero do quadro especifico na pilha<\/td><\/tr><tr><td>up<\/td><td><\/td><td>Move um quadro \u00fanico para cima<\/td><\/tr><tr><td>down<\/td><td><\/td><td>Move um quadro \u00fanico para baixo<\/td><\/tr><tr><td>up n\u00famero<\/td><td><\/td><td>Mova um n\u00famero especificado de quadros na pilha para cima<\/td><\/tr><tr><td>down n\u00famero<\/td><td><\/td><td>Mova um n\u00famero especificado de quadros na pilha para baixo<\/td><\/tr><tr><td>info frame<\/td><td><\/td><td>Lista endere\u00e7o, linguagem, endere\u00e7o de argumentos\/vari\u00e1veis locais e quais registros foram salvos em um quadro<\/td><\/tr><tr><td>info args<\/td><td><\/td><td>Informa\u00e7\u00f5es de argumentos de um quadro selecionado<\/td><\/tr><tr><td>info locals<\/td><td><\/td><td>Informa\u00e7\u00f5es de argumentos de uma vari\u00e1vel local selecionada<\/td><\/tr><tr><td>info catch<\/td><td><\/td><td>Informa\u00e7\u00f5es de argumentos de um manipulador de exce\u00e7\u00f5es selecionada<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Depurar com arquivos de n\u00facleo (core)<\/strong><\/h2>\n\n\n\n<p>Um arquivo de n\u00facleo (<em>core dump<\/em>) cont\u00e9m o espa\u00e7o de endere\u00e7o de um processo (mem\u00f3ria) quando o mesmo finaliza a execu\u00e7\u00e3o inesperadamente. Este arquivo \u00e9 muito \u00fatil para depura\u00e7\u00e3o de erros, como por exemplo, falha de segmenta\u00e7\u00e3o.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Gerando um arquivo de core dump<\/strong><\/h2>\n\n\n\n<p>Muito sistemas por padr\u00e3o tem a gera\u00e7\u00e3o de arquivo core dump desabilitado. Podemos verificar executando o seguinte comando:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image.png\" alt=\"\" class=\"wp-image-164\" width=\"304\" height=\"40\" srcset=\"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image.png 364w, https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image-300x40.png 300w\" sizes=\"auto, (max-width: 304px) 100vw, 304px\" \/><\/figure>\n\n\n\n<p>Para habilitar a cria\u00e7\u00e3o deve executar o seguinte comando:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image-1.png\" alt=\"\" class=\"wp-image-165\" width=\"362\" height=\"56\" srcset=\"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image-1.png 448w, https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image-1-300x46.png 300w\" sizes=\"auto, (max-width: 362px) 100vw, 362px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Programa exemplo<\/strong><\/h2>\n\n\n\n<p>Para especificar o conceito de como utilizar arquivos core dump e GDB para uma melhor depura\u00e7\u00e3o de seus programas vamos escrever o seguinte programa.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"c\" class=\"language-c line-numbers\">#include <stdio.h>\n\nint main() {\n        char* s = 0;\n        char c = s[0];\n        return 0;\n}<\/code><\/pre>\n\n\n\n<p>Agora podemos compilar e executar o programa:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image-2.png\" alt=\"\" class=\"wp-image-169\" width=\"328\" height=\"109\" srcset=\"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image-2.png 433w, https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image-2-300x100.png 300w\" sizes=\"auto, (max-width: 328px) 100vw, 328px\" \/><\/figure>\n\n\n\n<p>Voc\u00ea pode verificar o arquivo do core dump se o mesmo foi criado com algum comando de listagem (ls, dir, etc.).<\/p>\n\n\n\n<p>Caso o arquivo dump n\u00e3o esteja sendo criado no linux, execute os seguintes comandos:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"656\" height=\"55\" src=\"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image-4.png\" alt=\"\" class=\"wp-image-176\" srcset=\"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image-4.png 656w, https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image-4-300x25.png 300w\" sizes=\"auto, (max-width: 656px) 100vw, 656px\" \/><\/figure>\n\n\n\n<p>Desta forma todos os arquivos dump podem ser encontrados na pasta \/tmp e funcionar\u00e1 os passos a seguir.<\/p>\n\n\n\n<p>Agora que temos os arquivos de depura\u00e7\u00e3o, basta abrir o mesmo com o aplicativo do gdb.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">$ gdb a.out a.dump<\/code><\/pre>\n\n\n\n<p>Lembrando que a.dump \u00e9 o arquivo core dump criado.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"653\" height=\"429\" src=\"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image-5.png\" alt=\"\" class=\"wp-image-181\" srcset=\"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image-5.png 653w, https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image-5-300x197.png 300w\" sizes=\"auto, (max-width: 653px) 100vw, 653px\" \/><\/figure>\n\n\n\n<p>A primeira coisa que deve fazer \u00e9 utilizar o comando <strong><em>backtrace<\/em><\/strong>. Um programa quando executa\u00e9 instanciado na mem\u00f3ria uma \u00e1rea chamada stack (pilha) que cont\u00e9m informa\u00e7\u00f5es sobre fun\u00e7\u00f5es que est\u00e3o sendo utilizadas e assim por diante. Cada item na pilha \u00e9 mantido em um quadro (frame) e cada quadro cont\u00e9m informa\u00e7\u00f5es necess\u00e1rias em que as vari\u00e1veis locais utilizam nas fun\u00e7\u00f5es. O comando <strong><em>backtrace<\/em><\/strong> \u00e9 utilizado para buscar informa\u00e7\u00f5es da pilha quando o sinal <strong><a href=\"https:\/\/man7.org\/linux\/man-pages\/man7\/signal.7.html\" data-type=\"URL\" data-id=\"https:\/\/man7.org\/linux\/man-pages\/man7\/signal.7.html\" target=\"_blank\" rel=\"noreferrer noopener\">SIGSEGV<\/a><\/strong> \u00e9 acionado. Cada quadro na pilha tem um n\u00famero onde <strong><em>0<\/em><\/strong> \u00e9 a chamada mais recente.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"420\" height=\"53\" src=\"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image-6.png\" alt=\"\" class=\"wp-image-182\" srcset=\"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image-6.png 420w, https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image-6-300x38.png 300w\" sizes=\"auto, (max-width: 420px) 100vw, 420px\" \/><\/figure>\n\n\n\n<p>O comando backtrace \u00e9 essencial e possibilita ao programador uma boa ideia de onde est\u00e1 o problema<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Interface gr\u00e1fica do usu\u00e1rio<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>TUI<\/strong><\/h3>\n\n\n\n<p>A <em>Text User Interface<\/em> (TUI) \u00e9 uma possibilidade gr\u00e1fica em terminal que o usu\u00e1rio pode verificar o c\u00f3digo fonte, assembly, registradores e comandos do GDB em telas separadas. O modo TUI \u00e9 habilitado por padr\u00e3o quando utiliza a op\u00e7\u00e3o <em><strong>-tui<\/strong><\/em> juntamente com o comando do depurador.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Comandos do TUI<\/strong><\/h2>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table><thead><tr><th>Comando<\/th><th>Descri\u00e7\u00e3o<\/th><\/tr><\/thead><tbody><tr><td>layout next<\/td><td>Mostra o display seguinte.<\/td><\/tr><tr><td>layout prev<\/td><td>Mostra o display anterior<\/td><\/tr><tr><td>layout src<\/td><td>Mostra o c\u00f3digo fonte.<\/td><\/tr><tr><td>layout asm<\/td><td>Mostra o c\u00f3digo assembly<\/td><\/tr><tr><td>layout split<\/td><td>Mostra o fonte e o assembly<\/td><\/tr><tr><td>layout regs<\/td><td>Mostra a janela de registradores junto com o c\u00f3digo fonte ou o assembly<\/td><\/tr><tr><td>focus next, prev, src, asm, regs, split<\/td><td>Mant\u00e9m o foco na janela chamada como refer\u00eancia. <\/td><\/tr><tr><td>refresh<\/td><td>Atualiza a tela.<\/td><\/tr><tr><td>update<\/td><td>Atualiza a janela do c\u00f3digo fonte e do ponto de execu\u00e7\u00e3o corrente.<\/td><\/tr><tr><td>winheight name +count<\/td><td>Aumenta o tamanho da janela de acordo com o n\u00famero de linhas passado como par\u00e2metro.<\/td><\/tr><tr><td>winheight name -count<\/td><td>Diminui o tamanho da janela de acordo com o n\u00famero de linhas passado como par\u00e2metro.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>Exemplo de testes vamos utilizar o seguinte c\u00f3digo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"c\" class=\"language-c line-numbers\">#include <stdio.h>\n\nint main() {\n    int a = 0;\n    a = 2;  \n    printf(\"%s\\n\", \"Ola GDB\");\n    return 0;\n}<\/code><\/pre>\n\n\n\n<p>Compile com os s\u00edmbolos do GDB e execute<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"458\" height=\"73\" src=\"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image-7.png\" alt=\"\" class=\"wp-image-183\" srcset=\"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image-7.png 458w, https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image-7-300x48.png 300w, https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image-7-450x73.png 450w\" sizes=\"auto, (max-width: 458px) 100vw, 458px\" \/><\/figure>\n\n\n\n<p>Inicialize o TUI<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"bash\" class=\"language-bash\">$ gdb -tui .\/a.out<\/code><\/pre>\n\n\n\n<p>Voc\u00ea ver\u00e1 a seguinte tela<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"647\" height=\"444\" src=\"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image-8.png\" alt=\"\" class=\"wp-image-184\" srcset=\"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image-8.png 647w, https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image-8-300x206.png 300w\" sizes=\"auto, (max-width: 647px) 100vw, 647px\" \/><\/figure>\n\n\n\n<p>Adicione alguns pontos de interrup\u00e7\u00f5es e continue a execu\u00e7\u00e3o para ver como este funciona com o TUI.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"650\" height=\"443\" src=\"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image-9.png\" alt=\"\" class=\"wp-image-185\" srcset=\"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image-9.png 650w, https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image-9-300x204.png 300w\" sizes=\"auto, (max-width: 650px) 100vw, 650px\" \/><\/figure>\n\n\n\n<p>Ap\u00f3s execute (digite o comando <strong><em>run<\/em><\/strong>) e imprima a vari\u00e1vel \u201ca\u201d para acompanhar (digite o comando <strong>p a<\/strong>). Repita at\u00e9 finalizar a execu\u00e7\u00e3o dos breakpoints.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"646\" height=\"445\" src=\"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image-10.png\" alt=\"\" class=\"wp-image-186\" srcset=\"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image-10.png 646w, https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image-10-300x207.png 300w\" sizes=\"auto, (max-width: 646px) 100vw, 646px\" \/><\/figure>\n\n\n\n<p>Neste caso tudo funciona normalmente e podemos inclusive ver o assembly do c\u00f3digo fonte (comando <strong><em>layout next<\/em><\/strong>).<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"655\" height=\"448\" src=\"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image-11.png\" alt=\"\" class=\"wp-image-187\" srcset=\"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image-11.png 655w, https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image-11-300x205.png 300w\" sizes=\"auto, (max-width: 655px) 100vw, 655px\" \/><\/figure>\n\n\n\n<p>Assembly com o GDB<\/p>\n\n\n\n<p>O depurador tamb\u00e9m possibilita ao desenvolvedor executar o c\u00f3digo assembly diretamente passo-a-passo. Principalmente para observar o comportamento de um determinado palicativo na mem\u00f3ria, quais registradores este utiliza, refer\u00eancias, etc.<\/p>\n\n\n\n<p>Os comandos relacionados s\u00e3o:<\/p>\n\n\n\n<figure class=\"wp-block-table is-style-stripes\"><table><thead><tr><th>Comando<\/th><th>Vers\u00e3o resumida<\/th><th>Descri\u00e7\u00e3o<\/th><\/tr><\/thead><tbody><tr><td>info line<\/td><td><\/td><td>Mostra a posi\u00e7\u00e3o inicial e final de um c\u00f3digo<\/td><\/tr><tr><td>info line numero<\/td><td><\/td><td>Mostra a posi\u00e7\u00e3o de um c\u00f3digo objeto em uma linha espec\u00edfica<\/td><\/tr><tr><td>disassemble <em>start_address<\/em> <em>end_address<\/em><\/td><td><\/td><td>Mostra o c\u00f3digo assembly de um c\u00f3digo objeto espec\u00edfico, com os valores de mem\u00f3ria inicial e final<\/td><\/tr><tr><td>stepi<\/td><td>si<\/td><td>Passa uma instru\u00e7\u00e3o assembly<\/td><\/tr><tr><td>nexti<\/td><td>ni<\/td><td>Pr\u00f3xima instru\u00e7\u00e3o asembly<\/td><\/tr><tr><td>x <em>address<\/em><\/td><td><\/td><td>Examina o conte\u00fado da mem\u00f3ria<\/td><\/tr><tr><td>x\/nfu <em>address<\/em><\/td><td><\/td><td>Examina o conte\u00fado da mem\u00f3ria com um formato espec\u00edfico. n: n\u00famero de itens para imprimir (padr\u00e3o \u00e9 1), f: especifica o formato da sa\u00edda i \u2013 instr, s-string, x-hex, d-sdecimal, u-udecimal, o-octal, t-binary, a-addr, c-char ,f-float, u: especifica o tamanho da unidade de dados b-byte, h-halfword, w-word, g-giant (8 bytes)<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>O programa que utilizaremos para teste ser\u00e1 este<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"c\" class=\"language-c line-numbers\">#include <stdio.h>\n\nint main() {\n      int a = 1;\n      a = a + 2;  \n      printf(\"a: %d\\n\", a);\n    return 0;\n}<\/code><\/pre>\n\n\n\n<p>Compile e execute<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"655\" height=\"329\" src=\"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image-12.png\" alt=\"\" class=\"wp-image-190\" srcset=\"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image-12.png 655w, https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image-12-300x151.png 300w\" sizes=\"auto, (max-width: 655px) 100vw, 655px\" \/><\/figure>\n\n\n\n<p>Crie um ponto de interrup\u00e7\u00e3o na fun\u00e7\u00e3o main.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"650\" height=\"173\" src=\"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image-13.png\" alt=\"\" class=\"wp-image-191\" srcset=\"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image-13.png 650w, https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image-13-300x80.png 300w\" sizes=\"auto, (max-width: 650px) 100vw, 650px\" \/><\/figure>\n\n\n\n<p>Com o comando info line \u00e9 poss\u00edvel ver em que posi\u00e7\u00e3o de mem\u00f3ria o c\u00f3digo est\u00e1 alocado.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"650\" height=\"75\" src=\"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image-14.png\" alt=\"\" class=\"wp-image-192\" srcset=\"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image-14.png 650w, https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image-14-300x35.png 300w\" sizes=\"auto, (max-width: 650px) 100vw, 650px\" \/><\/figure>\n\n\n\n<p>Podemos verificar o assembly gerado para o c\u00f3digo e ver e a posi\u00e7\u00e3o de mem\u00f3ria corresponde ao que foi informado.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"652\" height=\"324\" src=\"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image-15.png\" alt=\"\" class=\"wp-image-193\" srcset=\"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image-15.png 652w, https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image-15-300x149.png 300w\" sizes=\"auto, (max-width: 652px) 100vw, 652px\" \/><\/figure>\n\n\n\n<p>Podemos acompanhar a execu\u00e7\u00e3o de uma instru\u00e7\u00e3o no decorrer do tempo usando o comando <strong><em>stepi<\/em><\/strong>.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"654\" height=\"361\" src=\"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image-16.png\" alt=\"\" class=\"wp-image-194\" srcset=\"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image-16.png 654w, https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image-16-300x166.png 300w\" sizes=\"auto, (max-width: 654px) 100vw, 654px\" \/><\/figure>\n\n\n\n<p>Por fim podemos ver a import\u00e2ncia da ferramenta, incluindo um novo ponto de interrup\u00e7\u00e3o na linha em que adiciona 2 a vari\u00e1vel \u201ca\u201d e observar a mudan\u00e7a de valor na mem\u00f3ria.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"653\" height=\"498\" src=\"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image-17.png\" alt=\"\" class=\"wp-image-195\" srcset=\"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image-17.png 653w, https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/wp-content\/uploads\/2022\/08\/image-17-300x229.png 300w\" sizes=\"auto, (max-width: 653px) 100vw, 653px\" \/><\/figure>\n","protected":false},"excerpt":{"rendered":"<p>Um dos grandes problemas dos alunos de gradua\u00e7\u00e3o na \u00e1rea de tecnologia \u00e9 que grande parte n\u00e3o utilizam algum tipo de depurador na \u00e9poca ainda de estudos. Postergando isso para quando os mesmo est\u00e3o trabalhando. Segue uma dica de uso do sistema GDB (GNU Debugger), depurador que, como muitos outros, permite voc\u00ea ver profundamente, o [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[14],"tags":[23,24,25],"class_list":["post-92","post","type-post","status-publish","format-standard","hentry","category-software","tag-gdb","tag-gnu","tag-programacao"],"_links":{"self":[{"href":"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/index.php\/wp-json\/wp\/v2\/posts\/92","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/index.php\/wp-json\/wp\/v2\/comments?post=92"}],"version-history":[{"count":17,"href":"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/index.php\/wp-json\/wp\/v2\/posts\/92\/revisions"}],"predecessor-version":[{"id":196,"href":"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/index.php\/wp-json\/wp\/v2\/posts\/92\/revisions\/196"}],"wp:attachment":[{"href":"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/index.php\/wp-json\/wp\/v2\/media?parent=92"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/index.php\/wp-json\/wp\/v2\/categories?post=92"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gpads.recife.ifpe.edu.br\/alsm\/csin\/index.php\/wp-json\/wp\/v2\/tags?post=92"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}