は以下のページから派生私のC++ 11の実装、次のとおりです。返された(CHAR *)上のメモリ管理を容易にするために http://gcc.gnu.org/onlinedocs/libstdc++/manual/ext_demangling.html
#include <cxxabi.h> // needed for abi::__cxa_demangle
std::shared_ptr<char> cppDemangle(const char *abiName)
{
int status;
char *ret = abi::__cxa_demangle(abiName, 0, 0, &status);
/* NOTE: must free() the returned char when done with it! */
std::shared_ptr<char> retval;
retval.reset((char *)ret, [](char *mem) { if (mem) free((void*)mem); });
return retval;
}
、私はSTDを使用しています:: shared_ptrに、返されたメモリのfree()を呼び出すカスタムlambda 'deleter'関数を追加しました。このため、自分でメモリを削除する心配はありません。必要に応じて使用するだけで、shared_ptrが有効範囲外になると、メモリは解放されます。
ここでは、デマングル型の名前に(const char *)としてアクセスするために使用するマクロを示します。あなたはRTTIだから
#define CLASS_NAME(somePointer) ((const char *) cppDemangle(typeid(*somePointer).name()).get())
「タイプID」へのアクセス権を持つことになっている必要があることに注意してください、私が言うことができるC++クラス内から:
printf("I am inside of a %s\n",CLASS_NAME(this));
私はあなたの質問を理解していない - あなたはすでに掲載あなた自身の答えは、binutilsのコードを使ってください。他のツールチェーンにも同様のライブラリ/コードスニペットがあるので、どこに問題がありますか? –
IIRCの場合、valgrindには既に--demangle = yesオプションがあり、出力のC++シンボルをデマングルします。 Callgrindは 'valgrind --tool = callgrind --demangle = yes'と呼ばれることができます。 –
@ルーサー:私は別のフォーラムを開いて、私がvallgrindを解体するかどうかを確認しました。http://stackoverflow.com/questions/4846411/de-mangeling-in-callgrindしかし誰も答えませんでした。私は何も提供していないdemangleにLinuxのマニュアルを見た!あなたの提案はうまくいった。 thnks –