trace

# mcrash

## trace

### 書式

usage: `trace` address

### 説明

カーネル内の関数バックトレースを表示します。 引数にはtask_structのアドレスを指定します (`task_struct`コマンドで取得できます)。

`trace`コマンドは カーネルスタックとカーネル内の関数オブジェクトを解析して関数トレースを得ます。 プロセスごとの関数の呼び出しシーケンスと、それぞれの関数の引数を表示します。 多くの場合正しくトレースを取ることができますが、まれに失敗します。

- 動作中(running状態)のプロセスは正しくとることができません。
- カーネルのコンパイラにもよります。 gcc3 でコンパイルしたカーネルは (コンパイラが賢すぎて、またはmcrashがおバカで) 正しくトレースを取れないことが稀にあります。 それに対し、gcc-2.91.66 でコンパイルしたカーネルなら 正しくトレースがとれる可能性が高いです。
- mcrash起動後にモジュールの組み込みをした場合。 関数のネームリストの対応が取れないためトレースに失敗します。

traceとdisに関しては、 現状ではx86用のコーディングしかしていません。

### 関数

すべてのプロセスのトレースをとる関数 `traceall` を定義しています。 (これはとても便利!)

### 実行例

    > trace c3b76000
    PID = 1139
     c3b77df8  c0114dca  schedule+21a ()
    [c3b77e20] c011f3d4  schedule_timeout+14 ()
    [c3b77e4c] c02071ac  unix_stream_data_wait+ac (c3dc7a80,7fffffff)
    [c3b77e84] c020738d  unix_stream_recvmsg+19d (c3fd6f04,c3b77f54,4,0,c3b77f08)
    [c3b77ed0] c01c2321  sock_recvmsg+31 (c3fd6f04,c3b77f54,4,0)
    [c3b77f38] c01c2428  sock_read+88 (c3d824e0,bffffbd0,4,c3d82500)
    [c3b77f7c] c01388d6  sys_read+96 (0,bffffbd0,4,bffffbd0)
    [c3b77fc0] c0108913  system_call+33 ()

    > traceall
        ADDR S   PID   SID   UID  EUID       MM NAME             FLAGS
    c02de000 R     0     0     0     0        0 swapper
    PID = 0
     c02dffc0  c0114dca  schedule+21a ()
    [c02dffe8] c0106e59  cpu_idle+29 ()
    [c02dfff4] c02e0717  start_kernel+157 ()

        ADDR S   PID   SID   UID  EUID       MM NAME             FLAGS
    c12bc000 I     1     0     0     0 cbecc080 init             priv
    PID = 1
     c12bdedc  c0114dca  schedule+21a ()
    [c12bdf04] c011f43c  schedule_timeout+7c (?)
    [c12bdf34] c0146686  do_select+206 (b,c12bdf90,c12bdf8c)
    [c12bdf6c] c0146a29  sys_select+339 (b,bffffb60,0,0)
    [c12bdfc0] c0108913  system_call+33 ()
        (略)

mcrash, Copyright (C) 2002,2003 ASANO Masahiro