link もっと前
   2008年 7月 24日 -
      2008年 7月 24日  
link もっと後

link 未来から過去へ表示(*)
link 過去から未来へ表示

日々

link permalink

ptrace のサンプルプログラム

まぶち氏から ptrace のサンプルない?って言われたので strace を紹介しました。strace は ptrace の難しいところをどうしているのか見るには良いですが、初めて ptrace を使う人が見るもんじゃない気がします。

入門に使えると信じて、簡単なサンプルを作ってみたので公開。Linux 専用です。link ソースコードはこちらからどうぞ。
(2008年 7月 25日追記)需要はなさそうなものの、一応ライセンスを明確にしました。修正 BSD ライセンスです。

うまくいけばトレース対象のシステムコール名がずらっと表示されるはずです。以下に私の環境での実行結果を示します。

簡易 ptrace プログラムのコンパイル、実行結果
$ gcc -Wall 20080724_ptrace_simple.c

$ ls -l
合計 28
-rw-r--r-- 1 katsuhiro katsuhiro  8679 2008-07-24 02:12 20080724_ptrace_simple.c
-rwxr-xr-x 1 katsuhiro katsuhiro 13367 2008-07-24 02:28 a.out

$ ./a.out ls -la
 1115: child started
 1115: sys out( 11): execve
 1115: sys  in(122): uname
 1115: sys out(122): uname
 1115: sys  in( 45): brk
 1115: sys out( 45): brk
 1115: sys  in( 33): access
 1115: sys out( 33): access
(略)
 1115: sys  in(  4): write
-rwxr-xr-x 1 katsuhiro katsuhiro 13367 2008-07-24 02:28 a.out
 1115: sys out(  4): write
 1115: sys  in(  6): close
 1115: sys out(  6): close
 1115: sys  in( 91): munmap
 1115: sys out( 91): munmap
 1115: sys  in(252): exit_group
 1115: exited, st:0

動作は Debian GNU/Linux 4.0(etch) で確認しました。さほど変なことはやっていないはずなので、最近の Linux ディストリビューションなら問題ないと思います。たぶん…。

簡単な説明

仕組みとしては fork した後に親プロセスは監視役、子プロセスは監視対象、で役割分担します。

親プロセスの仕事は wait -> ptrace(PTRACE_SYSCALL, ...) を繰り返すことです。子プロセスに何か変化があると wait から戻ってくるので、その都度何が起きたか調べます。イベントには色々ありますが、サンプルで見ている種類をざくっと紹介します。

  • 子プロセスの終了 -> 監視を止めます。このとき終了ステータスが取得できます。
  • シグナルで kill された -> 監視を止めます。このときどのシグナルで kill されたか取得できます。
  • シグナルを受け取った -> ptrace を使ってシグナルを子プロセスに渡します。

子プロセスにシグナルを渡さないと、子プロセスがシグナルを認識できません。逆に言うと監視役の親プロセスのさじ加減次第では、子プロセスに飛んで来たシグナルを消すこともできてしまいます。ただし SIGKILL と SIGSTOP は消せません。

受け取ったシグナルが SIGTRAP だったら、システムコールの入口/出口で止まったことを表しますので、システムコール番号の解析をします。

子の仕事は ptrace(PTRACE_TRACEME, ...) を実行して「監視される準備」を整えるだけです。その後は余計なことをせずに監視対象にしたいプログラムを exec してください。

[編集者: すずき]
[更新: 2008年 7月 25日 21:39]
link 編集する

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
   2008年 7月 24日 -
      2008年 7月 24日  
link もっと後

管理用メニュー

link 記事を新規作成

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDF ファイル RSS 1.0
QR コード QR コード

最終更新: 11/14 02:08

カレンダー

<2008>
<<<07>>>
--12345
6789101112
13141516171819
20212223242526
2728293031--

最近のコメント 5件

  • link 18年10月12日
    すずき 「なるほど!\n京急、京成はヤバそうですね...」
    (更新:10/15 23:02)
  • link 18年10月12日
    ちかふみ 「閉会式直後の出国ラッシュ対策のためだそう...」
    (更新:10/15 20:43)
  • link 18年10月12日
    すずき 「あー、なるほど!閉会式の次にくっつけたん...」
    (更新:10/14 15:44)
  • link 18年10月12日
    hdk 「2020年の東京オリンピックが8月9日ま...」
    (更新:10/14 10:45)
  • link 18年09月07日
    すずき 「ありがとう!\nこちらこそ、楽しみにして...」
    (更新:09/11 19:30)

最近の記事 3件

link もっとみる
  • link 18年11月13日
    すずき 「[お気に入りのマンガ] Kindle Fire HD は大量の本を...」
    (更新:11/14 02:08)
  • link 18年11月10日
    すずき 「[ROCK64 の I2S が動かない] 先日(2018年 7月 ...」
    (更新:11/14 01:53)
  • link 18年11月11日
    すずき 「[linux-next で動かない ROCK64 の I2S] 昨...」
    (更新:11/14 01:52)

こんてんつ

open/close wiki
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報