<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>coding &#187; gdb</title>
	<atom:link href="http://www.coding.com.br/tag/gdb/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.coding.com.br</link>
	<description>have you coded today?</description>
	<lastBuildDate>Thu, 18 Aug 2011 17:29:43 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Depurando programas em assembly no GNU/Linux (parte 1)</title>
		<link>http://www.coding.com.br/programacao/depurando-programas-em-assembly-no-gnulinux-parte-1/</link>
		<comments>http://www.coding.com.br/programacao/depurando-programas-em-assembly-no-gnulinux-parte-1/#comments</comments>
		<pubDate>Mon, 28 Sep 2009 02:41:03 +0000</pubDate>
		<dc:creator>Tiago Maluta</dc:creator>
				<category><![CDATA[programação]]></category>
		<category><![CDATA[assembly]]></category>
		<category><![CDATA[gdb]]></category>
		<category><![CDATA[intel]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[nasm]]></category>
		<category><![CDATA[x86]]></category>

		<guid isPermaLink="false">http://www.coding.com.br/?p=276</guid>
		<description><![CDATA[Embora eu particularmente prefira a sintaxe AT&#38;T à Intel. Estou tendo que aprender a usá-la (e bem). Para os estudos optei pelo NASM, GNU ld e o GDB. Um processo simples, descrito abaixo:
#nasm -g -f elf programa.asm 
#ld programa.o
#gdb -q a.out
Vamos fazer um pequeno programa teste que carrega no registro ecx o valor da variável [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Embora eu particularmente <a href="http://www.ibm.com/developerworks/linux/library/l-gas-nasm.html">prefira</a> a sintaxe AT&amp;T à Intel. Estou <a href="http://www.unifei.edu.br">tendo</a> que aprender a usá-la (e bem). Para os estudos optei pelo <a href="http://www.nasm.us/">NASM</a>, <a href="http://www.gnu.org/software/binutils/">GNU ld</a> e o <a href="http://www.gnu.org/software/gdb/">GDB</a>. Um processo simples, descrito abaixo:</p>
<p style="padding-left: 30px;">#<strong>nasm</strong> -g -f elf <span style="color: #000000;">programa.asm </span><br />
#<strong>ld</strong> <span style="color: #000000;">programa.o</span><br />
#<strong>gdb</strong> -q <span style="color: #000000;">a.out</span></p>
<p>Vamos fazer um pequeno programa teste que carrega no registro <em>ecx</em> o valor da variável (var1) e em <em>edx</em> seu endereço:</p>

<div class="wp_syntax"><div class="code"><pre class="asm" style="font-family:monospace;">section <span style="color: #000000; font-weight: bold;">.data</span>
&nbsp;
   var1 <span style="color: #000000; font-weight: bold;">dd</span> <span style="color: #0000ff;">40</span>
&nbsp;
section <span style="color: #339933;">.</span>text
&nbsp;
   global _start
&nbsp;
   _start<span style="color: #339933;">:</span>
      <span style="color: #00007f; font-weight: bold;">nop</span>
      <span style="color: #00007f; font-weight: bold;">nop</span>
      <span style="color: #00007f; font-weight: bold;">mov</span>   <span style="color: #00007f;">ecx</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">&#91;</span>var1<span style="color: #009900; font-weight: bold;">&#93;</span>
      <span style="color: #00007f; font-weight: bold;">lea</span>   <span style="color: #00007f;">edx</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">&#91;</span>var1<span style="color: #009900; font-weight: bold;">&#93;</span>
&nbsp;
   _exit<span style="color: #339933;">:</span>
      <span style="color: #00007f; font-weight: bold;">mov</span>   <span style="color: #00007f;">eax</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">1</span>
      <span style="color: #00007f; font-weight: bold;">int</span>   <span style="color: #0000ff;">80h</span></pre></div></div>

<p>Dentro do gdb:</p>
<pre>(gdb) break 11
Breakpoint 1 at 0x80480a1: file teste.asm, line 11.
(gdb) r
Starting program: /home/maluta/coding/a.out
Breakpoint 1, _start () at teste.asm:11
11            nop
(gdb) print var1
$1 = 40
(gdb) info registers ecx edx
ecx            0x0      0
edx            0x0      0</pre>
<p>Adicionamos um <a href="http://sourceware.org/gdb/current/onlinedocs/gdb_6.html#SEC34">breakpoint</a> (eu precisei inserir duas instruções <em>nop</em> para o gdb realmente para no ponto) e verificamos os valores de <strong>var1</strong>, <strong>ecx</strong> e <strong>edx</strong>.</p>
<pre>(gdb) si
_start () at teste.asm:12
12            mov   ecx, [var1]
(gdb) si
_start () at teste.asm:13
13            lea   edx, [var1]
(gdb) info registers ecx
ecx            0x28     40
(gdb) si
_exit () at teste.asm:16
16            mov   eax, 1
(gdb) info registers edx
edx            0x80490b8        134516920</pre>
<p>E por fim, verificamos o conteúdo no endereço definido em edx.</p>
<pre>(gdb) print *0x80490b8
$2 = 40</pre>
<p style="text-align: justify;">Algumas considerações:</p>
<ul style="text-align: justify;">
<li style="text-align: justify;">O <a href="http://www.gnu.org/software/ddd/">Data Diplay Debugger</a> (DDD) é um <em>front-end</em> muito bom para o GDB que pode ser utilizado ao invés da interface de linha de comando.</li>
</ul>
<ul style="text-align: justify;">
<li style="text-align: justify;">O após <em>label</em> <strong>_exit </strong>há uma chamada a uma <em>syscall</em> (adivinha qual?) do <a href="http://www.kernel.org">kernel</a>. Passa-se o valor (no registro eax) e chama uma interrupção (80h).  A verdadeira &#8220;diversão&#8221; está em associar essas syscalls (write, fork, execve, &#8230;) mas isto é para outro <em>post</em>&#8230; Por enquanto vou lidar com os diferentes modos de endereçamento e operações lógicas e aritméticas.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.coding.com.br/programacao/depurando-programas-em-assembly-no-gnulinux-parte-1/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Básico de ponteiros com o GDB</title>
		<link>http://www.coding.com.br/programacao/basico-de-ponteiros-com-o-gdb/</link>
		<comments>http://www.coding.com.br/programacao/basico-de-ponteiros-com-o-gdb/#comments</comments>
		<pubDate>Mon, 21 Sep 2009 18:27:20 +0000</pubDate>
		<dc:creator>Tiago Maluta</dc:creator>
				<category><![CDATA[programação]]></category>
		<category><![CDATA[c]]></category>
		<category><![CDATA[gdb]]></category>

		<guid isPermaLink="false">http://www.coding.com.br/?p=260</guid>
		<description><![CDATA[Esse é um pequeno lembrete para quem quer pegar o conceito de ponteiro rápido. É tão simples que nem programa direito você vai precisar, só seguir sua intuição e o GDB  
1. Básico
Vamos começar com um código muito simples.

#include &#60;stdio.h&#62;
int main&#40;int argc, char *argv&#91;&#93;&#41; &#123;
int *ptr = NULL;
int variavel_A;
int variavel_B;
variavel_A = 5;
variavel_B = 18;
return [...]]]></description>
			<content:encoded><![CDATA[<p style="text-align: justify;">Esse é um pequeno lembrete para quem quer pegar o conceito de ponteiro rápido. É tão simples que nem programa direito você vai precisar, só seguir sua intuição e o GDB <img src='http://www.coding.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> </p>
<p><strong>1. Básico</strong></p>
<p>Vamos começar com um código muito simples.</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>argv<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
<span style="color: #993333;">int</span> <span style="color: #339933;">*</span>ptr <span style="color: #339933;">=</span> NULL<span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> variavel_A<span style="color: #339933;">;</span>
<span style="color: #993333;">int</span> variavel_B<span style="color: #339933;">;</span>
variavel_A <span style="color: #339933;">=</span> <span style="color: #0000dd;">5</span><span style="color: #339933;">;</span>
variavel_B <span style="color: #339933;">=</span> <span style="color: #0000dd;">18</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p style="text-align: justify;">Usar o menor comando do GCC para compilar e linkar o programa. A saída (o executável) chamará a.out, se você quiser outro nome adicione &#8220;-o &lt;nome&gt;&#8221; no final do comando.</p>
<p><strong>gcc -ggdb basico.c </strong></p>
<p style="text-align: justify;">E iniciar o depurador, lembre-se que o texto em <span style="color: red; ">(vermelho)</span> é comentário e <strong>negrito</strong> é um comando para você digiar na CLI (<em>command-line interface</em>) do GDB.</p>
<div class="indent"><tt></tt></p>
<p><tt>maluta@coding ~ $ gdb -q a.out</tt><br />
<tt>(gdb) <strong>l</strong> <span style="color: red; ">(lista o código)</span></tt><br />
<tt>1       #include &lt;stdio.h&gt;</tt><br />
<tt>2</tt><br />
<tt>3 </tt><br />
<tt>4       int main(int argc, char *argv[]) {</tt><br />
<tt>5</tt><br />
<tt>6               int *ptr = NULL;</tt><br />
<tt>7               int variavel_A;</tt><br />
<tt>8               int variavel_B;</tt><br />
<tt>9</tt><br />
<tt>10              variavel_A = 5;</tt><br />
<tt>(gdb)</tt><br />
<tt>11              variavel_B = 18;</tt><br />
<tt>12</tt><br />
<tt>13              return 0;</tt><br />
<tt>14</tt><br />
<tt>15      }</tt><br />
<tt>(gdb) <strong>break </strong>13  <span style="color: red; ">(inserir um breakpoint na linha 13)</span></tt><br />
<tt>Breakpoint 1 at 0x80483c6: file basico.c, line 13.</tt></p>
<p><tt>(gdb) <strong>r</strong> <span style="color: red; ">(run - inicia o programa)</span></tt><br />
<tt>Starting program: /home/maluta/a.out</tt><br />
<tt>Breakpoint 1, main () at basico.c:13</tt><br />
<tt>13              return 0;</tt><br />
<span style="color: red; "><tt>(Mostra o que tem na variavel_A)</tt></span><br />
<tt>(gdb) <strong>print</strong> variavel_A</tt><br />
<tt>$1 = 5</tt></div>
<p><tt><br />
</tt></p>
<div class="indent"><span style="color: red; "><tt>(Mostra o que tem na variavel_B)</tt></span><tt></tt><br />
<tt>(gdb) <strong>print</strong> variavel_B</tt><br />
<tt>$2 = 18</tt><br />
<span style="color: red; "><tt>(Imprime o conteúdo do endereço definido em ptr)</tt></span><tt></tt><br />
<tt>(gdb) <strong>print</strong> *ptr </tt><br />
<tt>Cannot access memory at address 0x0 <span style="color: red; ">(ooops... essa não é uma posição válida!)</span></tt><br />
<tt>(gdb) <strong>print</strong> ptr <span style="color: red; "> (mas é claro que ptr guarda um valor...)</span></tt><br />
<tt>$3 = (int *) 0x0 <span style="color: red; ">(que é NULL)</span></tt></div>
<p><tt><br />
</tt></p>
<div class="indent"><span style="color: red; "><tt>(E qual o endereço da variável_A?)</tt></span><br />
<tt>(gdb) <strong>print</strong> &amp;variavel_A</tt><br />
<tt>$4 = (int *) <span style="color: green; ">0xbfbc0ddc</span></tt><br />
<tt>(gdb) <strong>print</strong> *variavel_A <span style="color: red; ">(Podemos ver que não conseguimos acessar a variavel_A como um ponteiro pois ela guarda um endereço inválido)</span></tt><br />
<tt>Cannot access memory at address 0x5</tt></div>
<p><tt><br />
</tt></p>
<div class="indent"><span style="color: red; "><tt>(O endereço da variável_B)</tt></span><tt></tt><br />
<tt>(gdb) <strong>print</strong> &amp;variavel_B</tt><br />
<tt>$5 = (int *) 0xbfbc0de0</tt><br />
<span style="color: red; "><tt>(Vamos fazer ptr apontar para a variavel_A)</tt></span><tt></tt><br />
<tt>(gdb) <strong>set</strong> ptr=<span style="color: green; ">0xbfbc0ddc</span> </tt><br />
<tt>(gdb) <strong>print</strong> *ptr <span style="color: red; ">(e mostrar o seu conteúdo)</span></tt><br />
<tt>$6 = 5</tt><br />
<span style="color: red; "><tt>(Vamos fazer ptr apontar para a variavel_B)</tt></span><tt></tt><br />
<tt>(gdb) <strong>set</strong> ptr=&amp;variavel_B</tt><br />
<tt>(gdb) <strong>print</strong> *ptr</tt><br />
<tt>$7 = 18</tt><br />
<tt>(gdb)</tt><br />
<tt></tt></div>
<p><strong>2. Intermediário</strong></p>
<p>Vamos dar mais um passo.</p>
<p><!--start GeSHi--></p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include </span>
<span style="color: #339933;">#include  /* malloc() */</span>
<span style="color: #339933;">#include  /* strncpy */</span>
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>argv<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
        <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>nome<span style="color: #339933;">;</span>
&nbsp;
        nome <span style="color: #339933;">=</span> malloc<span style="color: #009900;">&#40;</span><span style="color: #0000dd;">10</span><span style="color: #339933;">*</span><span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        strncpy<span style="color: #009900;">&#40;</span>nome<span style="color: #339933;">,</span><span style="color: #ff0000;">&quot;tiago&quot;</span><span style="color: #339933;">,</span><span style="color: #0000dd;">5</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p><tt>maluta@coding ~ $ gdb -q a.out</tt><br />
<tt>(gdb) <strong>l</strong></tt><br />
<tt>1       #include &lt;stdio.h&gt;</tt><br />
<tt>2       #include &lt;stdlib.h&gt; /* malloc() */</tt><br />
<tt>3       #include &lt;string.h&gt; /* strncpy */</tt><br />
<tt>4       int main(int argc, char *argv[]) {</tt><br />
<tt>5</tt><br />
<tt>6</tt><br />
<tt>7               char *nome;</tt><br />
<tt>8</tt><br />
<tt>9               nome = malloc(10*sizeof(char));</tt><br />
<tt>10</tt><br />
<tt>(gdb) <strong>break</strong> 9</tt><br />
<tt>Breakpoint 1 at 0x8048421: file intermediario.c, line 9.</tt><br />
<tt>(gdb) <strong>r</strong></tt><br />
<tt>Starting program: /home/maluta/a.out</tt><br />
<tt>Breakpoint 1, main () at basico.c:9</tt><br />
<tt>9               nome = malloc(10*sizeof(char));</tt><br />
<tt>(gdb) <strong>print</strong> nome</tt><br />
<tt>$1 = 0xb80b1190 "U\211åWVSèÀ\207" <span style="color: red; ">(LIXO)</span></tt><br />
<tt>(gdb) <strong>n</strong> <span style="color: red; ">(next - executa a próxima instrução)</span></tt><br />
<tt>11              strncpy(nome,"tiago",5);</tt><br />
<tt>(gdb) <strong>n</strong></tt><br />
<tt>15              return 0;</tt><br />
<tt>(gdb) <strong>print</strong> nome <span style="color: red; ">(texto copiado)</span></tt><br />
<tt>$2 = 0x804b008 "tiago"</tt><br />
<tt>(gdb) <strong>x/5x</strong> nome <span style="color: red; ">(conteudo em hexa)</span></tt><br />
<tt>0x804b008:      0x74    0x69    0x61    0x67    0x6f</tt><br />
<tt>(gdb) <strong>x/5c</strong> nome <span style="color: red; ">(conteudo em ascii)</span></tt><br />
<tt>0x804b008:      116 't' 105 'i' 97 'a'  103 'g' 111 'o'</tt><br />
<span style="color: red; "><tt>(Vamos mudar a primeira letra da string)</tt></span><tt></tt><br />
<tt>(gdb) <strong>set</strong> {char}nome='T' </tt><br />
<tt>(gdb) <strong>x/5x</strong> nome</tt><br />
<tt>0x804b008:      0x54    0x69    0x61    0x67    0x6f</tt><br />
<tt>(gdb) <strong>x/5c</strong> nome</tt><br />
<tt>0x804b008:      84 'T'  105 'i' 97 'a'  103 'g' 111 'o'</tt><br />
<span style="color: red; "><tt>(Vamos colocar um espaço em branco na segunda posição)</tt></span><tt></tt><br />
<tt>(gdb) <strong>set</strong> {char}(nome+1)=' ' <span style="color: red; ">(lembre-se que o índice começa em zero)</span></tt><br />
<tt>(gdb) <strong>print</strong> nome</tt><br />
<tt>$11 = 0x804b008 "T ago"</tt><br />
<tt>(gdb) <strong>x/5x</strong> nome</tt><br />
<tt>0x804b008:      0x54    0x20    0x61    0x67    0x6f</tt><br />
<tt>(gdb) <strong>x/5c</strong> nome</tt><br />
<tt>0x804b008:      84 'T'  32 ' '  97 'a'  103 'g' 111 'o'</tt><br />
<tt> <span style="color: red; ">(Você pode ver o conteúdo da variável com deslocamento 'offset')</span></tt><br />
<tt>(gdb) <strong>print</strong> nome+3</tt><br />
<tt>$17 = 0x804b00b "go"</tt><br />
<tt></tt></p>
<p style="text-align: justify;">Meu amigo Antônio (aka John) fez um exemplo do uso de classes em C, vamos utilizá-lo por aqui. Para mostrar o ponteiro para função, só vou adicionar uma função/método <em>subtraiMinhaClasse</em> no código.</p>

<div class="wp_syntax"><div class="code"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include </span>
&nbsp;
<span style="color: #993333;">struct</span> MinhaClasse<span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> a<span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> b<span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>soma<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">int</span> somaMinhaClasse<span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> MinhaClasse <span style="color: #339933;">*</span>this<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>this<span style="color: #009900;">&#41;</span>.<span style="color: #202020;">a</span> <span style="color: #339933;">+</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>this<span style="color: #009900;">&#41;</span>.<span style="color: #202020;">b</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> subtraiMinhaClasse<span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> MinhaClasse <span style="color: #339933;">*</span>this<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">return</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>this<span style="color: #009900;">&#41;</span>.<span style="color: #202020;">a</span> <span style="color: #339933;">-</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>this<span style="color: #009900;">&#41;</span>.<span style="color: #202020;">b</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> construtorMinhaClasse<span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> MinhaClasse <span style="color: #339933;">*</span>this<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    this<span style="color: #339933;">-&amp;</span>gt<span style="color: #339933;">;</span>soma <span style="color: #339933;">=</span> somaMinhaClasse<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #993333;">int</span> resposta<span style="color: #339933;">;</span>
    <span style="color: #993333;">struct</span> MinhaClasse objeto<span style="color: #339933;">;</span>
    construtorMinhaClasse<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span>objeto<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    objeto.<span style="color: #202020;">a</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">33</span><span style="color: #339933;">;</span>
    objeto.<span style="color: #202020;">b</span> <span style="color: #339933;">=</span> <span style="color: #0000dd;">15</span><span style="color: #339933;">;</span>
&nbsp;
    resposta <span style="color: #339933;">=</span> objeto.<span style="color: #202020;">soma</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000066;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%i&quot;</span><span style="color: #339933;">,</span>resposta<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<div class="indent"><tt></tt></p>
<p><tt>(gdb) <strong>break</strong> 34</tt></p>
<p><tt>Breakpoint 1 at 0x8048425: file john.c, line 34.</tt></p>
<p><tt>(gdb) <strong>r</strong></tt></p>
<p><tt>Starting program: /home/maluta/a.out</tt></p>
<p><tt>Breakpoint 1, main () at john.c:34</tt></p>
<p><tt>29              printf("%i",resposta);</tt></div>
<p><tt><br />
</tt></p>
<div class="indent"><span style="color: red; "><tt>(Vamos ver o que tem na struct)</tt></span><tt></tt></p>
<p><tt>(gdb) <strong>print</strong> objeto</tt></p>
<p><tt>$1 = {a = 33, b = 15, soma = 0x80483d0 &lt;somaMinhaClasse&gt;}</tt></div>
<p><tt><br />
</tt></p>
<div class="indent"><span style="color: red; "><tt>(Bem como o valor contido em resposta)</tt></span><tt></tt></p>
<p><tt>(gdb) <strong>print</strong> resposta</tt></p>
<p><tt>$2 = 48</tt></div>
<p><tt><br />
</tt></p>
<div class="indent"><span style="color: red; "><tt>(Qual o endereço da função somaMinhaClasse?)</tt></span><tt></tt></p>
<p><tt>(gdb) <strong>print</strong> somaMinhaClasse</tt></p>
<p><tt>$3 = {int (struct MinhaClasse *)} 0x80483d0 &lt;somaMinhaClasse&gt;</tt></div>
<div class="indent"><span style="color: red; "><tt>(Que interessante... objeto.soma e somaMinhaClasse tem o mesmo endereço?)</tt></span><tt></tt></p>
<p><tt>(gdb) <strong>print</strong> objeto.soma</tt></p>
<p><tt>$4 = (int (*)()) 0x80483d0 &lt;somaMinhaClasse&gt;</tt></div>
<div class="indent"><span style="color: red; "><tt>(E a função subtraiMinha classe está sozinha?)</tt></span><tt></tt></p>
<p><tt>(gdb) <strong>print</strong> subtraiMinhaClasse</tt></p>
<p><tt>$5 = {int (struct MinhaClasse *)} 0x80483e3 &lt;subtraiMinhaClasse&gt;</tt></div>
<p><tt><br />
</tt></p>
<div class="indent"><span style="color: red; "><tt>(Que tal conectá-la a alguém?)</tt></span><tt></tt></p>
<p><tt>(gdb) <strong>set</strong> objeto.soma=subtraiMinhaClasse</tt></p>
<p><span style="color: red; "><tt>(E lógico ver o resultado!)</tt></span><tt></tt></p>
<p><tt>(gdb) <strong>print</strong> objeto.soma()</tt></p>
<p><tt>$6 = 18</tt></p>
<p><span style="color: red; "><tt>(O novo par de objeto.soma <img src='http://www.coding.com.br/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> )</tt></span><tt></tt></p>
<p><tt>(gdb) <strong>print</strong> objeto.soma</tt></p>
<p><tt>$8 = (int (*)()) 0x80483e3 &lt;subtraiMinhaClasse&gt;</tt></div>
<p><tt><br />
</tt></p>
<div class="indent"><span style="color: red; "><tt>(Não gostei! Quero voltar para o que tinha antes)</tt></span><tt></tt></p>
<p><tt>(gdb) <strong>set</strong> objeto.soma=somaMinhaClasse</tt></p>
<p><tt>(gdb) <strong>print</strong> objeto.soma()</tt></p>
<p><tt>$9 = 48</tt></p>
<p><tt></tt></div>
<p><!--closing page content--></p>
]]></content:encoded>
			<wfw:commentRss>http://www.coding.com.br/programacao/basico-de-ponteiros-com-o-gdb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->
