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?

Roman Starkov
fonte
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
Nenhum requisito online: stackoverflow.com/questions/4468770/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

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.

Rafael baptista
fonte
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

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

Dummy00001
fonte
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)
           ^^^^^^^^^^^
Shafik Yaghmour
fonte
1

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

zed_0xff
fonte