¿Existe un demandante de nombres en línea para C ++? [cerrado]

109

Recibo un error de enlace bastante largo y confuso, y me encantaría si pudiera pegarlo en algún cuadro de texto en algún sitio web y desarmar los nombres por mí.

¿Alguien sabe de tal servicio?

Roman Starkov
fuente
3
Por cierto, ¿cuál es tu compilador? Tal vez pueda usar una herramienta lista que se envía con él.
diente afilado
4
Encontré "undname.exe" e hizo el trabajo para VC ++.
Roman Starkov
3
pega tu nombre aquí, y si es un nombre de VC2005 lo exigiré.
xtofl
No hay requisitos en línea: stackoverflow.com/questions/4468770/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Respuestas:

133

He creado un servicio en línea de este tipo: https://demangler.com

Este es un demandador de símbolos gcc c ++. Simplemente copie un seguimiento de pila, o la salida de nm en un cuadro de texto, y devolverá la salida con los nombres exigidos.

@Update: ahora también exige símbolos MSVC y Java.

Rafael Baptista
fuente
Este funcionó para mí, pero no el de la respuesta más popular: _ZN9cdnalizer11rewriteHTMLINS_6apache8IteratorEcEET_RKSsRKNS_6ConfigES3_S3_St8functionIFS3_RKS3_SB_EES9_IFvSsEE
matiu
Tu demandante no puede exigir calificadores de referencia para Itanium. Estoy viendo _ZNR4test1fEv generado por Clang.
Puppy
Gracias, buen sitio! ¿Podría agregar white-space: normalo similar a la etiqueta responseSection <pre> (y tal vez agregar números de línea)? La salida larga de una línea no se puede leer actualmente.
jplatte
1
Deberías ser cuidadoso. La mayoría de las implementaciones de demandantes en el mundo real son horriblemente inseguras y con errores. Básicamente, solo funcionan con nombres alterados que produjo la misma plataforma, pero pueden tener una alta complejidad o errores de memoria en las entradas generales.
Kerrek SB
8
Lo he usado con regularidad. Sin embargo, parece estar inactivo. Era una página muy agradable y útil
chrise
104

Esto puede ser un poco tarde, pero creé uno, basado en esta pregunta. Funciona con las entradas que probé, admite g ++ y msvc ++ a través de __cxa_demangle y __unDName, compilado en Javascript a través de Emscripten. Espero que esto ayude a alguien: c ++ filtjs

Editar: problema de escape solucionado

nattofriends
fuente
6
¡Increíble! ¡Gracias! ¿Quizás mencionar "Solicitante de nombre de C ++ en línea" en algún lugar de la página, para que la gente pueda encontrarte a través de Google?
Roman Starkov
1
Bien, debería arreglarse ahora.
nattofriends
3
@Zibri: una "pequeña fuente C" no está en línea. Para eso, use las utilidades existentes de c ++ filt y undname.
nattofriends
1
@nattofriends: Tu herramienta no parece escapar de los corchetes, mira ??_R3?$KxSet@V?$KxSpe@DI@@I@@8.
Mooing Duck
2
Sería muy útil si pudiera solucionar su problema con plantillas que otros han mencionado. Esto ha provocado al menos una pregunta falsa sobre SO.
Shafik Yaghmour
24

La mayoría (si no todos) de los compiladores de C ++ vienen con c++filtherramientas que hacen precisamente lo que aparentemente estás buscando.

Si lo desea con el clic del mouse ... escriba una GUI para ello;)

Dummy00001
fuente
Lo quiero con un mínimo esfuerzo en lugar de con un clic del mouse :) Bueno, no lo necesito muy a menudo de todos modos.
Roman Starkov
3
mi caso de uso habitual para c ++ filt es objdump -dr ./AClass.o | c++filt | less(desensamblador) o nm ./AClass.o | c++filt | less(lista de símbolos dentro del archivo de objeto)
Dummy00001
2
La mayoría de los compiladores no son GCC. Los compiladores que no son GCC no incluyen c ++ filt. Por inducción, la mayoría de los compiladores no envían c ++ filt.
Inspectable
9

Hay dos soluciones en línea para copiar y pegar:

Si solo necesita soporte para GCC y Clang, también tiene la opción de usar Coliru , que es probablemente el compilador de C ++ en línea más versátil .

Esto no es tan simple como cortar, pegar y hacer clic, pero no mucho más difícil, y parece que no hay problemas con los parámetros de la plantilla como se señaló anteriormente. Solo necesita modificar la línea de comando para ejecutar algo como esto:

cat main.cpp | c++filt -t

Véalo en vivo con este ejemplo que exige:

_Z6kernelIfLj3EEvPT_5arrayIPKS0_XT0_EES5_S2_IjXT0_EES6_S0_

a:

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

Para su información, también hay una joya Ruby para exigir Borland / MS / cualquier nombre destrozado: unmangler

zed_0xff
fuente