4

Linux マシンで、PTRACE_SINGLESTEP パラメーターを指定して ptrace を使用して、プログラムのマシン命令の数をカウントしています。この記事に従いました: http://www.ncsu.edu/it/mirror/ldp/LDP/LGNET/81/sandeep.html

しかし、結果は私には奇妙に思えます。非常に単純なプログラムの場合、95000 以上の機械語命令がカウントされます。テストプログラムは

int main(void) { return 23; }

何が起きてる?記事のコードは間違っていますか? (何が問題なのかわかりません。) そうでない場合、そのような単純なプログラムに 95000 を超える命令が必要になる原因は何ですか?

4

2 に答える 2

5

コンパイルしているCプログラムはCライブラリにリンクされています。_startプログラムの実行を開始するシンボルが含まれています。その時点で、Cライブラリはそれ自体を初期化し、最終的にはを呼び出しますmainmain戻った後、制御は_startに戻り、プログラムの戻り値を実行して返すための他の命令がたくさんあります。PTRACE_SINGLESTEP連続して使用しても、コンパイルされた命令の数はカウントされないことに注意してください。実行された命令の数をカウントします。つまり、95kの命令は、に入る前main、実行するとき、mainおよび終了した後に実行されmainます。

于 2009-09-03T21:09:28.400 に答える
1

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

更新: 実は、後で気がついたのですが、あなたはおそらく、やるべきことがたくさんあるダイナミック リンカの操作をトレースしていたのでしょう。誰かがそのようなコメントを残しているのを見たので、コメントに賛成票を投じました。プログラムを静的にリンクしなかった場合、元の回答はどちらも基本的に間違っていました。

于 2009-09-03T21:04:27.227 に答える