2011-02-08 28 views
7

これまでは、hereは、アセンブリではC++関数を簡単に表現できないことが示されています。今では、私はvalgrind関数の出力をmangleするか、関数のアセンブリ名をデマングルしたいと思っているので、callgrindがvalgrindの一部であることを示しています。誰でもこれを試したことがありますか?私はwebsiteを見て、次を発見した:関数をマングル/デマングルする関数

Code to implement demangling is part of the GNU Binutils package; 
see libiberty/cplus-dem.c and include/demangle.h. 

誰もが今までそのような何かを試してみました、私はCにマングル/デマングルしたいですか?私のコンパイラはgcc 4.x

+3

私はあなたの質問を理解していない - あなたはすでに掲載あなた自身の答えは、binutilsのコードを使ってください。他のツールチェーンにも同様のライブラリ/コードスニペットがあるので、どこに問題がありますか? –

+3

IIRCの場合、valgrindには既に--demangle = yesオプションがあり、出力のC++シンボルをデマングルします。 Callgrindは 'valgrind --tool = callgrind --demangle = yes'と呼ばれることができます。 –

+0

@ルーサー:私は別のフォーラムを開いて、私がvallgrindを解体するかどうかを確認しました。http://stackoverflow.com/questions/4846411/de-mangeling-in-callgrindしかし誰も答えませんでした。私は何も提供していないdemangleにLinuxのマニュアルを見た!あなたの提案はうまくいった。 thnks –

答えて

13

コマンドラインツールc++filtを使用して名前をデマングルします。ここで

+2

はい、それはコマンドラインで動作します。私は、質問者がコード内から呼び出せるライブラリ関数を探していたと思います。 – Dave

+0

それは受け入れられた答えなので、質問者が探していたものに関する質問に答えると思います。 –

+0

私はあなたの答えを読むときに何か新しいことを学んだので、私は確かにそれを感謝します。私は質問のタイトルに基づいて探していたので、「コードから」バージョンを追加しました。私は両方の答えが誰かを助けると確信しています。 :) – Dave

11

は以下のページから派生私の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)); 
+0

悪くない。それは 'unique_ptr'にしてもよいし、単に' std :: string'を構築してすぐにfree()することができます。 – sehe

+0

ありがとうございました。 :)私はunique_ptr(それらをまだ使用していない)を見なければならないでしょう。私は故意に余分なコピーを避けるためにstd :: string/immediate free()のアプローチを使用しませんでした。パフォーマンスには多分問題はありません。スピードクリティカルなアプリケーションではなく、通常はデバッグ印刷にしか使用していません。とにかく、誰かが自分のニーズに合わせて機能をカスタマイズするのに十分です。 – Dave

関連する問題