[Template] Comment débugger
Le
Yannick

Bonjour à tous,
je fais face à au problème suivant dans une mise au point d'un soft
embarqué en C++.
Mon moyen de débug est la sortie de trace sur un port série.
Mon embarqué provoque une violation d'accès dans le destructeur d'un
template. Or, ce template est massivement utilisé et j'aimerais savoir
quel est le type de celui qui plante.
Concrètement, comment puis-je tracer le nom de la classe CT dans le
code suivant :
template <class cT>
cList<cT>::~cList()
{
}
?
Merci d'avance,
Yannick.
je fais face à au problème suivant dans une mise au point d'un soft
embarqué en C++.
Mon moyen de débug est la sortie de trace sur un port série.
Mon embarqué provoque une violation d'accès dans le destructeur d'un
template. Or, ce template est massivement utilisé et j'aimerais savoir
quel est le type de celui qui plante.
Concrètement, comment puis-je tracer le nom de la classe CT dans le
code suivant :
template <class cT>
cList<cT>::~cList()
{
}
?
Merci d'avance,
Yannick.
Bien que la Norme ne prévoie rien pour cela, les compilateurs comportent
souvent des extensions permettant de récupérer le nom complet d'une
fonction (avec type des paramètres, type de retour, classes, namespaces
etc). Par example, pour GCC il y a __PRETTY_FUNCTION__ et pour MSVC
__FUNCSIG__.
Falk
je n'ai pas essayé, mais AMA avec typeinfo().name() tu devrais avoir le nom
du type au runtime (donc trace possible)
facilement lisible.
par contre, gcc offre une fonction permettant de démanglé un nom, je ne
me souviens plus du nom de cette fonction, mais je l'ai déjà utilisé et
ça fonctionnait très bien.
#include #include <iostream>
#include <string>
#include <typeinfo>
std::string demangle(char const* name)
{
int status;
char* dem_name = abi::__cxa_demangle(name, 0, 0, &status);
if(status != 0)
std::cerr << __func__ << ": bad status = " << status << 'n';
if(dem_name == 0)
return std::string();
std::string result(dem_name);
std::free(dem_name);
return result;
};
Cette fonction s'utilise sur le résultat de
typeid(TYP).name()
Falk
| bonjour,
|
| >"Yannick" | > >
| >Bonjour à tous,
|
| >Concrètement, comment puis-je tracer le nom de la classe CT dans le
| >code suivant :
| > template <class cT>
| > cList<cT>::~cList()
| > {
| > }
|
| je n'ai pas essayé, mais AMA avec typeinfo().name() tu devrais avoir le nom
| du type au runtime (donc trace possible)
Tu as quelque chose avec typeinfo::name, mais de la a dire que c'est
le nom du type au runtime, il faut beaucoup plus d'hypotheses.
-- Gaby
| typeid( object ).name() retourne le type 'mangled', et ce n'est pas
| facilement lisible.
Cela depend du compilateur. Certainement, GCC va te retourner quelque
chose d'assez hieroglyphique, mais j'ai cru comprendre que le
compilateur de Redmond retournait quelque chose de moins criptique --
ce qui n'est pas sans problemes non plus.
-- Gaby
C'est une question de qualité de l'implémentation. La plupart
des implémentations renvoient quelque chose d'utile : g++ est
une exception. N'empêche que pour le débugging, même le nom
décoré suffit ; tu doit bien pouvoir y trouver les noms de tes
classes.
--
James Kanze (GABI Software) email:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
while the remaining parts are likely unreadable without MIME-aware tools.
--8323584-681950380-1188919745=:27057
Content-Type: TEXT/PLAIN; charset=UTF-8
Content-Transfer-Encoding: 8BIT
On Tue, 4 Sep 2007, James Kanze wrote:
| On Aug 28, 9:59 am, Stephane Wirtel | wrote:
| > typeid( object ).name() retourne le type 'mangled', et ce n'est pas
| > facilement lisible.
|
| C'est une question de qualité de l'implémentation. La plupart
| des implémentations renvoient quelque chose d'utile : g++ est
| une exception.
Cette assertion est probablement vraie si on on enleve de la planete
tous les autres compilateurs qui implementent l'ABI commune.
-- Gaby
--8323584-681950380-1188919745=:27057--