私は、組立ラインのプロファイリングを行うのに役立つ何かをオンラインで探していました。http://www.webservertalk.com/message897404.htmlで何かを検索して見つけました
この問題には2つの部分があります。特定のタイプ(inc、add、shlなど)のすべての命令を見つけてグループ化を決定し、次に実行されている命令を見つけて正しく合計します。逆アセンブラによるグループ化が十分でない限り、最初のビットは注意が必要です。どの命令が実行されているかを把握するために、Dtraceはもちろんここであなたの友達です(少なくともユーザーランドでは)。
これを行う最も良い方法は、各基本ブロックの始まりだけを計測することです。これらを見つけるのは今のところ手動のプロセスです...しかし、各命令をインストルメント化することは小さなアプリケーションで実行可能です。次に例を示します。
まず、テスト中の非常に些細なCプログラム:
main()
{
int i;
for (i = 0; i < 100; i++)
getpid();
}
さて、少しトリッキーなDスクリプト:
#pragma D option quiet
pid$target:a.out::entry
/address[probefunc] == 0/
{
address[probefunc]=uregs[R_PC];
}
pid$target:a.out::
/address[probefunc] != 0/
{
@a[probefunc,(uregs[R_PC]-address[probefunc]), uregs[R_PC]]=count();
}
END
{
printa("%s+%#x:\t%d\t%@d\n", @a);
}
main+0x1: 1 main+0x3: 1 main+0x6: 1 main+0x9: 1 main+0xe: 1 main+0x11: 1 main+0x14: 1 main+0x17: 1 main+0x1a: 1 main+0x1c: 1 main+0x23: 101 main+0x27: 101 main+0x29: 100 main+0x2e: 100 main+0x31: 100 main+0x33: 100 main+0x35: 1 main+0x36: 1 main+0x37: 1
与えられた例から、これはまさに私が必要としているものです。ただし、それが何をしているのか、DTraceプログラムを保存する方法、結果を取得したいコードで実行する方法がわかりません。そこで、DTraceのバックグラウンドが良好な人がコードを理解し、保存して実行し、結果が表示されることを期待して、これを開きました。