[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.
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Falk Tannhäuser
Le #311001
Yannick wrote:
Concrètement, comment puis-je tracer le nom de la classe CT dans le
code suivant :
template <class cT>
cList<cT>::~cList()
{
}


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

alex
Le #310957
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)


Stephane Wirtel
Le #310952
typeid( object ).name() retourne le type 'mangled', et ce n'est pas
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.
Falk Tannhäuser
Le #310910
Stephane Wirtel wrote:
typeid( object ).name() retourne le type 'mangled', et ce n'est pas
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

Gabriel Dos Reis
Le #310905
On Mon, 27 Aug 2007, alex wrote:

| 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
Gabriel Dos Reis
Le #310903
On Tue, 28 Aug 2007, Stephane Wirtel wrote:

| 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
James Kanze
Le #311573
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. 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

Gabriel Dos Reis
Le #311531
This message is in MIME format. The first part should be readable text,
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--
Publicité
Poster une réponse
Anonyme