Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Corruption de mémoire

0 views
Skip to first unread message

Mickaël Wolff

unread,
Dec 9, 2009, 11:49:07 PM12/9/09
to
Bonjour,

J'ai un problème de corruption de mémoire sur un logiciel de
traitement de fichiers XML. Je sais qu'il en existe d'autres, et qu'il y
a des outils plus adaptés pour ce type de projets. Mais mon but est
d'augmenter mon niveau en C++.

Je ne parviens pas à isoler le problème. Si vous voulez jeter un coup
d'œil au source, il est disponible dans un git :
<git://projects.lupusmic.org/git/vanilla/>. Si vous avez du tempsà
perdre :) Je pense que ce qui suit devrait suffire à un développeur plus
cheveronné que moi en C++.

Dans mon projet j'ai une classe parser qui est destinée à analyser un
fichier en entrée. Il maintient un pointeur sur un objet constant
héritant de state (class abstraite). J'ai une hiérarchie de classes
permettant de décrire des états basiques de l'analyseur. Le but est de
simplifier les prises de conscience de l'objet (suis-je sur un tag ?
dans un nœud de texte, etc). Si vous pensez que ma décision de
conception est erronée, je suis ouvert au critiques (constructives).

Le problème qui m'empêche d'avancer survient dans la classe parser.
Je ne sais pas pourquoi, je sais juste quand, comme le montre la session
gdb qui suit :

La session Gdb :
==== 8< ====
(gdb) break xmltl::parser::operator()()
Breakpoint 1 at 0x804a464
(gdb) run
Starting program: /home/dev/projects/vanilla/tests/.libs/lt-test_parser
state::state(parser * const) 0xbfc2fa5c
state::state(parser * const) 0xbfc2fa64
state::state(parser * const) 0xbfc2fa6c

Breakpoint 1, xmltl::parser::operator() (this=0x9277008) at parser.cpp:49
49 do_reset() ;
(gdb) next
50 do_parse() ;
(gdb) step
xmltl::parser::do_parse (this=0x9277008) at parser.cpp:60
60 while(*this)
(gdb) print *mp_state
warning: can't find linker symbol for virtual table for `xmltl::state' value
$1 = {_vptr.state = 0xb802f668, mp_parser = 0xbfc01580}
(gdb) step
xmltl::parser::operator bool (this=0x9cfa008) at parser.cpp:44
44 return mp_state && *mp_state ;
(gdb) print *mp_state
$2 = {_vptr.state = 0x8048ed3, mp_parser = 0x76}
(gdb) next

Program received signal SIGSEGV, Segmentation fault.
0x70366c74 in ?? ()
==== 8< ====

Je lance la session avec la ligne suivante :
libtool --mode=execute gdb tests/test_parser

Que ce soit en utilisant la libtool ou en compilant directement mon
source avec g++, le crash intervient au même endroit. Ce que je ne
comprends pas, c'est pourquoi GDB émet un warning à propos de la table
virtuelle de xmltl::state.

Je n'ai pas l'impression que c'est un problème de C++, mais plutôt
d'usage des outils de compilation. Entre autre du lieur. Mais là j'avoue
être un peu perdu, pour un code qui me semble pourtant trivial.

Merci à tout ceux qui pourront aider !
--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org

0 new messages