1

私の目標は、特定のバイナリプログラムによって実行されたプロセッサ命令の数を、その実行中に記録することです。ソースコードから(gdbまたはその他の逆アセンブラを介して)実際のマシンコードを取得するのは簡単ですが、これは、命令が複数回実行されたり、完全にスキップされたりするプログラム内の関数呼び出しや分岐を考慮していません。

これに対する簡単な解決策はありますか?

4

3 に答える 3

1

Linuxを使用している場合は、 cachegrindを介してプログラムを実行し、命令数を取得できるはずです。

ollydbgのRunTrace関数を使用して命令カウントを取得することも可能ですが、それはメモリによって制限される場合があります。

または、プログラムを1つのステップで実行するだけの小さなデバッガーを作成することもできます。

于 2011-02-08T20:12:11.473 に答える
1

システムコールを追跡するための生のツールは、プラットフォーム固有です。

  • Solaris:trussまたはdtrace
  • MacOS X:dtrace
  • Linux:strace
  • HP-UX:tusc
  • AIX: truss
  • ウィンドウズ: ...

例(Solaris):

truss -o ls.truss ls $HOME

lsこれにより、ホームディレクトリが一覧表示されるため、によって行われたすべてのシステムコールがキャプチャされます。

OTOH、これはあなたが求めているものではないかもしれません...その場合、それは限られた価値しかありません。

于 2011-02-08T20:18:25.310 に答える
1

これは非常にハードウェア固有ですが、ほとんどのプロセッサは、それらを通過したマシン命令(およびその他のイベント)の正確な数をカウントする機能を提供します。これが、プロファイラーがキャッシュミスなどをキャプチャするために機能する方法です。これらの内部レジスタをクエリすることによって。

PAPIライブラリは、さまざまな主要プロセッサでこのデータをクエリするための呼び出しを提供します。Linux + x86を使用している場合、PerfSuiteには、より簡単に開始できる高レベルのツールがいくつか用意されています。

Intelには、チップの内部カウンターをリアルタイムで監視するために使用できるモニターアプリがあり、パフォーマンス分析ガイドでは、チップ上のさまざまなパフォーマンス監視ユニットとその読み取り方法について説明しています。

于 2011-02-08T23:36:03.537 に答える