【问题标题】:Is there an online name demangler for C++? [closed]是否有 C++ 的在线名称解码器? [关闭]
【发布时间】:2010-06-09 13:51:12
【问题描述】:

我收到了一个相当长且令人困惑的链接错误,如果我可以将它粘贴到某个网站上的某个文本框中并为我解开名称,我会很高兴的。

有人知道这样的服务吗?

【问题讨论】:

  • 顺便说一句,你的编译器是什么?也许你可以使用它附带的现成工具。
  • 我找到了“undname.exe”,它为 VC++ 完成了这项工作。
  • 把你的名字贴在这里,如果是VC2005的名字,我会去破解它。

标签: c++ demangler


【解决方案1】:

我创建了这样一个在线服务:https://demangler.com

这是一个 gcc c++ 符号解译器。您只需将堆栈跟踪或 nm 的输出复制到文本框中,它就会返回名称已解组的输出。

@Update:它现在还对 MSVC 和 Java 符号进行了解码。

【讨论】:

  • 这个对我有用,但不是更流行的答案中的那个:_ZN9cdnalizer11rewriteHTMLINS_6apache8IteratorEcEET_RKSsRKNS_6ConfigES3_S3_St8functionIFS3_RKS3_SB_EES9_IFvSsEE
  • 您的 demangler 无法对 Itanium 的 ref 限定符进行 demangle。我正在查看 Clang 生成的 _ZNR4test1fEv。
  • 谢谢,不错的网站!您能否添加white-space: normal 或类似于 responseSection
     标记(并且可能添加行号)?长单行输出目前不可读。
  • 你应该小心。大多数真实世界的 demangler 实现都非常错​​误且不安全。它们基本上只适用于同一平台生成的错误名称,但可能会遇到高复杂性或一般输入时出现内存错误。
  • 不错的网站。您是否考虑过使其“反应性”?需要在每次提交时重新粘贴损坏的名称变得很麻烦。您也可以重新计算每次更改。
【解决方案2】:

这可能有点晚了,但我根据这个问题创建了一个。它适用于我尝试过的输入,通过 __cxa_demangle 和 __unDName 支持 g++ 和 msvc++,通过 Emscripten 编译为 Javascript。希望这可以帮助某人:c++filtjs

编辑:修复转义问题

【讨论】:

  • 太棒了!谢谢!或许在页面某处提及“在线 C++ 名称拆解器”,以便人们可以通过 Google 找到您?
  • 好的,现在应该修好了。
  • @Zibri:“小 C 源”不在线。为此,请使用现有的 c++filt 和 undname 实用程序。
  • @nattofriends:您的工具似乎没有转义括号,请参阅??_R3?$KxSet@V?$KxSpe@DI@@I@@8
  • 如果您可以使用其他人提到的模板解决您的问题,那将非常有帮助。这导致在 SO 上至少有一个spurious question
【解决方案3】:

大多数(如果不是全部)C++ 编译器都带有 c++filt 工具,它可以完全满足您的需求。

如果你想要它在鼠标点击...为它写一个 GUI ;)

【讨论】:

  • 我想用最少的努力而不是点击鼠标 :) 哦,好吧,反正我并不经常需要它。
  • 我对 c++filt 的常用用例是objdump -dr ./AClass.o | c++filt | less(反汇编程序)或nm ./AClass.o | c++filt | less(目标文件内的符号列表)
  • 大多数编译器不是 GCC。非 GCC 的编译器不提供 c++filt。通过归纳,大多数编译器不提供 c++filt。
  • echo "<mangled content>" | c++filt
  • GCC: c++filt Clang/LLVM: llvm-cxxfilt MSVC: undname.
【解决方案4】:

在线复制粘贴有两种解决方案:

如果您只需要对 GCC 和 Clang 的支持,您还可以选择使用 Coliru,这可能是最通用的 online C++ compiler

这并不像剪切、粘贴和单击那么简单——但也不会太难——而且看起来模板参数没有如上所述的问题。你只需要修改命令行来运行这样的东西:

cat main.cpp | c++filt -t

See it live with this example 哪一个 demangles:

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

【讨论】:

    【解决方案5】:

    仅供参考,还有一个 Ruby gem 可以破解 Borland/MS/任何损坏的名称:unmangler

    【讨论】:

      猜你喜欢
      • 2012-07-09
      • 1970-01-01
      • 2011-01-22
      • 2011-11-04
      • 1970-01-01
      • 2018-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多