Older blog entries for acs (starting at number 45)

Quinto Encontro de Programadores C/C++ Brasil


Olá pessoas,

Após muito tempo ausente, resolvi atualizar esse blogue…

Bem… posso dizer que foi uma ausência significativa, afinal de contas, aconteceram diversas coisas que não me deixaram ter mais tempo para atualizar esse blogue…

Enfim… vamos deixar de “chorumelas” (será que e assim que escreve isso???) e vamos ao que interessa…

Ontem tive um dia bem divertido, ao lado de grandes amigos programadores de C e C++, sim… fui em um evento muito legal na Microsoft, onde só tinham caras muito bons e pessoas de altíssimo nível palestrando e nesse post irei fazer um pequeno resumo do que foi o nosso encontro.

Logo pela manha, tivemos a abertura com o Otavio Pecego da Microsoft que deu uma boa introdução sobre a sua experiência e seu contato inicial com C e C++ e foi ilustrando toda a sua caminhada com os livros que foram importantes na jornada… inclusive, ate peguei algumas sugestões como o livro do John Lakos e o livro do Plauger de STL que eu não conhecia, tenho o C Standard Library que gosto muito… :D

Em seguida, foi a vez do Rodrigo Strauss, um velho conhecido da comunidade falar sobre as ferramentas utilizadas por ele para facilitar o processo de programação e detecção de problemas, ele comentou desde as ferramentas da sysinternals ate o windbg, tirando os problemas que ocorreram com o microfone (dizem que foi sabotagem dos programadores C#) a palestra foi muito produtiva, principalmente para o pessoal que era mais iniciante.

Depois tivemos uma verdadeira aula de Concepts com o Leandro, enfim, posso dizer que já havia tentado ler o livro do Alexandrescu e quando vi isso, fiquei meio aterrorizado, porem, como o tempo era curto, não deu para o palestrante demonstrar tudo o que sabia sobre o assunto, enfim, percebi que preciso ler e dar uma pesquisada melhor nisso.

Well… hora do almoço… e logo apos o mesmo, tivemos uma palestra bem diferente e interessante com o Felipe Almeida, que nos falou sobre Linguagens Embutidas em C++, confesso que a palestra foi bem interessante, porem, achei o exemplo meio que inusitado para a ferramenta especificada, mais enfim… e bom saber que existe esse tipo de coisa na boost…

Depois foi a vez do “meu irmão” a.k.a. Fabio Galuppo dar uma palestra sobre C++ Nativo no Windows Vista e Server 2008 e mostrar coisas bem legais como NTFS Transacional e Thread Pools… e claro, se tratando do nosso amigo Galuppo, não poderia terminar sem o interop de C++, porem, um assunto que muito me interessa e que ele tratou na palestra e que me fez correr atrás das palestras do Gamefest, afinal, já tinha guardado o link aqui e não tinha visto, foi o lance do PPL (Parallel Pattern Library) que e a nova lib de paralelismo que substitui a antiga TPL. Isso pareceu ser bem interessante… :D

E para terminar o set de palestras com chave de ouro, foi a vez do nosso amigo e grande colaborador do grupo, Basílio Miranda falar sobre File Mapping no Windows em C++ e demonstrar exemplos interessantes sobre o assunto… :D

Em seguida, foi a vez dos lighting talks onde o Andre e o Lamarão falaram sobre os seus respectivos projetos em conjunto com a comunidade, sendo que o foco principal foi a otimização da pixman pelo André e a convocação ao publico para trabalharmos em conjunto.

Logo após, houveram os sorteios e dessa vez quem levou a premiação de ajuda a comunidade foi o Pedro Lamarão que ganhou o livro autografado do Sutter

E apos isso, fomos ao bar para poder dialogar sobre o que mais gostamos e um fato curioso foi que pela primeira vez, apareceu uma garota na nossa ida ao bar… sim!!! Para mostrar que nessa comunidade também existem mulheres!!! Porem, o fato mais interessante foi que compareceram varias pessoas novas e as mulheres dessa vez estavam em um numero bem admirável no evento, espero que aumente ainda mais e que as mulheres realmente mostrem a sua forca e parem com esses bla-bla-bla e autopromoções… :D

Enfim, que venha o próximo encontro… que vai ser o encontro de Embarcados…

See ya in the next event!!! :D

      

Syndicated 2008-10-06 00:01:32 from Jumpi's Notepad

Mais Fibonacci: Usando Memoize com map em C++


Há alguns dias atrás, novamente em uma discussão em um dos coffeetime que normalmente ocorrem na empresa, que por sinal são muito produtivas, estávamos eu e mais dois amigos programadores discutindo sobre a técnica de tail recursion, que ajuda bastante na otimização de funções recursivas, porem, estava matutando e me lembrei que existe uma outra técnica, também muito utilizada, principalmente em programas que exigem recursividade e implementam Programação Dinâmica, que é a técnica do “Memoization”.

Mais, resumindo, o que seria esse tal de memoization??? como a própria palavra diz, memoize e um termo que deriva do latim memorandum, ou seja, relembrando, exatamente como essa técnica faz, ela armazena em cache as chamadas de função que são repetidas em varias vezes, economizando assim um tempo precioso no acesso dessas informações.

Exemplos clássicos de demonstração dessa técnica são as implementações recursivas de Fibonacci e calculo de fatorial, no nosso caso, iremos utilizar Fibonacci, por estarmos mais familiarizados com essa função nesse humilde blog.

Suponha, que temos uma implementação recursiva de Fibonacci:

int fib( int n )
{
   if ( n <2 )
     return 1;
   else
     return fib( n - 1 ) + fib( n - 2 );
}

Implementaremos o memoization nessa função, utilizando uma implementação com map da seguinte maneira:

std::map<int,int> resultado;
int fib( int n )
{
  if ( n == 0 || n == 1 )
    return 1;
  std::hash_map<int,int>::iterator it = resultado.find( n );
  if ( it != resultado.end() )
    return it.second;
  else
    return resultado[ n ] = fib( n -1 ) + fib( n - 2 );
}

Ou seja, na primeira vez que esse código for executado, por exemplo, para um fib(4), ele vai ter que calcular respectivamente o fib(2) e fib(3), porem, quando eu chamar um fib(5), como os resultados anteriores ja estarão armazenados no map e o valor será retornado sem nenhum calculo adicional, e com isso, teremos um bom ganho no tempo de execução.

Esse pode ser um recurso muito útil quando estamos lidando com algoritmos que lidam com recursividade, onde a programação dinâmica pode ser aplicada, como por exemplo, uma multiplicação de cadeia de matrizes, um alinhamento de sequência ou ate mesmo um algoritmo de otimização para busca em arvores binárias.

Syndicated 2008-01-23 16:49:13 from Jumpi's Notepad

O Python e a sua misteriosa otimização de chamada de função


Continuando a saga de Fibonacci, eu e meu amigo Marcio fizemos algumas correções e tcharam… devo reconhecer… o script python quando faz chamada de função consegue ser incrivelmente mais rápido que o script perl, também fazendo chamada de função. Porem descobrimos uma coisa muito bizarra e que nos chamou a atenção enquanto realizávamos os testes e por isso foco a minha atenção em relação ao teste feito com python…

Rodando o seguinte código, feito inline em python:

#!/usr/bin/python
for i in range(1000000):
a, b = 0, 1
for j in range(71):
a, b = b, a+b
return b

Profiling do código com chamada de função:


alan@desenv:~$ python -m cProfile fibo.py
1000005 function calls in 86.083 CPU seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 86.083 86.083 :1()
1 57.280 57.280 86.083 86.083 fibo.py:7()
1 0.000 0.000 86.083 86.083 {execfile}
1 0.000 0.000 0.000 0.000 {method ‘disable’ of ‘_lsprof.Profiler’ objects}
1000001 28.802 0.000 28.802 0.000 {range}

E agora o mesmo código, só que realizando chamada de função:


#!/usr/bin/python
import sys
#import psyco
def fib(n):
a, b = 0, 1
for j in range(n):
a, b = b, a+b
return b

x = int(sys.argv[1])
y = int(sys.argv[2])
for i in range(x):
fib(y)

Profiling do código com chamada de função:


alan@desenv:~$ python -m cProfile fibo.py
2000005 function calls in 35.174 CPU seconds
Ordered by: standard name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 35.174 35.174 :1()
1 4.785 4.785 35.173 35.173 fibo.py:6()
1000000 25.671 0.000 30.327 0.000 fibo.py:6(fib)
1 0.000 0.000 35.174 35.174 {execfile}
1 0.000 0.000 0.000 0.000 {method ‘disable’ of ‘_lsprof.Profiler’ objects}
1000001 4.718 0.000 4.718 0.000 {range}

Ou seja, tirando o tempo de overhead do profile, o programa que realiza a chamada de função, consegue ser incrivelmente mais rápido que o programa inline, mesmo efetuando mais chamadas.

Bem… achei isso muito bizarro, sendo que, teoricamente o esperado era que o inline fosse mais rápido. Bem, se alguém puder me explicar isso eu agradeço bastante, pois a única conclusão que consegui tirar ate aqui, e que o python, mesmo sem usar otimizadores, vide psyco, já tem uma otimização natural de funções, o que torna as chamadas de função extremamente rápidas, porem eu queria entender essa otimização de chamada de funções, pois gostei bastante e fiquei interessado em saber como tal feature funciona.

E agora a minha conclusão em relação ao que eu aprendi com esse teste ate aqui, se você precisa fazer um programa bem rápido para testar qualquer coisa, use perl, resolve na maioria dos casos, agora se você precisa de um teste mais elaborado, com chamada de função, vou começar a pensar em usar o python…

Syndicated 2008-01-11 03:06:23 from Jumpi's Notepad

Fibonacci Series Test (Perl and Python)


Post in portuguese about my tests with Fibonacci Series using perl and python…

Esses dias, para ser mais exato, na segunda-feira, o meu colega de trabalho marcio a.k.a. tio estava falando sobre a sua escolha para criar um projeto de site que ele esta fazendo e para testar ele implementou o algorítimo de Fibonacci usando C, C++, Ruby e Python e mediu o tempo utilizando o comando time… C e C++ entraram na lista so para ele poder criar um parâmetro. E então ele decidiu escolher pelo python devido ao tempo, porem, ele esqueceu do nosso velho amigo Perl e eu disse a ele que perl executava o mesmo teste mais rápido que python e ele me desafiou, ou seja, estou fazendo esse teste para demonstrar que o nosso velho amigo perl pode ser bom, lembrando que não sou um bom programador python, mais tentei deixar o código o mais próximo possível entre ambas as linguagens para que nenhum boi-corneta (como diria o meu amigo Caloni, gostei da expressão, por isso a utilizei aqui também) venha se espantar aqui…

Bem… para a realização desse teste, utilizei o meu laptop, um macbook com perl 5.8.8 e python 2.5.1 como podem ver abaixo:

[jumpi@Painkiller]~/Sources: perl -v
This is perl, v5.8.8 built for darwin-thread-multi-2level (with 1 registered patch, see perl -V for more detail)
Copyright 1987-2006, Larry Wall
[jumpi@Painkiller]~/Sources: python -V Python 2.5.1

Para fazer os testes, utilizei uma versão iterativa do algorítimo de Fibonacci (afinal de contas, poderia apelar para a recursiva, porem achei melhor utilizar essa para o teste), segue abaixo o código:

Em perl:

#!/usr/bin/perl  use strict; my $n = shift; my ($a,$b)=(1,2);

print "$a\n$b\n";

for(1..$n-2) {

  ($a,$b) = ($b,$a+$b);

  print "$b\n"

}

Em python:

#!/usr/bin/python import sys def fib(n):

 a, b = 0, 1

 for i in range(n):

 	print b

 	a, b = b, a+b n = int(sys.argv[1])

fib(n)

E executei ambos os códigos, fazendo 10000 iterações e medindo o tempo usando o comando time, onde obtive o seguinte resultado:

Em perl:

real	0m0.188s

user	0m0.054s

sys	0m0.047s

Em python:

real	0m10.778s

user	0m8.104s

sys	0m0.231s

Well… ai esta a prova, pelo que posso ver o nosso velho amigo rabugento perl terminou a sua tarefa em um tempo menor que o python, pelo que posso enxergar, 10x mais rápido???

Brincadeiras a parte, através desse teste simples, podemos perceber que o perl, mesmo estando ultrapassado na visão de muitos, ainda executa muito bem o serviço, logico que poderíamos utilizar n técnicas em ambas as linguagens. Porem, como eu disse no principio, tentei simplificar ao máximo para não criar vantagens para nenhum dos lados.

Hey tio, esse post vai em sua homenagem… se quiser, te ajudo a utilizar perl com catalyst para criar o site…

Brincadeirinha… ;D

Syndicated 2008-01-09 04:07:53 from Jumpi's Notepad

The Practice of Perl II


Upon requesting made and continuing my posts about perl practicality, show here a very elaborated code, extract from classic book that I have reading again, Pike & Kerninghan Practice of Programming.

Yes, this book have a very interesting example of Markov Chains in perl.

For those that dont knowing about Markov Chains, this is a particular case in stochastic process, where previous states are irrelevant for prediction of following states, since that actual state is knowing. This technique is very used for generate random text, as in the book example, but, the author uses only cases that envolve two-word prefixes, for test effects.

The code used in the example, written in perl language:

$MAXGEN = 10000;
$NONWORD = “\n”;
$wl = $w2 = $NONWORD;
while (<>) {
foreach (split) {
push(@{$statetab{$w1}{$w2}}, $_);
($w1, $w2) = ($w2, $_);
}
}
push(@($statetab{$w1}{$w2}}, $NONWORD);
$w1 = $w2 = $NONWORD;
for ($i = 0; $i < $MAXGEN; $i++) {
$suf = $statetab{$w1}{$w2};
$r = int(rand @$suf);
exit if(($t = $suf->[$r]) eq $NONWORD);
print “$t\n”;
($w1, $w2) = ($w2, $t);
}

And more impressive is what the result is make of simple and rapid form, very rapid, in the final of chapter has a performance table where perl losing only for C implementation, other implementations are written in Java, C++/STL/Deque, C++/STL/List and AWK, being that have 150 lines of code in C versus only 18 in perl.

Well, I dont make apologies to perl, because I love C too, but, as the author says and define in the final of paragraph, scripting languages (perl, in this case) are a good choice for experimental programming and making prototypes, and I conclude, for rapid tasks and tests, perl is again language of my choice.

Syndicated 2008-01-06 20:43:18 from Jumpi's Notepad

Exemplo didatico sobre tratamento de exceção

Um dos exemplos mais didáticos que eu ja vi sobre tratamento de exceções foi dado hoje aqui na empresa onde trabalho, estávamos na cozinha, no coffee time, quando começamos a discutir sobre tratamento de exceções e eis que o meu colega de trabalho, Marcio Andrey a.k.a. tio nos faz a demonstração de como ele explicou tratamento de exceções a outro colega aqui da empresa que estava com duvidas no entendimento do tratamento de exceções e precisava de ajuda para fazer a sua prova.

Segue abaixo o exemplo de código (com permissão do autor, e algumas correções para nao divulgar nomes, of course…):

Pessoa individuo = new Pessoa(”individuo”);

Pessoa gostosa = new Pessoa(”uma gbr gostosa”);

Cerveja cerveja = new Cerveja(”Skol”); //variável antes do try que precisei

individuo.tomaBreja(cerveja);

try {

individuo.pegaNaCintura(gostosa);

individuo.pegaNoPeitinho(gostosa);

individuo.chupaPeitinho(gostosa);

Camisinha johnson = new Camisinha(”Lubrificada”); // precisei de uma variável local aqui.

individuo.poeCamisinha(johnson); // usei a variável local aqui.

individuo.comeASafada(gostosa);

}
catch(TapaNaCaraException e) {
System.out.println(”a gbr tentou te dar um tapa na cara e te deu uma escroteada”);
}
catch(TeEmpurrouException e) {
System.out.println(”a gbr te empurrou e te deu uma escroteada”);
}

catch(TeEmpurrouException e) {
System.out.println(”a gbr te deu uma escroteada”);
}
finally {
individuo.vaiEmbora();
}

Quer exemplo mais didático que esse??? Depois dessa o individuo nunca mais vai se esquecer como fazer uso correto do try/catch…. :D

Meus sinceros agradecimentos ao tio por contribuir com esse post tao instrutivo e ao mesmo tempo engraçado!!! :D

Sorry for Advogato’s people by wrote this in portuguese, I need wrote this and any questions about I wrote, send me a message and I explain :D

Syndicated 2007-12-11 19:35:13 from Jumpi's Notepad

The Excel 2007 Bug

About the bug that affected Excel 2007, I think that is very hard to work with floating point calculations and approximation is very complex and find a problem in logic of this is a true nightmare!!!!

The summary of problem: Excel 2007 store six floating point numbers using binary representation between 65534.99999999995 and 65535, and dont store six between 65535.99999999995 and 65536 and this numbers are the cause of this problem.

I work with arbitrary precision in my scientific intiation and using libraries for care of this part for me, because of difficulties that involve the manipulation of calculate numbers that need arbitrary precision. IMHO, working with type of development demands very attention and very pacience.

The two links have a good explanation of this problem… Its a good lecture!!!

The Excel Bug Explanation by Good Math, Bad Math Blog
The Excel Bug Explanation for Mathematica Developers Blog

See ya people and have a good fun!!!

In play: Emerson, Lake and Palmer - Works (Black) Vol. 1 - 07: The Enemy God

Syndicated 2007-10-03 20:54:32 from Jumpi's Notepad

Really, Code::Blocks Rocks!!!

Really, Code::Blocks Rocks!!!

Well… after a long time I post here again, because of this IDE… yeah… a many time that I try to test it and after tests of my friend Marcio that use and talk about the tool I decided test too. I’m very surprise with this IDE, the installation is very easy and work with this IDE is very easy too… I install it in my VM with WinXP and I testing the OpenGL app and it works very fine… The OpenGL app works fine in my VM too, in considerable time… I decided now use the Code::Blocks for developing my personal project at this time!!! Its convinced me!!! :D

Today, after reading some pages of the Programming Challenges Book I’m trying applying some memoization and dynamic programming techniques for solve some problems in SPOJs and UVA’s online-judge of life. Its a very utility tool for solving many problems. But I need more training for good application of this. I like this… :D

In play: Bruce Dickinson - The Very Best Of (CD 1) - 02: Tattooed Millionarie

Syndicated 2007-09-15 23:13:35 from Jumpi's Notepad

The Practice of Perl

Well.. a sugestive title for an post, but I decide for this title because of Perl is one of my prefer programming languages, my “swiss army knife”… and dont first time that I using perl for solving my problem… ehehehhehehehhee…

But why I talking about perl here??? Because of one problem, for more exactly, the problem 5 of Project Euler (http://projecteuler.net/), a site with mathematical problems that resolve with the use of algorithms. The problem 5 it follows below:

2520 is the smallest number that can be divided by each of the numbers from 1 to 10 without any remainder.

What is the smallest number that is evenly divisible by all of the numbers from 1 to 20?

I trying resolve this using C, but I dont have an simple compiler in my work machine,because in my opinion, Visual C is much complex for this task… (some of my friends dont think it…)

But I think… I have perl interpretor in my machine and write this program in perl dont much harder and I starting the port of C for Perl and write this piece of code for solving my problem:

for ( my $n = 20; 1; $n++ ) {
for ( 1..20 ) {
if ( $n % $_ ) {
last;
}
if ( $_ == 20 ) {
die $n;
}
}
}
Well… is an idiot program, extremaly simple but I have the answer of problem with this… dont consider the execution time, “only” 20 min of the pure brute force for answering the problem… ehehhehehehehehhehe…

And perl with your practical syntax save my world one more time!!!! :D

In Play: Gorguts - The Erosion of Sanity - 04: Orphans of Sickness

Syndicated 2007-08-09 04:22:42 from Jumpi's Notepad

Tutorial Basico de GDB

O post de hoje sera dedicado a esse famoso debugger do mundo UNIX e que pode ser utilizado em ambiente windows tambem, sim… vamos tratar do GNU Debugger ou GDB, software muito util para fazer analises e encontrar erros decorrentes em nossos programas.

Claro que a intenção desse post é ser bem basico, passando apenas informações necessarias para a iniciação, caso alguem queira saber mais, existe uma documentacao excelente, um exemplo disso e o livro Debugging with GDB

Entao chega de conversa e vamos ao que interessa..

Primeiro caso: Compilando para debugar

Iremos utilizar como exemplo, um programa que conta de 0 a 10, como queremos debugar esse programa, para isso utilizamos o seguinte comando

[jumpi@painkiller testes]$ gcc -g contador.c

Com esse comando geramos um arquivo de saida (a.out), que vai conter as informações necessarias para o debugging

Agora e hora de debugar, na linha de comando digitamos:

[jumpi@painkiller testes]$ gdb a.out
GNU gdb Red Hat Linux (6.5-15.fc6rh)
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type “show copying” to see the conditions.
There is absolutely no warranty for GDB. Type “show warranty” for details.
This GDB was configured as “i386-redhat-linux-gnu”…Using host libthread_db library “/lib/libthread_db.so.1″.

(gdb)

Com esse comando, entramos em modo de debugging e o gdb nos apresenta o prompt onde entramos com os comandos necessarios para o debugging.

Hora de definir o breakpoint: no gdb, podemos utilizar numero de linha ou ate mesmo o nome da funcao na qual se deseja inserir o breakpoint, no nosso caso vamos definir um breakpoint na funcao main com o seguinte comando

(gdb) break main
Breakpoint 1 at 0×8048395: file contador.c, line 7.
(gdb)

E agora rodamos o programa dentro do debugger com o seguinte comando

(gdb) run
Starting program: /home/jumpi/testes/a.out

Breakpoint 1, main () at contador.c:7
7 for (i=0; i<=10; i++) {
(gdb)

E ele para exatamente na linha onde foi inserido o breakpoint, no caso como definimos por funcao, entao ele para na primeira linha da funcao, numericamente falando, na linha 7

Agora temos 2 comandos que podemos utilizar para verificar as informacoes, step e next, no caso, step vai fazendo passo a passo, ou seja, linha por linha e o next é utilizado quando desejo passar por subrotinas, no nosso caso vamos utilizar o step e ver o que acontece

(gdb) step
8 printf(”Numero :%d\n”,i);
(gdb) step
Numero :0
7 for (i=0; i<=10; i++) {
(gdb) step
8 printf(”Numero :%d\n”,i);
(gdb) step
Numero :1

Ele vai executando cada passo da funcao solicitada, como estamos dentro de um laco, ele executa o laco ate o seu termino.

Suponha que eu quero verificar o valor da variavel no momento, nesse caso como eu possuo apenas a variavel i, vamos imprimir o seu valor, eu posso utilizar o comando print ou display da seguinte maneira

(gdb) print i
$1 = 4
(gdb) display i
1: i = 4
(gdb)

No caso, com print ele mostra a variavel temporaria que armazena o resultado e com display ele mostra a variavel definida pelo usuario no codigo.

Podemos setar tambem o valor das variaveis com o comando set variable da seguinte maneira

(gdb) set variable i=20
(gdb) display i
2: i = 20
(gdb)

Segundo caso: Utilizando o gdb para analisar coredumps

Coredumps sao arquivos que contem a informacao sobre um determinado erro gerado quando um programa e executado e utilizando o gdb podemos descobrir qual a anomalia do nosso programa

[jumpi@painkiller testes]$ gcc -g contador.c

[jumpi@painkiller testes]$ ./a.out
Numero :(null)
Segmentation fault (core dumped)
[jumpi@painkiller testes]$

Isso significa que o programa gerou um erro e um coredump foi criado, quando verificamos o conteudo do diretorio procurando por core

[jumpi@painkiller testes]$ ls core*
core.6180
[jumpi@painkiller testes]$

Verificamos que o core foi criado, agora vamos utiliza-lo para servir como base de informacao para o nosso debugging no gdb

[jumpi@painkiller testes]$ gdb a.out core.6180
GNU gdb Red Hat Linux (6.5-15.fc6rh)
Copyright (C) 2006 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type “show copying” to see the conditions.
There is absolutely no warranty for GDB. Type “show warranty” for details.
This GDB was configured as “i386-redhat-linux-gnu”…Using host libthread_db library “/lib/libthread_db.so.1″.

warning: Can’t read pathname for load map: Input/output error.
Reading symbols from /lib/libc.so.6…done.
Loaded symbols for /lib/libc.so.6
Reading symbols from /lib/ld-linux.so.2…done.
Loaded symbols for /lib/ld-linux.so.2
Core was generated by `./a.out’.
Program terminated with signal 11, Segmentation fault.
#0 0×0077bf9b in strlen () from /lib/libc.so.6
(gdb)

Carregado o gdb com o arquivo de core, podemos utilizar o comando backtrace ou bt, para verificarmos as chamadas de funções e separarmos por frames

(gdb) bt
#0 0×0077bf9b in strlen () from /lib/libc.so.6
#1 0×0074e1ff in vfprintf () from /lib/libc.so.6
#2 0×007539c3 in printf () from /lib/libc.so.6
#3 0×080483b1 in main () at contador.c:7
(gdb)

Bem, no nosso caso eu verifico que tem um problema no frame 3, na linha 7, entao o comando frame seguido do numero do frame para verificar o que ocorre

(gdb) frame 3
#3 0×080483b1 in main () at contador.c:7
7 printf(”Numero :%s\n”,i);
(gdb)

E assim verifico que por descuido, coloquei um %s, onde era um %i… :)

Bem, utilizei apenas uma pequena fração para demonstrar do que o GDB é capaz, ele pode ser muito util para uma serie de outras coisas, sem contar que existem muitos outros detalhes mais especificos que nao foram abordados aqui nesse post, porem espero que seja util a vocês tambem… Ate a proxima!!! :)

No play: Cacophony - Speed Metal Symphony - 06: Desert Island

Syndicated 2007-07-24 04:19:59 from Jumpi's Notepad

36 older entries...

New Advogato Features

New HTML Parser: The long-awaited libxml2 based HTML parser code is live. It needs further work but already handles most markup better than the original parser.

Keep up with the latest Advogato features by reading the Advogato status blog.

If you're a C programmer with some spare time, take a look at the mod_virgule project page and help us with one of the tasks on the ToDo list!