Есть ли онлайн-программа для разборки имен для C ++? [закрыто]


109

Я получаю довольно длинную и запутанную ошибку ссылки, и мне бы очень понравилось, если бы я мог просто вставить ее в какое-нибудь текстовое поле на каком-нибудь веб-сайте и исправить имена для меня.

Кто-нибудь знает о таком сервисе?


3
Кстати, какой у вас компилятор? Может быть, вы просто можете использовать готовый инструмент, поставляемый с ним.
Sharptooth

4
Я нашел «undname.exe», и он выполнил свою работу для VC ++.
Роман Старков

3
вставьте сюда свое имя, и если это имя VC2005, я его разобью.
xtofl 09

Ответы:


133

Я создал такой онлайн-сервис: https://demangler.com

Это деманглер символов gcc c ++. Вы просто копируете трассировку стека или вывод nm в текстовое поле, и он возвращает вывод с размеченными именами.

@Update: теперь он также разбирает символы MSVC и Java.


Этот сработал для меня, но не тот, который был в более популярном ответе: _ZN9cdnalizer11rewriteHTMLINS_6apache8IteratorEcEET_RKSsRKNS_6ConfigES3_S3_St8functionIFS3_RKS3_SB_EES9_IFvSsEE
matiu

Ваш деманглер не может разбирать квалификаторы ref для Itanium. Я смотрю на _ZNR4test1fEv, созданный Clang.
Puppy

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

1
Тебе следует быть осторожным. Большинство реальных реализаций деманглеров ужасно ошибочны и небезопасны. Они в основном работают только с искаженными именами, созданными той же платформой, но могут столкнуться с высокой сложностью или с ошибками памяти на общих входных данных.
Kerrek SB

9
Я использовал его регулярно. Однако, похоже, он не работает. Это была очень хорошая и полезная страница
chrise

104

Это может быть немного поздно, но я создал его на основе этого вопроса. Он работает с теми входами, которые я пробовал, поддерживает g ++ и msvc ++ через __cxa_demangle и __unDName, скомпилирован в Javascript через Emscripten. Надеюсь, это кому-то поможет: c ++ filterjs

Изменить: исправлена ​​проблема с побегом


6
Потрясающие! Спасибо! Возможно, упомяните где-нибудь на странице «Online C ++ name demangler», чтобы люди могли найти вас через Google?
Роман Старков

1
Хорошо, это нужно исправить сейчас.
nattofriends

3
@Zibri: "небольшой исходный код C" не в сети. Для этого используйте существующие утилиты C ++ filter и undname.
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 ++. По индукции, большинство компиляторов не поставляют фильтрацию C ++.
Inspectable 01

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

1

К вашему сведению, есть также драгоценный камень Ruby для разборки Borland / MS / любых искаженных имен: unmangler

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.