Esiste un demangler di nomi online per C ++? [chiuso]


109

Sto ricevendo un errore di collegamento abbastanza lungo e confuso e mi piacerebbe se potessi semplicemente incollarlo in una casella di testo su qualche sito Web e avere i nomi non alterati per me.

Qualcuno sa di un tale servizio?


3
A proposito, qual è il tuo compilatore? Forse puoi semplicemente usare uno strumento pronto fornito con esso.
punta di diamante il

4
Ho trovato "undname.exe" e ha funzionato per VC ++.
Roman Starkov

3
incolla qui il tuo nome e se è un nome VC2005 lo districherò.
xtofl

Risposte:


133

Ho creato un tale servizio online: https://demangler.com

Questo è un demangler di simboli gcc c ++. Basta copiare una traccia dello stack, o l'output di nm in una casella di testo, e restituirà l'output con i nomi smembrati.

@Update: ora separa anche i simboli MSVC e Java.


Questo ha funzionato per me, ma non quello nella risposta più popolare: _ZN9cdnalizer11rewriteHTMLINS_6apache8IteratorEcEET_RKSsRKNS_6ConfigES3_S3_St8functionIFS3_RKS3_SB_EES9_IFvSsEE
matiu

Il tuo demangler non può smangiare le qualificazioni ref per Itanium. Sto guardando _ZNR4test1fEv generato da Clang.
Puppy

Grazie, bel sito! Potresti aggiungere white-space: normalo qualcosa di simile al tag responseSection <pre> (e magari aggiungere i numeri di riga)? L'output lungo di una riga non è attualmente leggibile.
jplatte

1
Devi stare attento. La maggior parte delle implementazioni nel mondo reale dei demanglers sono terribilmente buggate e insicure. Fondamentalmente funzionano solo su nomi alterati prodotti dalla stessa piattaforma, ma possono incorrere in errori di elevata complessità o flat out di memoria su input generali.
Kerrek SB

8
L'ho usato regolarmente. Sembra essere inattivo, però. Era una pagina molto bella e utile
chrise

104

Potrebbe essere un po 'tardi, ma ne ho creato uno, sulla base di questa domanda. Funziona con gli input che ho provato, supporta g ++ e msvc ++ tramite __cxa_demangle e __unDName, compilati in Javascript tramite Emscripten. Spero che questo aiuti qualcuno: c ++ filtjs

Modifica: risolto il problema di fuga


6
Eccezionale! Grazie! Forse menzionare "Online C ++ name demangler" da qualche parte nella pagina, in modo che le persone possano trovarti tramite Google?
Roman Starkov

1
Va bene, dovrebbe essere risolto ora.
nattofriends

3
@Zibri: una "piccola sorgente C" non è online. Per questo, usa le utilità esistenti c ++ filt e undname.
nattofriends

1
@nattofriends: il tuo strumento non sembra sfuggire alle parentesi, vedi ??_R3?$KxSet@V?$KxSpe@DI@@I@@8.
Mooing Duck

2
Sarebbe molto utile se potessi risolvere il tuo problema con i modelli menzionati da altri. Ciò ha causato almeno una domanda spuria su SO.
Shafik Yaghmour

24

La maggior parte (se non tutti) i compilatori C ++ sono dotati di uno c++filtstrumento che fa esattamente quello che apparentemente stai cercando.

Se lo vuoi con un clic del mouse ... scrivi una GUI per esso;)


Lo voglio con il minimo sforzo invece che con un clic del mouse :) Oh beh, non ne ho bisogno molto spesso comunque.
Roman Starkov

3
il mio solito caso d'uso per c ++ filt è objdump -dr ./AClass.o | c++filt | less(disassembler) o nm ./AClass.o | c++filt | less(elenco di simboli all'interno del file oggetto)
Dummy00001

2
La maggior parte dei compilatori non sono GCC. I compilatori che non sono GCC non forniscono filt c ++. Per induzione, la maggior parte dei compilatori non fornisce filt c ++.
Rilevabile

9

Esistono due soluzioni online di copia e incolla:

Se hai solo bisogno del supporto per GCC e Clang, hai anche la possibilità di usare Coliru , che è probabilmente il compilatore C ++ online più versatile .

Non è così semplice come tagliare, incollare e fare clic, ma non troppo difficile, e sembra che non ci siano problemi con i parametri del modello come notato sopra. Hai solo bisogno di modificare la riga di comando per eseguire qualcosa del genere:

cat main.cpp | c++filt -t

Guardalo dal vivo con questo esempio che demangles:

_Z6kernelIfLj3EEvPT_5arrayIPKS0_XT0_EES5_S2_IjXT0_EES6_S0_

per:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.