Existe um demangler de nomes online para C ++? [fechadas]


109

Estou recebendo um erro de link bastante longo e confuso e adoraria se pudesse apenas colá-lo em alguma caixa de texto em algum site e ter os nomes desmontados para mim.

Alguém conhece tal serviço?


3
Btw, qual é o seu compilador? Talvez você possa usar uma ferramenta pronta fornecida com ele.
sharptooth

4
Eu encontrei "undname.exe" e funcionou para VC ++.
Roman Starkov

3
cole seu nome aqui e, se for um nome VC2005, eu o desmantelarei.
xtofl

Respostas:


133

Eu criei um serviço online: https://demangler.com

Este é um demangler de símbolo gcc c ++. Basta copiar um rastreamento de pilha, ou a saída de nm em uma caixa de texto, e ele retornará a saída com os nomes demangled.

@Update: Ele agora demangles MSVC e símbolos Java também.


Este funcionou para mim, mas não o da resposta mais popular: _ZN9cdnalizer11rewriteHTMLINS_6apache8IteratorEcEET_RKSsRKNS_6ConfigES3_S3_St8functionIFS3_RKS3_SB_EES9_IFvSsEE
matiu

Seu demangler não pode demangler qualificadores ref para Itanium. Estou olhando para _ZNR4test1fEv gerado pelo Clang.
Cachorro de

Obrigado, bom site! Você poderia adicionar white-space: normalou algo semelhante à tag responseSection <pre> (e talvez adicionar números de linha)? A saída longa de uma linha não pode ser lida atualmente.
jplatte de

1
Você deve ter cuidado. A maioria das implementações do mundo real de demanglers são terrivelmente bugadas e inseguras. Eles basicamente funcionam apenas em nomes mutilados que a mesma plataforma produziu, mas podem apresentar alta complexidade ou erros de memória planos em entradas gerais.
Kerrek SB

8
Eu tenho usado regularmente. Parece estar fora do ar, entretanto. Era uma página muito boa e útil
chrise

104

Pode ser um pouco tarde, mas criei um, com base nesta pergunta. Funciona com as entradas que experimentei, suporta g ++ e msvc ++ via __cxa_demangle e __unDName, compilado para Javascript via Emscripten. Espero que isso ajude alguém: c ++ filtjs

Editar: Corrigido o problema de escape


6
Impressionante! Obrigado! Talvez mencione "Eliminador de nomes C ++ online" em algum lugar da página, para que as pessoas possam encontrá-lo pelo Google.
Roman Starkov

1
Ok, deve ser consertado agora.
nattofriends

3
@Zibri: uma "pequena fonte C" não está online. Para isso, use os utilitários c ++ filt e undname existentes.
nattofriends

1
@nattofriends: Sua ferramenta não parece escapar dos colchetes, veja ??_R3?$KxSet@V?$KxSpe@DI@@I@@8.
Mooing Duck

2
Seria muito útil se você pudesse corrigir seu problema com os modelos que outras pessoas mencionaram. Isso causou pelo menos uma pergunta espúria no SO.
Shafik Yaghmour

24

A maioria (senão todos) dos compiladores C ++ vem com c++filtferramentas que fazem exatamente o que você aparentemente está procurando.

Se você quiser com um clique do mouse ... vamos escrever uma GUI para ele;)


Eu quero isso com o mínimo de esforço ao invés de um clique do mouse :) Bem, eu não preciso disso com muita frequência de qualquer maneira.
Roman Starkov

3
meu caso de uso usual para c ++ filt é objdump -dr ./AClass.o | c++filt | less(desmontador) ou nm ./AClass.o | c++filt | less(lista de símbolos dentro do arquivo objeto)
Dummy00001

2
A maioria dos compiladores não é GCC. Compiladores que não são GCC não enviam c ++ filt. Por indução, a maioria dos compiladores não fornece c ++ filt.
Inspecionável de

9

Existem duas soluções online para copiar e colar:

Se você só precisa de suporte para GCC e Clang, também tem a opção de usar Coliru , que é provavelmente o compilador C ++ online mais versátil .

Isso não é tão simples quanto cortar, colar e clicar - mas não muito mais difícil - e parece que não há problemas com os parâmetros do modelo, conforme observado acima. Você só precisa modificar a linha de comando para executar algo assim:

cat main.cpp | c++filt -t

Veja ao vivo com este exemplo que demangles:

_Z6kernelIfLj3EEvPT_5arrayIPKS0_XT0_EES5_S2_IjXT0_EES6_S0_

para:

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

1

Para sua informação, há também uma joia do Ruby para demangler Borland / MS / quaisquer nomes mutilados: unmangler

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.