Gibt es einen Online-Namens-Demangler für C ++? [geschlossen]


109

Ich erhalte einen ziemlich langen und verwirrenden Linkfehler und würde es lieben, wenn ich ihn einfach in ein Textfeld auf einer Website einfügen und die Namen für mich entstellen könnte.

Kennt jemand einen solchen Service?


3
Übrigens, was ist dein Compiler? Vielleicht können Sie einfach ein fertiges Werkzeug verwenden, das mitgeliefert wird.
Scharfzahn

4
Ich habe "undname.exe" gefunden und es hat den Job für VC ++ gemacht.
Roman Starkov

3
Fügen Sie hier Ihren Namen ein, und wenn es sich um einen VC2005-Namen handelt, entwirre ich ihn.
xtofl

Antworten:


133

Ich habe einen solchen Online-Service erstellt: https://demangler.com

Dies ist ein gcc c ++ Symbol Demangler. Sie kopieren einfach eine Stapelverfolgung oder die Ausgabe von nm in ein Textfeld und es wird die Ausgabe mit den entwirrten Namen zurückgegeben.

@Update: Es entwirrt jetzt auch MSVC- und Java-Symbole.


Dieser hat für mich funktioniert, aber nicht der in der populäreren Antwort: _ZN9cdnalizer11rewriteHTMLINS_6apache8IteratorEcEET_RKSsRKNS_6ConfigES3_S3_St8functionIFS3_RKS3_SB_EES9_IFvSsEE
matiu

Ihr Demangler kann keine Ref-Qualifikanten für Itanium entwirren. Ich schaue auf _ZNR4test1fEv, das von Clang generiert wurde.
Welpe

Danke, schöne Seite! Könnten Sie bitte white-space: normaldas responseSection <pre> -Tag hinzufügen oder ähnlich (und möglicherweise Zeilennummern hinzufügen)? Lange einzeilige Ausgabe ist derzeit nicht lesbar.
jplatte

1
Du solltest vorsichtig sein. Die meisten realen Implementierungen von Demanglern sind schrecklich fehlerhaft und unsicher. Sie arbeiten im Grunde nur mit verstümmelten Namen, die von derselben Plattform erstellt wurden, können jedoch bei allgemeinen Eingaben zu hoher Komplexität oder zu Speicherfehlern führen.
Kerrek SB

8
Ich habe es regelmäßig benutzt. Es scheint jedoch nicht zu funktionieren. Es war eine sehr schöne, nützliche Seite
chrise

104

Dies mag etwas spät sein, aber ich habe basierend auf dieser Frage eine erstellt. Es funktioniert mit den Eingaben, die ich anprobiert habe, unterstützt g ++ und msvc ++ über __cxa_demangle und __unDName, kompiliert über Emscripten nach Javascript. Hoffe das hilft jemandem: c ++ filtjs

Bearbeiten: Escape-Problem behoben


6
Genial! Danke dir! Erwähnen Sie vielleicht irgendwo auf der Seite "Online C ++ Name Demangler", damit die Leute Sie über Google finden können?
Roman Starkov

1
Okay, sollte jetzt behoben werden.
Nattofriends

3
@ Zibri: Eine "kleine C-Quelle" ist nicht online. Verwenden Sie dazu die vorhandenen Dienstprogramme c ++ filt und undname.
Nattofriends

1
@nattofriends: Ihr Tool scheint Klammern nicht zu entkommen ??_R3?$KxSet@V?$KxSpe@DI@@I@@8.
Mooing Duck

2
Es wäre sehr hilfreich, wenn Sie Ihr Problem mit Vorlagen beheben könnten, die andere erwähnt haben. Dies hat mindestens eine falsche Frage zu SO verursacht.
Shafik Yaghmour

24

Die meisten (wenn nicht alle) C ++ - Compiler werden mit einem c++filtTool geliefert, das genau das tut, wonach Sie anscheinend suchen.

Wenn Sie es per Mausklick wollen ... schreiben Sie eine GUI dafür;)


Ich möchte es mit minimalem Aufwand im Gegensatz zu einem Mausklick :) Na ja, ich brauche es sowieso nicht sehr oft.
Roman Starkov

3
Mein üblicher Anwendungsfall für C ++ Filt ist objdump -dr ./AClass.o | c++filt | less(Disassembler) oder nm ./AClass.o | c++filt | less(Liste der Symbole in der Objektdatei)
Dummy00001

2
Die meisten Compiler sind keine GCC. Compiler, die nicht GCC sind, liefern kein C ++ - Filt aus. Durch Induktion liefern die meisten Compiler kein C ++ - Filt aus.
Unsichtbarer

9

Es gibt zwei Online-Lösungen zum Kopieren und Einfügen:

Wenn Sie nur Unterstützung für GCC und Clang benötigen, haben Sie auch die Möglichkeit, Coliru zu verwenden , den wahrscheinlich vielseitigsten Online-C ++ - Compiler .

Dies ist nicht ganz so einfach wie Ausschneiden, Einfügen und Klicken - aber nicht zu viel schwieriger - und es scheint, dass es keine Probleme mit Vorlagenparametern gibt, wie oben erwähnt. Sie müssen nur die Befehlszeile ändern, um Folgendes auszuführen:

cat main.cpp | c++filt -t

Sehen Sie es live mit diesem Beispiel, das entwirrt:

_Z6kernelIfLj3EEvPT_5arrayIPKS0_XT0_EES5_S2_IjXT0_EES6_S0_

zu:

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.