Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[Template] Comment débugger

8 réponses
Avatar
Yannick
Bonjour =E0 tous,

je fais face =E0 au probl=E8me suivant dans une mise au point d'un soft
embarqu=E9 en C++.
Mon moyen de d=E9bug est la sortie de trace sur un port s=E9rie.

Mon embarqu=E9 provoque une violation d'acc=E8s dans le destructeur d'un
template. Or, ce template est massivement utilis=E9 et j'aimerais savoir
quel est le type de celui qui plante.

Concr=E8tement, comment puis-je tracer le nom de la classe CT dans le
code suivant :
template <class cT>
cList<cT>::~cList()
{
}
?

Merci d'avance,

Yannick.

8 réponses

Avatar
Falk Tannhäuser
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

Avatar
alex
bonjour,

"Yannick" a écrit dans le message de news:

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)


Avatar
Stephane Wirtel
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.
Avatar
Falk Tannhäuser
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 <cxxabi.h>
#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

Avatar
Gabriel Dos Reis
On Mon, 27 Aug 2007, alex wrote:

| bonjour,
|
| >"Yannick" a écrit dans le message de news:
| > >
| >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
Avatar
Gabriel Dos Reis
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
Avatar
James Kanze
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

Avatar
Gabriel Dos Reis
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--