¿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?


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

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.


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


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


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

1

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.