「SystemTap」の版間の差分
提供: Wikinote
細 |
細 (→覚え書き) |
||
| 行22: | 行22: | ||
... | ... | ||
} | } | ||
| + | |||
| + | === プローブポイント === | ||
| + | 詳細は、'''man stapprobes''' を参照のこと。 | ||
| + | * | ||
=== 組み込み関数 === | === 組み込み関数 === | ||
| − | + | 使えそうなものを挙げておく。詳細は '''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() — | + | * pp() — プローブポイントの情報 |
| − | * probefunc() — | + | * 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 上で実行しなければ問題ないのかもしれないが、もう怖くてできない。。