15.2. Dyninst の使用

15.2.1. SystemTap での Dyninst の使用

SystemTap とともに Dyninst を使用して root ユーザー以外がユーザー空間の実行ファイル をインストルメント化できるようにするには、--dyninst (または --runtime=dyninst) コマンドラインオプション stap を指定してコマンドを実行します。これは、SystemTap スクリプト stap を、Dyninst ライブラリーを使用する C コードに変換し、この C コードを共有ライブラリーにコンパイルしてから、共有ライブラリーを読み込み、スクリプトを実行します。このように実行する場合は、stap コマンドに -c または -x コマンドラインオプションも指定する必要があることに注意してください。

Dyninst ランタイムを使用して実行ファイルをインストルメント化するには、以下を実行します。

$ scl enable devtoolset-10 "stap --dyninst -c 'command' option... argument..."

同様に、Dyninst ランタイムを使用してユーザーのプロセスをインストルメント化するには、以下を実行します。

$ scl enable devtoolset-10 "stap --dyninst -x process_id option... argument..."

SystemTap の Red Hat Developer Toolset バージョンの詳細は、12章SystemTap を参照してください。SystemTap とその使用方法の概要は、Red Hat Enterprise Linux 7 の SystemTap ビギナーズガイド を参照してください。

例15.1 SystemTap での Dyninst の使用

以下の内容を exercise.C 含むという名前のソースファイルについて考えてみましょう。

#include <stdio.h>

void print_iteration(int value) {
  printf("Iteration number %d\n", value);
}

int main(int argc, char **argv) {
  int i;
  printf("Enter the starting number: ");
  scanf("%d", &i);
  for(; i>0; --i)
    print_iteration(i);
  return 0;
}

このプログラムは、開始番号の入力をユーザー要求し、1 までのカウントダウンを行います。これは、標準出力に番号を出力するために各反復に対して print_iteration() 関数を呼び出します。Red Hat Developer Toolset の g++ コンパイラーを使用して、このプログラムをコマンドラインでコンパイルします。

$ scl enable devtoolset-10 'g++ -g -o exercise exercise.C'

ここ cout.stp で、以下の内容を含む別のソースファイルを考慮します。

#!/usr/bin/stap

global count = 0

probe process.function("print_iteration") {
  count++
}

probe end {
  printf("Function executed %d times.\n", count)
}

この SystemTap スクリプトは、プロセスの実行中に print_iteration() 関数が呼び出された回数を出力します。このスクリプトは、exercise バイナリーファイルで実行します。

$ scl enable devtoolset-10 "stap --dyninst -c './exercise' count.stp"
Enter the starting number: 5
Iteration number 5
Iteration number 4
Iteration number 3
Iteration number 2
Iteration number 1
Function executed 5 times.