Czy istnieje internetowy demangler nazw dla C ++? [Zamknięte]


109

Otrzymuję dość długi i mylący błąd linku i bardzo by mi się podobał, gdybym mógł po prostu wkleić go do jakiegoś pola tekstowego na jakiejś stronie internetowej i zmienić nazwy dla mnie.

Czy ktoś wie o takiej usłudze?


3
Przy okazji, jaki jest twój kompilator? Może po prostu możesz użyć gotowego narzędzia dostarczonego z nim.
ostry ząb

4
Znalazłem plik „undname.exe” i wykonał zadanie dla VC ++.
Roman Starkov

3
wklej tutaj swoje imię i nazwisko, a jeśli jest to nazwa VC2005, rozszyfruję je.
xtofl

Odpowiedzi:


133

Stworzyłem taką usługę online: https://demangler.com

To jest demangler symboli gcc c ++. Po prostu skopiuj ślad stosu lub wyjście nm do pola tekstowego, a wynik zwróci wynik z zdemanglowanymi nazwami.

@Update: teraz demontuje również symbole MSVC i Java.


Ten działał dla mnie, ale nie ten w bardziej popularnej odpowiedzi: _ZN9cdnalizer11rewriteHTMLINS_6apache8IteratorEcEET_RKSsRKNS_6ConfigES3_S3_St8functionIFS3_RKS3_SB_EES9_IFvSsEE
matiu

Twój demangler nie może rozszyfrować kwalifikatorów ref dla Itanium. Patrzę na _ZNR4test1fEv wygenerowany przez Clang.
Puppy

Dzięki, fajna strona! Czy mógłbyś dodać white-space: normallub coś podobnego do znacznika responseSection <pre> (i może dodać numery wierszy)? Długie jednowierszowe dane wyjściowe nie są obecnie czytelne.
jplatte

1
Powinieneś być ostrożny. Większość rzeczywistych implementacji demanglerów jest strasznie wadliwa i niepewna. Zasadniczo działają tylko na zniekształconych nazwach, które stworzyła ta sama platforma, ale mogą napotkać dużą złożoność lub wyrównać błędy pamięci na ogólnych danych wejściowych.
Kerrek SB

8
Używałem go regularnie. Wygląda na to, że jest na dole. To była bardzo fajna, przydatna strona
chrise

104

To może być trochę za późno, ale stworzyłem taki na podstawie tego pytania. Działa z danymi wejściowymi, które wypróbowałem, obsługuje g ++ i msvc ++ przez __cxa_demangle i __unDName, skompilowane do Javascript przez Emscripten. Mam nadzieję, że to komuś pomoże: c ++ filtjs

Edycja: Naprawiono problem ucieczki


6
Niesamowite! Dziękuję Ci! Może wspomnij gdzieś na stronie o „Online demangler C ++ name”, aby ludzie mogli Cię znaleźć przez Google?
Roman Starkov

1
OK, powinno zostać teraz naprawione.
nattofriends

3
@Zibri: „małe źródło C” nie jest online. W tym celu użyj istniejących narzędzi c ++ filt i undname.
nattofriends

1
@nattofriends: Twoje narzędzie nie wychodzi poza nawiasy, zobacz ??_R3?$KxSet@V?$KxSpe@DI@@I@@8.
Mooing Duck

2
Byłoby bardzo pomocne, gdybyś mógł rozwiązać problem z szablonami, o których wspominali inni. Spowodowało to co najmniej jedno fałszywe pytanie dotyczące SO.
Shafik Yaghmour

24

Większość (jeśli nie wszystkie) kompilatorów C ++ zawiera c++filtnarzędzie, które robi dokładnie to, czego najwyraźniej szukasz.

Jeśli chcesz to jednym kliknięciem myszy ... cóż, napisz do tego GUI;)


Chcę tego przy minimalnym wysiłku, a nie za pomocą kliknięcia myszą :) No cóż, i tak nie potrzebuję tego zbyt często.
Roman Starkov

3
moim zwykłym przypadkiem użycia dla c ++ filt jest objdump -dr ./AClass.o | c++filt | less(deasembler) lub nm ./AClass.o | c++filt | less(lista symboli wewnątrz pliku obiektowego)
Dummy00001

2
Większość kompilatorów nie jest GCC. Kompilatory, które nie są GCC, nie dostarczają filtru c ++. Przez indukcję większość kompilatorów nie dostarcza filtru c ++.
Niespodziewane

9

Istnieją dwa rozwiązania online do kopiowania i wklejania:

Jeśli potrzebujesz tylko obsługi GCC i Clang, masz również możliwość używania Coliru , który jest prawdopodobnie najbardziej wszechstronnym kompilatorem C ++ online .

Nie jest to tak proste, jak wycinanie, wklejanie i klikanie - ale nie jest to zbyt trudne - i wygląda na to, że nie ma problemów z parametrami szablonu, jak wspomniano powyżej. Wystarczy zmodyfikować wiersz poleceń, aby uruchomić coś takiego:

cat main.cpp | c++filt -t

Zobacz to na żywo z tym przykładem, który demantuje:

_Z6kernelIfLj3EEvPT_5arrayIPKS0_XT0_EES5_S2_IjXT0_EES6_S0_

do:

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.