Чи існує інтернет-ім’я деманглера для C ++? [зачинено]


109

Я отримую досить довгу і заплутану помилку посилання, і мені сподобається, якби я міг просто вставити її в якийсь текстовий ящик на якомусь веб-сайті і мати імена, не змінені для мене.

Хтось знає про таку послугу?


3
Btw, який твій компілятор? Можливо, ви просто можете використовувати готовий інструмент, що постачається разом з ним.
гострий зуб

4
Я знайшов "undname.exe", і він зробив роботу для VC ++.
Роман Старков

3
вставте своє ім'я, і ​​якщо це ім'я VC2005, я його демантую.
xtofl

Відповіді:


133

Я створив таку інтернет-серівіку: https://demangler.com

Це деманглер символу gcc c ++. Ви просто скопіюєте слід стека або вихід nm у текстове поле, і він поверне висновок з іменами, розібраними.

@Update: Тепер він також демонтує символи MSVC та Java.


Цей працював для мене, але не той, у більш популярній відповіді: _ZN9cdnalizer11rewriteHTMLINS_6apache8IteratorEcEET_RKSsRKNS_6ConfigES3_S3_St8functionIFS3_RKS3_SB_EES9_IFvSsEE
mati

Ваш деманглер не може зняти кваліфікаційні кваліфікації для Itanium. Я дивлюся на _ZNR4test1fEv, породжений Кланг.
Щеня

Дякую, приємний сайт! Чи можете ви додати white-space: normalтег answerSection <pre> (а можливо, додати номери рядків) чи подібне до нього? Наразі довгий однорядний вихід не читабельний.
jplatte

1
Ви повинні бути обережними. Більшість реалізованих реалізацій деманглерів жахливо баггі та небезпечні. Вони, в основному, працюють лише над зловмисними іменами, створеними на тій же платформі, але можуть мати великі складності або виправляти помилки пам'яті на загальних входах.
Керрек СБ

8
Я його регулярно використовую. Це, здається, вниз. Це була дуже приємна, корисна сторінка
chrise

104

Це може бути трохи пізно, але я створив це, грунтуючись на цьому питанні. Він працює з вхідними даними, які я приміряв, підтримує g ++ та msvc ++ через __cxa_demangle та __unDName, складені в Javascript через Emscripten. Сподіваюся, це допоможе комусь: c ++ filtjs

Редагувати: Виправлена ​​проблема усунення


6
Дивовижно! Дякую! Можливо, згадайте десь на сторінці "Інтернет-ім’я деманглера C ++", щоб люди могли знайти вас через Google?
Роман Старков

1
Гаразд, зараз слід виправити.
nattofriends

3
@Zibri: "невелике джерело С" не в Інтернеті. Для цього використовуйте наявні утиліти фільтрації та імені c ++.
nattofriends

1
@nattofriends: Ваш інструмент не схоже на дужки, див ??_R3?$KxSet@V?$KxSpe@DI@@I@@8.
Mooing Duck

2
Було б дуже корисно, якщо ви зможете виправити свою проблему за допомогою шаблонів, про які згадували інші. Це викликало принаймні одне хибне запитання щодо SO.
Шафік Ягмур

24

Більшість (якщо не всі) компілятори C ++ поставляються з c++filtінструментом, який робить саме те, що ви, очевидно, шукаєте.

Якщо ви хочете його натиснути мишкою ... добре напишіть для нього графічний інтерфейс;)


Я хочу це з мінімальними зусиллями, на відміну від клацання миші :) Ну добре, мені це все одно не потрібно.
Роман Старков

3
мій звичайний випадок використання для фільтра c ++ - це objdump -dr ./AClass.o | c++filt | less(демонтаж) або nm ./AClass.o | c++filt | less(список символів всередині файлу об'єкта)
Dummy00001

2
Більшість компіляторів не є GCC. Компілятори, які не є GCC, не постачають c ++ filt. За індукцією більшість компіляторів не постачають c ++ filt.
IIнеочікуваний

9

Є два онлайн-рішення "скопіювати та вставити":

Якщо вам потрібна лише підтримка GCC та Clang, у вас також є можливість використовувати Coliru , який, мабуть, є найбільш універсальним онлайн-компілятором C ++ .

Це не так просто, як вирізати, вставити та натиснути - але не надто складніше - і, схоже, немає проблем із параметрами шаблону, як було зазначено вище. Вам просто потрібно змінити командний рядок, щоб виконати щось подібне:

cat main.cpp | c++filt -t

Дивіться це в прямому ефірі з прикладом :

_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)
           ^^^^^^^^^^^

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.