systemtapでカーネルの関数を呼ぶメモ

systemtapスクリプトカーネル関数を呼ぶのはどうやんだっけ?というところのメモです。

c言語の関数を作って、それを呼び出す形で実装しました。systemtapのマニュアル 3 Components of a SystemTap scriptの3.5~3.7にcの関数を組み込む方法の説明があります。

で、とりあえず作ったのがこちら。

#!/usr/bin/env stap

%{
#include <linux/sched.h>
#include <linux/thread_info.h>
%}

function show_limit:long() %{
        STAP_PRINTF("limit -> 0x%lx\n", current_thread_info()->addr_limit.seg);
        STAP_RETURN(0);
%}

probe kernel.function("_do_fork") {
        show_limit()
        exit()
}

probe end {
        printf("Done\n")
}

やってるのは_do_fork()が呼ばれたときにshow_limit()を呼んで、current_thread_info()->addr_limit.segの結果を表示させてます。表示先はsyslogではなくてターミナルです(STAP_PRINTFを使っているので)。

これを普通に実行すると怒られます。

masami@saga:~$ sudo stap mm_limit.stp
parse error: embedded code in unprivileged script; need stap -g
        saw: embedded-code at mm_limit.stp:3:1
     source:  ...
#include <linux/sched.h>
#include <linux/thread_info.h>
 ... %{

  ^

2 parse errors.
Pass 1: parse failed.  [man error::pass1]
Number of similar error messages suppressed: 1.
Rerun with -v to see them.

なので-gオプションをつけます。

masami@saga:~$ sudo stap mm_limit.stp -g
limit -> 0x7ffffffff000
Done

Webサービス開発徹底攻略 Vol.2 (WEB+DB PRESS plus)

Webサービス開発徹底攻略 Vol.2 (WEB+DB PRESS plus)

  • 作者: 鶴原翔夢,小野侑一,中村俊介,佐藤春旗,青山公士,佐々木大輔,横路隆,加来純一,山本伶,大平武志,米川健一,坂本登史文,若原祥正,和久田龍,平栗遵宜,城倉和孝,安達俊雄,Akira,川嶋賢一,安詮院康広,山口良平,尾上忠輔,大川高志,坂本寛樹,栗林健太郎,柴田博志,黒田良,常松伸哉,安宅啓,舘野祐一,WEB+DB PRESS編集部
  • 出版社/メーカー: 技術評論社
  • 発売日: 2016/02/16
  • メディア: 大型本
  • この商品を含むブログを見る