Existe-t-il un démangler de nom en ligne pour C ++? [fermé]


109

J'obtiens une erreur de lien assez longue et déroutante, et j'adorerais que je puisse simplement la coller dans une zone de texte sur un site Web et que les noms ne soient pas mutilés pour moi.

Quelqu'un connaît-il un tel service?


3
Btw, quel est votre compilateur? Peut-être que vous pouvez simplement utiliser un outil prêt livré avec.
Sharptooth

4
J'ai trouvé "undname.exe" et il a fait le travail pour VC ++.
Roman Starkov

3
collez votre nom ici, et si c'est un nom VC2005 je le démêlerai.
xtofl

Réponses:


133

J'ai créé un tel service en ligne: https://demangler.com

Ceci est un démangler de symbole gcc c ++. Vous copiez simplement une trace de pile, ou la sortie de nm dans une zone de texte, et elle renverra la sortie avec les noms démêlés.

@Update: Il démêle désormais les symboles MSVC et Java également.


Celui-ci a fonctionné pour moi, mais pas celui de la réponse la plus populaire: _ZN9cdnalizer11rewriteHTMLINS_6apache8IteratorEcEET_RKSsRKNS_6ConfigES3_S3_St8functionIFS3_RKS3_SB_EES9_IFvSsEE
matiu

Votre démangeur ne peut pas démêler les qualificatifs de référence pour Itanium. Je regarde _ZNR4test1fEv généré par Clang.
Puppy

Merci, beau site! Pourriez-vous s'il vous plaît ajouter white-space: normalou similaire à la balise responseSection <pre> (et peut-être ajouter des numéros de ligne)? La sortie longue d'une ligne n'est pas lisible actuellement.
jplatte

1
Vous devez être prudent. La plupart des implémentations réelles de démangleurs sont terriblement boguées et peu sûres. Ils ne fonctionnent essentiellement que sur les noms mutilés produits par la même plate-forme, mais peuvent se heurter à une complexité élevée ou à des erreurs de mémoire à plat sur les entrées générales.
Kerrek SB

8
Je l'ai utilisé régulièrement. C'était une page très belle et utile
chrise

104

C'est peut-être un peu tard, mais j'en ai créé un, basé sur cette question. Il fonctionne avec les entrées que j'ai essayées, prend en charge g ++ et msvc ++ via __cxa_demangle et __unDName, compilé en Javascript via Emscripten. J'espère que cela aide quelqu'un: c ++ filtjs

Edit: Correction d'un problème d'échappement


6
Impressionnant! Je vous remercie! Peut-être mentionnez-vous "Démangeur de nom C ++ en ligne" quelque part sur la page, afin que les gens puissent vous trouver via Google?
Roman Starkov

1
D'accord, devrait être corrigé maintenant.
nattofriends

3
@Zibri: une "petite source C" n'est pas en ligne. Pour cela, utilisez les utilitaires c ++ filt et undname existants.
nattofriends

1
@nattofriends: votre outil ne semble pas échapper aux crochets, voir ??_R3?$KxSet@V?$KxSpe@DI@@I@@8.
Mooing Duck

2
Ce serait très utile si vous pouviez résoudre votre problème avec les modèles que d'autres ont mentionnés. Cela a provoqué au moins une question fallacieuse sur SO.
Shafik Yaghmour

24

La plupart (sinon tous) des compilateurs C ++ sont livrés avec un c++filtoutil qui fait exactement ce que vous recherchez apparemment.

Si vous le voulez en un clic de souris ... eh bien écrivez une interface graphique pour cela;)


Je le veux avec un minimum d'effort plutôt qu'avec un clic de souris :) Eh bien, je n'en ai pas besoin très souvent de toute façon.
Roman Starkov

3
mon cas d'utilisation habituel pour c ++ filt est objdump -dr ./AClass.o | c++filt | less(désassembleur) ou nm ./AClass.o | c++filt | less(liste des symboles à l'intérieur du fichier objet)
Dummy00001

2
La plupart des compilateurs ne sont pas GCC. Les compilateurs qui ne sont pas GCC ne livrent pas de fichier c ++. Par induction, la plupart des compilateurs ne livrent pas de fichier c ++.
IInspectable

9

Il existe deux solutions de copier-coller en ligne:

Si vous n'avez besoin que de la prise en charge de GCC et Clang, vous avez également la possibilité d'utiliser Coliru , qui est probablement le compilateur C ++ en ligne le plus polyvalent .

Ce n'est pas aussi simple que couper, coller et cliquer - mais pas trop difficile - et il semble qu'il n'y ait pas de problèmes avec les paramètres du modèle comme indiqué ci-dessus. Il vous suffit de modifier la ligne de commande pour exécuter quelque chose comme ceci:

cat main.cpp | c++filt -t

Voyez-le en direct avec cet exemple qui démêle:

_Z6kernelIfLj3EEvPT_5arrayIPKS0_XT0_EES5_S2_IjXT0_EES6_S0_

à:

void kernel<float, 3u>(float*, array<float const*, 3u>, array<float const*, 3u>, array<unsigned int, 3u>, array<unsigned int, 3u>, float)
           ^^^^^^^^^^^

1

Pour info, il y a aussi un joyau Ruby pour démêler Borland / MS / quels que soient les noms mutilés: démêler

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.