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.