質問

古いブログ投稿の最初の質問に対する Stack Overflow スタイルの素敵な答えを探しています C++ コードサイズ, 以下に繰り返します。

コンパイル/リンクされたコードのどの部分が C++ ソース コードのどの部分から生成されているかを表示するツール (理想的には g++ ベース) が欲しいと思っています。たとえば、特定のテンプレートが何百もの異なる型に対してインスタンス化されているかどうか (テンプレートの特殊化によって修正可能)、コードが過度にインライン化されていないか、特定の関数が予想より大きいかどうかを確認します。

役に立ちましたか?

解決

それは存在している必要があります。このようなことのように思えるんが、私はそれのようなものを使用していません。私はこの一緒にスクリプトに取り掛かるだろうどのようにでも、私はあなたを伝えることができます。それを行うには、おそらく迅速確実および/またはセクシー方法があります。

まず、あなたはすでに知っていることがいくつかのもの:

addr2lineにコマンドは、アドレスを取り込み、どこのソースコードは、そのマシンコードが実装を伝えることができます。デバッグシンボルで構築することが実行可能なニーズ、そしてあなたはおそらく(あなたが最初とにかくで行きたいと思いますよう-O0、-O1、または-Osが高いと思われる)ずっとそれを最適化したいではないでしょう。 addr2lineには、いくつかのフラグを持って、あなたはそのマニュアルページを読みたいと思うでしょうが、あなたは間違いなくあなたが出力に理にかなっていることC ++関数名を表示したい場合は、-Cまたは--demangleを使用する必要があります。

objdumpのコマンドは、オブジェクト・ファイルの多くの種類の中のものについての興味深いあらゆる種類のものをプリントアウトすることができます。それができることの一つは、内のシンボルを表すテーブルをプリントアウトしたり(実行ファイルを含む)オブジェクトファイルによって参照されます。

さて、あなたはそれで何をしたいか:

何がしたいと思うことは、あなたに.textセクションのアドレスとサイズを指示するobjdumpのためのものです。実際の実行可能なマシンコードが住んでいるところです。 (とにかく、これのために)があり、これを行うには、いくつかの方法がありますが、最も簡単なあなたがするために、おそらくです:

objdump -h my_exe | grep text

:のようなものになるはずです。

 12  .text       0000049  000000f000  0000000f000 00000400  2**4

:あなたはそれをgrepするしなかった場合は、

それはあなたのような見出しを与えるだろう

Idx  Name        Size     VMA         LMA         File off  Algn

私はあなたが使用している問題ではないだろうが、私はLMAがベストだと思いますので、実行可能ファイルVMAとLMAは、同じであるべきだと思います。また、サイズをお勧めします。

LMAとサイズで

は、あなたが繰り返しマシンコードのソースコードの起源を求めaddr2lineに呼び出すことができます。私はあなたが1つの命令の範囲内であったアドレスを渡された場合、これがうまくいく方法がわからないんだけど、私はそれが動作するはずだと思います。

addr2line -e my_exe <address>

このからの出力は、パス/ファイル名、コロン、および行番号であろう。 あなたはそれぞれの固有のパス/ファイルの発生カウントするようにした場合:numは、あなたは最高のカウントを持っているものを見てすることができるはずです。 Perlののハッシュパス/ファイルを使用して:あろうNUMキーと値としてカウンタあなたはその実行が遅すぎる見つけた場合より高速な方法がありますが、これを実装する簡単な方法。 また、あなたが早期に含める必要はありません判断することができるものを除外することができます。 あなたの出力を表示するために、あなたは、同じ機能とは別のラインからフィルタリングすることはできますが、一つの関数内の異なる行は面白いかもしれ異なるカウントを、持っていることに気づくことがあります。とにかく、それはaddr2lineにはあなたに関数名を教えて作るかときの第1のステップと仕事1つの関数に-t objdumpの使用のいずれかによって行うことができる。

あなたは、彼らはあなたがそれらを簡単に見つけて、詳しく見を持つことができなければならないと思うよりも、いくつかのテンプレートコードまたはその他のコード行は、より頻繁にあなたの実行ファイルに現れていることがわかります。マクロとインライン関数が異なりますが、予想よりも自分自身を明示する終わるが表示される場合があります。

あなたが知らなかった場合は、objdumpはとaddr2lineには、 GNU binutilsののパッケージからですこれは他のいくつかの便利なツールが含まれます。

他のヒント

あなたはC ++コードにコードの膨張の原因を見つけるために探している場合は、

は、私がそのための「NM」を使用しました。次のコマンドは、最上部の最大のコードとデータチャンクを使用して、アプリ内のすべてのシンボルを一覧表示されます。

nm --demangle --print-size --size-sort --reverse-sort <executable_or_lib_name> | less

最近ツールを書きましたが、 肥大化非難, 、次のようなことを行います ネイトグースが提案した.

それが役立つならば、私は知らないが、それはあなたの検査のためのテキストファイルに生成アセンブリコードを記述するためのgccのフラグがあります。

"の の-S の     代わりに、オブジェクトファイルの拡張子として.Sを使用して、生成されるアセンブラソースファイルを引き起こすことが-cの代わりに使用します。あなたが生成されたアセンブリコードを調べるために必要がある場合に有用である可能性があります。 「

ほとんどのCコンパイラでは、.MAPファイルを生成する方法があります。このファイルには、そのアドレスとそのサイズコンパイルされたライブラリのすべてが一覧表示されます。あなたは、あなたが最初に最適化するために、探している必要があり、どのファイル判断するためにそのマップファイルを使用することができます。

私はコード - >一般的に組み立て生成マップする方法を知りません。

は、テンプレートのインスタンス化のためにあなたがのようなものを使用することができます「の文字列-a | grepの|ソート-u | GC ++ FILTは」。作成されているもののラフ画を取得する

あなたは実際にはかなり主観的なようで言及された他の2つの項目。インライン化「が多すぎる」とは何ですか?あなたのバイナリファイルが膨張しつつある心配していますか?行うための唯一のこと、実際にそこにgdbに入ると、それは、「過度の」一般的にインライン化をチェックするためには何も発生していないかを確認するために、呼び出し元を分解されます。

それが重要な理由は、

機能のサイズの場合は、再び私が興味?あなたは、コンパイル時に予期せずに拡張するコードを見つけようとしていますか?どのようにしても、ツールを検討するために予想されるサイズが何であるかを定義していますか?ここでも、あなたはいつもあなたが望むよりもはるかに多くのコードにコンパイルされた疑いがあることをすべての機能を蔽う、およびコンパイラがやっている正確にものを見ることができます。

のVisual C ++では、これは、.PDBファイルがあるため、基本的に何である。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top