简化复杂的C ++模板符号

时间:2012-09-01 12:19:22

标签: c++ templates clang debug-symbols clang++

我正在研究调试/内存工具。我想显示来自C ++的符号,问题是它们非常冗长。目前我只使用__cxa_demangle,但由于包含默认模板参数,这通常会产生超过500个字符的大字符串。

clang++在报告符号时可以清楚地做出聪明的事情,有什么方法可以利用它吗?

举个简单的例子,我们来看看:

std::map<std::string const, unsigned int, std::less<std::string const>, std::allocator<std::pair<std::string const, unsigned int> > >::find(std::string const&)

显然可以报告为:

std::map<std::string const, unsigned int>::find(std::string const&)

..如果我有足够聪明的工具。很明显,如果没有额外的知识(比如最初使用的包含 - 我可能会得到这些),这很难做到,但我会感激任何指针。

到目前为止,我已被指向libcxxabi,但除了没有解析树的公共接口(这本身不会阻止我)之外,似乎我必须这样做努力确定哪些参数是默认值。如果我能以某种方式欺骗我这样做,那将是很棒的。

1 个答案:

答案 0 :(得分:5)

STLFilt可以帮到你。有两个perl脚本,STLFilt.pl(用于Visual C ++)和gSTLFilt.p(用于gcc)。它被设计用于简化错误消息,但我已经将它用于后处理__cxa_demangle的输出。

在没有任何选项的简单示例中使用:

echo "std::map<std::string const, unsigned int, std::less<std::string const>, std::allocator<std::pair<std::string const, unsigned int> > >::find(std::string const&)" \
| perl ./gSTLFilt.pl

获取输出:

BD Software STL Message Decryptor v3.10 for gcc 2/3/4
map<string const, unsigned int>::find(string const &)

如果您想使用它的选项,您应该能够获得自定义的重新格式化(我还没有尝试过)。