2012-09-01 34 views
4

我正在调试/记忆工具上工作。我想显示来自C++的符号,问题是它们非常冗长。目前我只使用__cxa_demangle,但由于包含了默认的模板参数,这通常会导致超过500个字符的巨大字符串。简化复杂的C++模板符号

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,但除了没有公共接口的分析树(这不会阻止我自己),似乎我必须做的努力工作确定哪些参数是默认值。如果我能以某种方式欺骗铛声为我做这件事,那将是非常棒的。

+4

我想我们都希望有更好的模板调试经验。我记得不得不深入研究'boost :: ptr_map'进行调试,因为所有这些默认参数突然显示并填充页面,所以它很糟糕。尽管如此,我的实用主义可能会为一些类型的内置默认参数列表,以及基于此列表的elision。 –

+0

您可以编写自己的逻辑:将参数列表解析为参数,为您关心的模板提供默认映射,并检查参数是否与默认映射匹配(从后面开始)。 –

+0

不知何故,你的简单例子已经很幸运了,因为你显示'std :: string const'而不是'std :: basic_string ,std :: allocator > > const'。看起来你已经利用了typedef和specializations? –

回答

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

如果你想用它的选择玩,你应该能够得到定制reformating(我的天堂没有尝试过)。