pstackもどき for T-Kernel

[ 日本語 | English ]

概要

実行中のタスクのスタックトレースを表示するプログラムです。

動作環境
T-Kernel/x86 (他環境への移植は、関数を一個(pstk_backtrace)実装すればよい)
ライセンス
libelfのライセンスは、オリジナルのものがGNU LGPLなのでそれに従ってください。
それ以外の二つ(pstkdrv, pstack)については、MIT Licenseとします。
ダウンロード

コンパイル方法

pstkdrv, pstack, libelf はそれぞれドライバ、プロセス、ライブラリなので、それぞれ driver/, bappl/, lib/ 内で展開・コンパイルしてください。

なお、pstack は libelf のライブラリ・ヘッダファイルに依存するので、あらかじめ libelf/pcat 内で make && make install しておく必要があります。

使い方

  1. あらかじめ、% lodspg pstkdrv しておきます。
  2. 対象のプログラムに対するマップファイル(*.map)、またはstripされていない実行ファイル(*.out)が手に入る場合は、あらかじめ実行環境に転送しておきます。
  3. % ref tsk 等を実行して、対象のタスクIDを入手します。
  4. 以下のいずれかの方法で、pstack を実行します (対象のtid = 123の場合):
  5. 表示される情報を適当に読みます
    例:
    [/SYS]% pstack 47:/SYS/USR/webkit.out
    *** TID = 47:
    EIP = 8000c51e : _end+2116597870
      <-- 80015544 : _end+2116634772
      <-- 80060038 : _end+2116940680
      <-- 800134ca : _end+2116626458
      <-- 8001555d : _end+2116634797
      <-- 0000003b : _usemt_+58
      <-- c062b418 : _end+3196757864
      <-- c061d884 : _end+3196701652
      <-- c061f3e2 : _end+3196708658
      <-- c060c2e6 : _end+3196630582
      <-- 800134ca : _end+2116626458
      <-- 8001555d : _end+2116634797
      <-- 00979073 : b_cact_par+11
      <-- 0010709a : TShellWebKitPanel::onWorkAreaMouseDown()+122
      <-- 004ca049 : TShellWindow::onMouseDown()+129
      <-- 004c952a : TShellApp::dispatch()+142
      <-- 004c9781 : TShellApp::cycle()+49
      <-- 001036d7 : TShellWebKitApp::cycle()+15
      <-- 004c979e : TShellApp::run()+18
      <-- 0010346f : MAIN_sub(message*)+91
      <-- 0010352f : MAIN+27
      <-- 001002ad : _C_startup+105

そのほか、libpstk.c, pstack.h, (demangle.cc) あたりを、自作アプリケーションに組み込んで、任意の場所から print_stacktrace(...); してもそれなりに便利かと思います。(ただし、シンボルの解決が不要ならば tm_command("btr"); のほうがお手軽です。)

注意

既知の問題点として、カーネルモードでのバックトレースの値は信頼できないという問題が分かっています。たとえば、上の例だと 0x0006003b というアドレスは明らかに間違っています。

したがって、基本的には、(1)プロセスに属する(固有空間で動く)タスクのみを対象にする、(2)システムコール発行後のスタックトレースについては信用しない、という方針で使えば大丈夫かと思います。(上の例だと、b_cact_par以下の部分は大丈夫です。)

問題点の原因について

前述の問題点について、問題の原因について簡単にまとめます。なにかよい解決方法があればご教示いただければ大変嬉しいです。

更新履歴


[ 戻る ]

Yashiro Takeshi <yashiromann@gmail.com>
Last modified: Sat Oct 1 13:34:59 2011
Valid XHTML 1.0!