2009-09-03 22 views
4

を使用するプロセスの機械命令をカウントするには、PTRACE_SINGLESTEPパラメータを指定してptraceを使用して、プログラムのマシン命令の数を数えます。私はこの記事に続きました:http://www.ncsu.edu/it/mirror/ldp/LDP/LGNET/81/sandeep.htmlLinuxマシンでPTRACE_SINGLESTEP

しかし、結果は私にとって奇妙なようです。非常に単純なプログラムの場合、95,000を超える機械命令がカウントされます。テストプログラムは

int main(void) { return 23; } 

ここでは何が起こっていますか?記事のコードは間違っていますか? (何が問題なのか分かりません) もしそうでなければ、そのような単純なプログラムは> 95000命令を必要としますか?

+2

ダイナミックリンカのランタイムオーバーヘッドを避けるため、プログラムを静的にリンクしてみてください。 – mark4o

+0

記事リンクが壊れました... – Thilo

答えて

5

コンパイルするCプログラムはCライブラリにリンクされています。これには、プログラムの実行が開始されるシンボル_startが含まれています。その時点で、Cライブラリはそれ自身を初期化し、最終的にmainを呼び出します。 mainが返された後、コントロールは_startに戻り、実行してプログラムの戻り値を返す他の命令があります。 PTRACE_SINGLESTEPを連続して使用しても、コンパイルされた命令の数はカウントされません。命令が実行されたの数を数えます。これは、mainを入力する前に、mainを実行してからmainを終了してから、95k命令が実行されることを意味します。

1

「ソフトウェアの肥大化」と呼ばれるものが原因です。 stdioを初期化してファイナライズする必要があります。また、標準のCランタイムに流出するスレッドコードもあります。もう少し読んで、それをプロファイルすれば、何を正確に見つけることができます。または、ソースを読むだけでもかまいません。

更新:実際に、私は後で、おそらく多くの作業が必要なダイナミックリンカの操作をトレースしていることに気付きました。私は誰かがそのようなコメントを残していることを知っているので、私はコメントをupvoted。プログラムを静的にリンクしていないと、元の回答はどちらも基本的に間違っていました。

関連する問題