<?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>.:: Jorge Pereira ::. &#187; Debug</title>
	<atom:link href="http://blog.jorgepereira.com.br/category/debug/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.jorgepereira.com.br</link>
	<description>"UNIX is basically a simple operating system, but you have to be a genius to understand the simplicity."</description>
	<lastBuildDate>Thu, 01 Jul 2010 04:16:27 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>- Depuração: Parte 1</title>
		<link>http://blog.jorgepereira.com.br/2010/07/01/depuracao-parte-1/</link>
		<comments>http://blog.jorgepereira.com.br/2010/07/01/depuracao-parte-1/#comments</comments>
		<pubDate>Thu, 01 Jul 2010 03:06:46 +0000</pubDate>
		<dc:creator>jpereira</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Debug]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Outros]]></category>
		<category><![CDATA[linux depuração]]></category>

		<guid isPermaLink="false">http://blog.jorgepereira.com.br/?p=952</guid>
		<description><![CDATA[Seja Elegante Talvez possa ser algo que passe despercebido por vários desenvolvedores, porém dúvido quem nunca tenha se deparado com mensagens de &#8220;log&#8221; vagas ou sem nenhum nexo ou bem pior, como mensagens idênticas replicadas por várias partes do código! A algum tempo atrás estava trabalhando em um projeto em que um respectivo desenvolvedor da [...]]]></description>
			<content:encoded><![CDATA[<blockquote>
<h2>Seja Elegante</h2>
</blockquote>
<p>Talvez possa ser algo que passe despercebido por vários desenvolvedores, porém dúvido quem nunca tenha se deparado com mensagens de &#8220;log&#8221; vagas ou sem nenhum nexo ou bem pior, como mensagens idênticas replicadas por várias partes do código!  <img src='http://blog.jorgepereira.com.br/jorge/wp-includes/images/smilies/icon_eek.gif' alt=':shock:' class='wp-smiley' /><br />
A algum tempo atrás estava trabalhando em um projeto em que <em>um respectivo desenvolvedor</em> da equipe possuia o costume de espalhar ou replicar centenas de printf() pelo código com mensagens tipo!</p>
<p>printf(&#8220;!!! FULANO &#8211; Aqui!!!&#8221;);</p>
<p>ou</p>
<p>printf(&#8220;!!! FULANO &#8211; Arquivo.cpp:  Aqui!!!\n&#8221;);</p>
<p>Precisa falar que isto e pessímo? Certo que e preciso um bom senso com o uso de mensagens de depuração pois dependendo ao invés de ajudar podem só atrapalhar. principalmente quando você necessita ter controle sobre tais mensagens, como por exemplo obter a localização da mensagem através do nome da função, arquivo e linha.</p>
<p><div class="note"><div class="notewarning">Lembrando que dependendo da situação e contexto eu sou a favor de utilizar o pragma no compilador ativando o &#8220;<em><a href="http://en.wikipedia.org/wiki/Directive_(programming)" target="_blank">poison</a></em>&#8221; desativando dentre várias funções o printf (), evitando de ter espalhada pelo sistema! Futuramente um post sobre o <em>poison</em>. </div></div></p>
<p>O pré-processador do GCC oferece (*) várias macros, as que irei utilizar em questão são:</p>
<ul>
<li>__FILE__ : Substituída pelo nome do arquivo.</li>
<li>__PRETTY_FUNCTION__ : Substituídas pelo nome nome da função.</li>
<li>__LINE__ : Substituída pelo número da linha de código.</li>
</ul>
<p>(*) <a href="http://gcc.gnu.org/onlinedocs/cpp/Standard-Predefined-Macros.html" target="_blank">Mais detalhes sobre as macros do GCC.</a></p>
<p><a href="http://gcc.gnu.org/onlinedocs/cpp/Standard-Predefined-Macros.html" target="_blank"></a>A utilização dessas macros irá facilitar a localização das mensagens de depuração, Abaixo um simples exemplo demonstrado em <a href="http://blog.jorgepereira.com.br/jorge/wp-content/uploads/2010/06/debug1.c">debug1.c</a>.</p>
<pre class="brush:csharp">/**
 * By Jorge Pereira &lt;jpereiran@gmail.com&gt;
 * Date: Tue Jun 29 02:51:44 BRT 2010
 */

#include &lt;stdio.h&gt;
#include &lt;unistd.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;string.h&gt;

// Macro condicional
#ifdef DEBUG
#	warning "Debug is enabled"
#	define TRACE_DEBUG(fmt, ...) \
	fprintf(stderr, " ** DEBUG: %s:%d %s(): "fmt"\n", \
	__FILE__, __LINE__, __PRETTY_FUNCTION__, ##__VA_ARGS__)
#else
#	warning "Debug is disabled"
#	define TRACE_DEBUG(fmt, ...)
#endif

#define MAX_STRING 5 /* tamanho maximo de uma string */

// Função simples de exemplo...
void
show_name (const char* name,
		   size_t len)
{
	size_t offset = len;

	// Verificação qualquer...
	if (len &gt; MAX_STRING)
	{
		// Abaixo mensagem de depuração, perceba que ela será ativada apenas
                // quando em tempo de compilação você ativar a macro "<strong>DEBUG</strong>"
		TRACE_DEBUG ("Ooops! Tamanho da string(%d) e excedeu o limite(%d)...",
			len, MAX_STRING);
		offset = MAX_STRING;
	}

	// Manipulação qualquer...
	write (STDOUT_FILENO, name, offset);
	write (STDOUT_FILENO, "\n", 1);
}

int
main (int argc, char* argv[])
{
	if (argc &lt; 2)
	{
		printf ("Usage: %s &lt;string&gt;\n", argv[0]);
		exit (1);
	}

	show_name (argv[1], strlen (argv[1]));

	return 0;
}</pre>
<p>Com este exemplo básico em mãos, vamos compilar e executar.</p>
<pre>[jpereira@miracleworld Codes]$ gcc -Wall -o debug1 debug1.c
debug1.c:18:3: warning: #warning "Debug is disabled"
[jpereira@miracleworld Codes]$ ./debug1 "Jorge"
Jorge
[jpereira@miracleworld Codes]$ ./debug1 "Jorge Pereira"
Jorge
[jpereira@miracleworld Codes]$</pre>
<p>Imagine que seu sistema possui inúmeros arquivos e você precisa em determinados pontos obter o máximo de informação sobre as mensagens de depuração, talvez seja interessante ter além de uma mensagem objetiva obter juntamente o nome da função, arquivo e linha de onde foi invocada tal mensagem.</p>
<pre>[jpereira@miracleworld Codes]$ gcc -Wall -DDEBUG -o debug1 debug1.c
debug1.c:13:3: warning: #warning "Debug is enabled"
[jpereira@miracleworld Codes]$ ./debug1 "Jorge"
Jorge
[jpereira@miracleworld Codes]$ ./debug1 "Jorge Pereira"
 ** DEBUG: <strong>debug1.c:36 show_name()</strong>: Ooops! Tamanho da string(13) e excedeu o limite(5)...
Jorge
[jpereira@miracleworld Codes]$</pre>
<p><div class="note"><div class="notetip"> Agora veja situação que você está trabalhando em um sistema com várias checagens complexas de cenários <em>&#8220;nada convencionais&#8221;</em> em que você não tem certeza se vai acontecer sempre ou não.<br />
Sem falar que torna-se um atrativo a possibilidade de você poder ativar/desativar o simples mecanismo, como por exemplo poder criar macros para depuração de componentes específicos (ex.: relacionadas a sockets, I/O, sgdb, &#8230;), isto poderá facilitar a identificação e remoção de bugs.</div></div></p>
<p><div class="note"><div class="noteclassic">Lembrando que este e o primeiro post entre vários que pretendo publicar relacionados a sugestões e técnicas de depuração. Fique de olho na segunda parte desta <em>saga</em> em que irei explicar uma mais dinâmica do mesmo assunto abordado neste post associando ao uso de variáveis de ambiente.<br />
Dúvidas e Sugestões, são sempre bem vindas! <img src='http://blog.jorgepereira.com.br/jorge/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  </div></div></p>
<p>Autor: Jorge Pereira</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jorgepereira.com.br/2010/07/01/depuracao-parte-1/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>- Conhecendo e utilizando a LD_PRELOAD</title>
		<link>http://blog.jorgepereira.com.br/2010/06/11/conhecendo-e-utilizando-a-ld_preload/</link>
		<comments>http://blog.jorgepereira.com.br/2010/06/11/conhecendo-e-utilizando-a-ld_preload/#comments</comments>
		<pubDate>Fri, 11 Jun 2010 06:55:59 +0000</pubDate>
		<dc:creator>jpereira</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Debug]]></category>
		<category><![CDATA[Hacking]]></category>
		<category><![CDATA[Outros]]></category>
		<category><![CDATA[ld_preload linux hacking]]></category>

		<guid isPermaLink="false">http://blog.jorgepereira.com.br/?p=460</guid>
		<description><![CDATA[Muitas pessoas utilizam, utilizaram ou vão utilizar a variável LD_PRELOAD, e por sua vez nem sempre sabem para que ela serve! Caso este seja o seu problema, problema este não mais será!! O que acontece basicamente e que o linker dinâmico do Linux (assim como em tantos outros sistemas operacionais) utiliza diversas formas, alguma delas [...]]]></description>
			<content:encoded><![CDATA[<p>Muitas pessoas utilizam, utilizaram ou vão utilizar a variável <strong>LD_PRELOAD</strong>, e por sua vez nem sempre sabem para que ela serve! Caso este seja o seu problema, problema este não mais será!! <img src='http://blog.jorgepereira.com.br/jorge/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p>O que acontece basicamente e que o linker dinâmico do Linux (assim como em tantos outros sistemas operacionais) utiliza diversas formas, alguma delas sendo através de variáveis de ambiente para controlar seu comportamento. Sendo que neste caso a variável <strong>LD_PRELOAD</strong> informa ao linker dinâmico que carregue as bibliotecas listadas nela antes de carregar quaisquer outras bibliotecas necessárias, enquando <strong>LD_LIBRARY_PATH</strong> especifica um caminho alternativo para usar ao procurar bibliotecas que serão carregadas.</p>
<p>Partindo deste principio podemos fazer com que um programa a ser executado seja &#8220;hijacked&#8221; por outro programa, ou seja. Podemos fazer por <em>exemplo</em> que a função hehe() previamente chamada pelo programa &#8220;A&#8221; tenha seu comportamento alterado sem precisar fazer quaisquer alteração no programa &#8220;A&#8221;. Um pouco complexo? talvez! Mais vamos por a mão na massa! hands on!</p>
<p>Digamos que você tem o programa &#8220;main&#8221; conforme o código de exemplo abaixo, perceba que o código e super simples. apenas declaro um ponteiro de caracteres, aloco memória e em seguida copio uma sequência de caracteres para o ponteiro previamente alocado. Simples, certo?</p>
<p>1) Abaixo código de exemplo de nosso &#8220;<a href="http://blog.jorgepereira.com.br/jorge/wp-content/uploads/2010/06/main.c">main.c</a>&#8221; ou clique aqui para download.</p>
<pre class="brush:csharp">/*
 *  Filename: hijack_main.c
 *  Created: Wed Jun  9 22:11:12 BRT 2010
 *  Author: Jorge Pereira &lt;jpereiran@gmail.com&gt;
 */
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;string.h&gt;

int
main (int argc,
      char* argv[])
{
  char* nome = (char*)malloc (100);

  strcpy (nome, "Jorge Pereira");
  printf ("NOME: %s\n", nome);

  free (nome);
  return 0;
}</pre>
<p># Vamos compilar e executar o nosso exemplo &#8220;main.c&#8221;</p>
<pre>$ gcc -Wall -o main main.c
$ ./main
NOME: Jorge Pereira
$</pre>
<p>Até aqui tudo bem, porém imagine você em uma determinada situação em que precisa saber quantos bytes está sendo alocado por um determinado programa? e você por alguns instantes imagina sobre a possibilidade de poder fazer algum tipo de &#8220;overload&#8221; de uma determinada função na qual você conhece sua assinatura. (Digamos, você sabe a assinatura do método, quantidade e tipos dos parâmetros, &#8230;).</p>
<p>Pois bem, neste exemplo que irei demonstrar será para sobrecarregar todas as chamadas feitas pelo meu programa &#8220;main&#8221; às funções malloc() e free() e em seguida exibir uma mensagem no caso do malloc() imprimindo seu parâmetro que e o tamanho de bytes alocados, e na função free() exibindo os ponteiros que foram liberados.</p>
<p>Neste caso, iremos criar uma biblioteca chamada &#8220;libhijack_hehe.so&#8221; que será carregada através da variável mágica <strong>LD_PRELOAD</strong> em parceria com nosso querido linker dinâmico.</p>
<p>2) Abaixo código de exemplo de &#8220;<a href="http://blog.jorgepereira.com.br/jorge/wp-content/uploads/2010/06/hijack_hehe.c">hijack_hehe.c</a>&#8220;, ou clique aqui para download.</p>
<pre class="brush:csharp">/*
 *  Filename: hijack_hehe.c
 *  Created: Wed Jun  9 22:11:12 BRT 2010
 *  Author: Jorge Pereira &lt;jpereiran@gmail.com&gt;
 */
#define _GNU_SOURCE
#include &lt;stdint.h&gt;
#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;stdarg.h&gt;

#include &lt;dlfcn.h&gt;

#define HIJACK_DEBUG(fmt, ...) \
	fprintf(stderr, " ** DEBUG: %s:%d %s(): "fmt"\n", \
	__FILE__, __LINE__, __PRETTY_FUNCTION__, ##__VA_ARGS__)

static void* (*hack_malloc)(size_t size) = NULL;
static void  (*hack_free)(void *p) = NULL;

static void* rest_malloc = NULL;

void*
malloc (size_t size)
{
  if (hack_malloc == NULL)
  {
    hack_malloc = (void *(*)(size_t)) dlsym (RTLD_NEXT, "malloc");
    rest_malloc = NULL;
  }

  if (rest_malloc == NULL)
  {
    rest_malloc = hack_malloc (size);
    HIJACK_DEBUG ("Alocando (%d) bytes, chunck(%p)", size, (void*)rest_malloc);
    return rest_malloc;
  }

  hack_malloc = NULL;
  return rest_malloc;
}

void
free (void *p)
{
	HIJACK_DEBUG ("Desalocando (%p)", p);

  if (hack_free == NULL)
  {
    hack_free = (void (*)(void *)) dlsym(RTLD_NEXT, "free");
  }

  hack_free (p);
}</pre>
<p>Agora vamos compilar, executar e analisar o comportamento.</p>
<pre>$ gcc -Wall -shared -ldl -o libhijack_hehe.so hijack_hehe.c
$ LD_PRELOAD=./libhijack_hehe.so ./main
 ** DEBUG: hijack_hehe.c:35 malloc(): Alocando (100) bytes, chunck(0x9273008)
NOME: Jorge Pereira
 ** DEBUG: hijack_hehe.c:46 free(): Desalocando (0x9273008)
$</pre>
<p>Percebeu algo diferente na execução com a <strong>LD_PRELOAD</strong> passando como parâmetro a nossa libhijack_hehe.so? pois bem, todas as chamadas às funções malloc() e free() foram sobrecarregadas e passaram a se comportar conforme as versões que escrevi em <strong>hijack_hehe.c</strong>. Caso tenha ficado curioso, e so re-escrever tais exemplos com outras funções que você deseja sobrecarregar e ver o comportamento. Lembrando que basta utilizar a criatividade e perceberá na quantidade de coisas que podem ser feita com tal técnica.</p>
<p>Exemplo: Nas funções que fazem checagem com strcmp(), uso da crypt(), &#8230; entre outras.</p>
<p>Referências</p>
<ul>
<li>man 8 ld.so</li>
</ul>
<p><strong> Autor: </strong>Jorge Pereira<br />
<strong> Data:</strong> Wed Jun  9 23:42:26 BRT 2010</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jorgepereira.com.br/2010/06/11/conhecendo-e-utilizando-a-ld_preload/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>- Depurando bibliotecas dinamicas no Linux</title>
		<link>http://blog.jorgepereira.com.br/2009/01/07/depurando-bibliotecas-dinamicas-no-linux/</link>
		<comments>http://blog.jorgepereira.com.br/2009/01/07/depurando-bibliotecas-dinamicas-no-linux/#comments</comments>
		<pubDate>Wed, 07 Jan 2009 14:24:56 +0000</pubDate>
		<dc:creator>jpereira</dc:creator>
				<category><![CDATA[Debug]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[depuração]]></category>
		<category><![CDATA[ld]]></category>
		<category><![CDATA[linker]]></category>

		<guid isPermaLink="false">http://blog.jorgepereira.com.br/?p=412</guid>
		<description><![CDATA[Durante desenvolvimento do projeto que faço parte aqui na empresa, tive necessidade de fazer uma depuração de todas as funções chamadas externamente a partir de bibliotecas dinâmicas. Então para aqueles que não conhecem tal recurso existente na glibc, abaixo um exemplo utilizando o comando ls como alvo da depuração. 1) Devemos utilizar a variável de [...]]]></description>
			<content:encoded><![CDATA[<p>Durante desenvolvimento do projeto que faço parte aqui na empresa, tive necessidade de fazer uma depuração de todas as funções chamadas externamente a partir de bibliotecas dinâmicas. Então para aqueles que não conhecem tal recurso existente na <em>glibc</em>, abaixo um exemplo utilizando o comando <strong><em>ls</em></strong> como alvo da depuração.</p>
<p>1) Devemos utilizar a variável de ambiente <strong><em>LD_DEBUG</em></strong>, primeiramente iremos utilizar passando o parâmetro <strong><em>help</em></strong> para em seguida utilizar de acordo com a necessidade!</p>
<pre><strong>[root@jiraya ~]#</strong> export LD_DEBUG=help
<strong>[root@jiraya ~]#</strong> ls
Valid options for the LD_DEBUG environment variable are:

libs        display library search paths
reloc       display relocation processing
files       display progress for input file
symbols     display symbol table processing
bindings    display information about symbol binding
versions    display version dependencies
all         all previous options combined
statistics  display relocation statistics
unused      determined unused DSOs
help        display this help message and exit

To direct the debugging output into a file instead of standard output
a filename can be specified using the LD_DEBUG_OUTPUT environment variable.
<strong>[root@localhost ~]# </strong>export LD_DEBUG=libs
<strong>[root@localhost ~]#</strong> ls
5957:     find library=librt.so.1 [0]; searching
5957:      search cache=/etc/ld.so.cache
5957:       trying file=/lib/i686/librt.so.1
5957:
5957:     find library=libacl.so.1 [0]; searching
5957:      search cache=/etc/ld.so.cache
5957:       trying file=/lib/libacl.so.1
5957:
5957:     find library=libc.so.6 [0]; searching
5957:      search cache=/etc/ld.so.cache
5957:       trying file=/lib/i686/libc.so.6
5957:
5957:     find library=libpthread.so.0 [0]; searching
5957:      search cache=/etc/ld.so.cache
5957:       trying file=/lib/i686/libpthread.so.0
5957:
5957:     find library=libattr.so.1 [0]; searching
5957:      search cache=/etc/ld.so.cache
5957:       trying file=/lib/libattr.so.1
5957:
5957:
5957:     calling init: /lib/i686/libpthread.so.0
5957:
5957:
5957:     calling init: /lib/i686/libc.so.6
5957:
5957:
5957:     calling init: /lib/libattr.so.1
5957:
5957:
5957:     calling init: /lib/libacl.so.1
5957:
5957:
5957:     calling init: /lib/i686/librt.so.1
5957:
5957:
5957:     initialize program: ls
5957:
5957:
5957:     transferring control: ls
5957:
5957:     find library=libnss_files.so.2 [0]; searching
5957:      search cache=/etc/ld.so.cache
5957:       trying file=/lib/libnss_files.so.2
5957:
5957:
5957:     calling init: /lib/libnss_files.so.2
5957:
bin  get  hdparm.sh  he  he.c  seeker  src  tmp
<strong>[root@localhost ~]#</strong></pre>
<p>2) Caso queira enviar a saída da depuração para um arquivo, basta utilizar a variável de ambiente LD_DEBUG_OUTPUT, abaixo um exemplo de uma depuração completa com o modo <em><strong>all</strong></em> seguido de toda saída sendo enviada para o arquivo <strong><em>ls-debug-calls.log</em></strong></p>
<p><strong>[root@jiraya ~]#</strong> export LD_DEBUG_OUTPUT=ls-debug-calls.log<br />
<strong>[root@jiraya ~]#</strong> export LD_DEBUG=all<br />
<strong>[root@jiraya ~]#</strong> ls</p>
<p>3) Para desativar, basta simplesmente remover a variável de ambiente <strong><em>LD_DEBUG</em></strong> e se for o caso também a <strong><em>LD_DEBUG_OUTPUT</em></strong></p>
<p><strong>[root@jiraya ~]#</strong> unset LD_DEBUG<br />
<strong>[root@jiraya ~]#</strong> unset LD_DEBUG_OUTPUT<br />
<strong>[root@jiraya ~]#</strong> ls</p>
<p>Mais informações podem ser encontradas em <a href="http://tldp.org/HOWTO/Program-Library-HOWTO/" target="_blank"><em><strong>Program-Library-HOWTO</strong></em></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jorgepereira.com.br/2009/01/07/depurando-bibliotecas-dinamicas-no-linux/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>- bug x feature</title>
		<link>http://blog.jorgepereira.com.br/2008/12/11/bug-x-feature/</link>
		<comments>http://blog.jorgepereira.com.br/2008/12/11/bug-x-feature/#comments</comments>
		<pubDate>Thu, 11 Dec 2008 17:34:15 +0000</pubDate>
		<dc:creator>jpereira</dc:creator>
				<category><![CDATA[Debug]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[piada]]></category>

		<guid isPermaLink="false">http://blog.jorgepereira.com.br/?p=402</guid>
		<description><![CDATA[Quem nunca tiver implementado um &#8220;bug elegante&#8221; que atire a primeira pedra&#8230;]]></description>
			<content:encoded><![CDATA[<p>Quem nunca tiver implementado um &#8220;bug elegante&#8221; que atire a primeira pedra&#8230; <img src='http://blog.jorgepereira.com.br/jorge/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-403" title="bug-feature" src="http://blog.jorgepereira.com.br/jorge/wp-content/uploads/2008/12/bug-feature.jpg" alt="" width="618" height="463" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.jorgepereira.com.br/2008/12/11/bug-x-feature/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>- Debugando com o GDB</title>
		<link>http://blog.jorgepereira.com.br/2008/06/05/debugando-com-o-gdb/</link>
		<comments>http://blog.jorgepereira.com.br/2008/06/05/debugando-com-o-gdb/#comments</comments>
		<pubDate>Thu, 05 Jun 2008 13:40:12 +0000</pubDate>
		<dc:creator>jpereira</dc:creator>
				<category><![CDATA[Debug]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://blog.jorgepereira.com.br/?p=76</guid>
		<description><![CDATA[Bem, Acredito que todos que trabalham com desenvolvimento utilizando o Linux, já precisaram depurar algum trecho de código, e todos sabem que para quem não tem muito costume ele não e muito &#8220;amigável&#8221;. então segue abaixo link com tutorial e alguns arquivos de configuração contendo atalhos entre outras funções que com certeza irá ajudar muito [...]]]></description>
			<content:encoded><![CDATA[<p>Bem,</p>
<p>Acredito que todos que trabalham com desenvolvimento utilizando o Linux, já precisaram depurar algum trecho de código, e todos sabem que para quem não tem muito costume ele não e muito &#8220;amigável&#8221;. então segue abaixo  link com tutorial e alguns arquivos de configuração contendo atalhos entre outras funções que com certeza irá ajudar muito na hora de depurar.</p>
<p style="text-align: center;"><img class="aligncenter size-full wp-image-338" src="http://blog.jorgepereira.com.br/jorge/wp-content/uploads/2008/10/goboom-bug.png" alt="" width="200" height="200" /></p>
<p>Abaixo segue alguns exemplos de configuração do GDB, lembrando que deverá ser salvo em <strong>~/.gdbinit</strong>, caso queira ter como configuração padrão. do contrário basta utilizar o gdb passando o parâmetro <strong>-command</strong>,</p>
<p>Ex: gdb -command=<strong>gdbinit.txt</strong></p>
<ul>
<li><a href="http://www.kernsh.org/repo/gdbinit.txt" target="_blank">http://www.kernsh.org/repo/gdbinit.txt</a></li>
<li><a href="http://tinderbox.x86.dev.gentoo.org/misc/dot.gdbinit" target="_blank">http://tinderbox.x86.dev.gentoo.org/misc/dot.gdbinit</a></li>
<li><a href="http://dotfiles.org/%7Emkfs/.gdbinit" target="_blank">http://dotfiles.org/~mkfs/.gdbinit</a></li>
</ul>
<p>Excelentes tutoriais sobre GDB</p>
<ul>
<li><a href="http://www.linuxtopia.org/online_books/redhat_linux_debugging_with_gdb/" target="_blank">http://www.linuxtopia.org/online_books/redhat_linux_debugging_with_gdb/</a></li>
<li><a href="http://www.dirac.org/linux/gdb/" target="_blank">http://www.dirac.org/linux/gdb/</a></li>
<li><a href="http://www.arl.wustl.edu/~fredk/Courses/Docs/gdb.pdf" target="_blank">http://www.arl.wustl.edu/~fredk/Courses/Docs/gdb.pdf</a></li>
<li><a href="http://www.arl.wustl.edu/~fredk/Courses/Docs/gdb_refcard.pdf" target="_blank">http://www.arl.wustl.edu/~fredk/Courses/Docs/gdb_refcard.pdf</a></li>
<li><a href="http://www.arl.wustl.edu/~fredk/Courses/Docs/gdbint.pdf">http://www.arl.wustl.edu/~fredk/Courses/Docs/gdbint.pdf</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.jorgepereira.com.br/2008/06/05/debugando-com-o-gdb/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
