Чи існує інтернет-ім’я деманглера для 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.