4

私はデバッグ/メモリツールに取り組んでいます。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を指摘されてきましたが、解析ツリーへのパブリック インターフェイスがないこと (それ自体で私を止めることはありません) を除けば、どのパラメーターがデフォルトであるかを判断するのに大変な作業をしなければならないようです。 . どういうわけか、clang をだましてこれを実行させることができれば素晴らしいことです。

4

1 に答える 1

5

STLFiltが役に立ちます。2 つの 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 &)

そのオプションを試してみたい場合は、カスタマイズされた再フォーマットを取得できるはずです(私は試していません)。

于 2012-11-12T13:29:21.590 に答える