実行中のタスクのスタックトレースを表示するプログラムです。
pstkdrv, pstack, libelf はそれぞれドライバ、プロセス、ライブラリなので、それぞれ driver/, bappl/, lib/ 内で展開・コンパイルしてください。
なお、pstack は libelf のライブラリ・ヘッダファイルに依存するので、あらかじめ libelf/pcat 内で make && make install しておく必要があります。
% lodspg pstkdrv
しておきます。% ref tsk
等を実行して、対象のタスクIDを入手します。% pstack 123
% pstack 123:/path/to/mapfile.map
% pstack 123:/path/to/exefile.out
[/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>