「SystemTap」の版間の差分

提供: Wikinote
移動: 案内検索
(覚え書き)
行22: 行22:
 
     ...
 
     ...
 
  }
 
  }
 +
 +
=== プローブポイント ===
 +
詳細は、'''man stapprobes''' を参照のこと。
 +
*
  
 
=== 組み込み関数 ===
 
=== 組み込み関数 ===
使えそうなものを挙げておく。詳細やすべてのリストは man stapfuncs を参照のこと。
+
使えそうなものを挙げておく。詳細は '''man stapfuncs''' を参照のこと。
 
* cpu() — 現在の CPU 番号
 
* cpu() — 現在の CPU 番号
 
* execname() — 現在のプロセス名
 
* execname() — 現在のプロセス名
 +
* exit() — SystemTap セッションを終了
 +
* pid() — 現在のプロセスの PID
 
* gettimeofday_s() — UNIX epoch からの経過秒数
 
* gettimeofday_s() — UNIX epoch からの経過秒数
 
* ctime() — ctime(gettimeofday_s()) で現在の時刻を表示
 
* ctime() — ctime(gettimeofday_s()) で現在の時刻を表示
* pp() — probe point の情報
+
* pp() — プローブポイントの情報
* probefunc() — probe した関数名
+
* probefunc() — プローブした関数名
* probemod() — probe したモジュール名
+
* probemod() — プローブしたモジュール名
 +
* print_backtrace() — コールスタックを表示する
 +
* print_regs() — レジスタ情報を表示する
 +
 
 +
==== 出力例 ====
 +
 
 +
print_regs() と print_backtrace() のサンプル
 +
 
 +
ソースコード <toggledisplay>
 +
#!/usr/bin/stap -v
 +
global count = 0
 +
probe syscall.select {
 +
    printf("%s[%d] called %s\n", execname(), pid(), probefunc())
 +
    printf("print_regs():\n")
 +
    print_regs()
 +
    printf("print_backtrace():\n")
 +
    print_backtrace()
 +
    count++
 +
 +
    if (count == 10) {
 +
        exit()
 +
    }
 +
}
 +
 
 +
</toggledisplay>
 +
この例では 10 回分出力されるが、1 つ抜き出すとこんな感じ。
 +
mysqld[4840] called sys_select
 +
print_regs():
 +
EIP: c048256d
 +
ESP: c0404f17
 +
EAX: 0000008e EBX: 00000000 ECX: f11f1f88 EDX: 2ea34421
 +
ESI: 00000000 EDI: b3366360 EBP: f11f1000 DS: 007b ES: 007b
 +
CR0: 80050033 CR2: 00ec1280 CR3: 03510880 CR4: 000006f0
 +
print_backtrace():
 +
  0xc048256d : sys_select+0x1/0x180 [kernel]
 +
  0xc0404f17 : sys_sigreturn+0x1f8/0xf2d [kernel] (inexact)
 +
  0xdab33663 : packet_exit+0x1a40c91d/0x0 [kernel] (inexact)
 +
  0xffdab336 : packet_exit+0x3f6845f0/0x0 [kernel] (inexact)
 +
  0xffffdab3 : packet_exit+0x3f8d6d6d/0x0 [kernel] (inexact)
 +
  0xffffffda : packet_exit+0x3f8d9294/0x0 [kernel] (inexact)
  
 
== 注意事項 ==
 
== 注意事項 ==
 
* <code>probe kernel.function("*")</code> (すべてのカーネル関数をフック) をやってはいけない。この中で何か出力しようものなら、あっという間にシステムがストールしてしまう (実証済み…)。何も出力しなければ or screen 上で実行しなければ問題ないのかもしれないが、もう怖くてできない。。
 
* <code>probe kernel.function("*")</code> (すべてのカーネル関数をフック) をやってはいけない。この中で何か出力しようものなら、あっという間にシステムがストールしてしまう (実証済み…)。何も出力しなければ or screen 上で実行しなければ問題ないのかもしれないが、もう怖くてできない。。

2009年7月29日 (水) 00:15時点における版

ついに伝家の宝刀 (でも諸刃の剣) を抜く時が来たようだ…。

参考 URL

  • SystemTap 公式ページ。Documentation と Wiki を見ればとりあえず事足りる。

覚え書き

基本形

文法は、awk に似ている。begin/end はオプション。

#!/usr/bin/stap -v

probe begin {
    ...
}

probe kernel.function("sys_*") {
    printf("%s[%d] called %s()\n", execname(), pid(), probefunc())
}

probe end {
    ...
}

プローブポイント

詳細は、man stapprobes を参照のこと。

組み込み関数

使えそうなものを挙げておく。詳細は man stapfuncs を参照のこと。

  • cpu() — 現在の CPU 番号
  • execname() — 現在のプロセス名
  • exit() — SystemTap セッションを終了
  • pid() — 現在のプロセスの PID
  • gettimeofday_s() — UNIX epoch からの経過秒数
  • ctime() — ctime(gettimeofday_s()) で現在の時刻を表示
  • pp() — プローブポイントの情報
  • probefunc() — プローブした関数名
  • probemod() — プローブしたモジュール名
  • print_backtrace() — コールスタックを表示する
  • print_regs() — レジスタ情報を表示する

出力例

print_regs() と print_backtrace() のサンプル

ソースコード <toggledisplay>

#!/usr/bin/stap -v
global count = 0
probe syscall.select {
    printf("%s[%d] called %s\n", execname(), pid(), probefunc())
    printf("print_regs():\n")
    print_regs()
    printf("print_backtrace():\n")
    print_backtrace()
    count++

    if (count == 10) {
        exit()
    }
}

</toggledisplay> この例では 10 回分出力されるが、1 つ抜き出すとこんな感じ。

mysqld[4840] called sys_select
print_regs():
EIP: c048256d
ESP: c0404f17
EAX: 0000008e EBX: 00000000 ECX: f11f1f88 EDX: 2ea34421
ESI: 00000000 EDI: b3366360 EBP: f11f1000 DS: 007b ES: 007b
CR0: 80050033 CR2: 00ec1280 CR3: 03510880 CR4: 000006f0
print_backtrace():
 0xc048256d : sys_select+0x1/0x180 [kernel]
 0xc0404f17 : sys_sigreturn+0x1f8/0xf2d [kernel] (inexact)
 0xdab33663 : packet_exit+0x1a40c91d/0x0 [kernel] (inexact)
 0xffdab336 : packet_exit+0x3f6845f0/0x0 [kernel] (inexact)
 0xffffdab3 : packet_exit+0x3f8d6d6d/0x0 [kernel] (inexact)
 0xffffffda : packet_exit+0x3f8d9294/0x0 [kernel] (inexact)

注意事項

  • probe kernel.function("*") (すべてのカーネル関数をフック) をやってはいけない。この中で何か出力しようものなら、あっという間にシステムがストールしてしまう (実証済み…)。何も出力しなければ or screen 上で実行しなければ問題ないのかもしれないが、もう怖くてできない。。