前回のつづきです。
https://qiita.com/intrajp/items/a66c7b142441fc19054d
runq コマンドを実行することで、プロセススケジューラのランキューに接続している
実行中のプロセスが表示できます。
今回は、CPU <数値> なので、そこを見ます。
crash> runq
(略)
先程実施した、ps コマンドに、引数 -a node_exporter を与えて、そのプロセスに与えられ
たコマンドライン引数と環境引数を表示させてみます。
crash> ps -a <実行していたコマンド>
PID: <数値> TASK: <アドレス> CPU: <数値> COMMAND: "<コマンド名>"
ps: cannot access user stack address: <アドレス>
ユーザーのアドレスはアクセスできないことがあります。
-t オプションを与えて、プロセスの動作時間、開始時刻、ユーザ空間および
カーネル空間での実行時間を表示させます。
crash> ps -t <実行していたコマンド>
task コマンドで、task_struct 構造体(プロセス管理用データ構造)を表示
させてみます。
crash> task
(略)
task -x も実行してみます。
crash> task -x
(略)
以下に注目します。
sp0 = <アドレス値>,
sp = <アドレス値>,
stack ポインタが分かったので、rd -s でスタック領域を参照してみます。
rd コマンドは、メモリの内容を読むコマンドです。
これは、bt -t に近い情報となります。
16進数にしなければいけないと思います。もう16進数ですが、そうでない場合は、
以下のコマンドで可能です。
crash> eval <数値>
やってみます。
crash> set scroll off
crash> rd <spの値> -e <sp0の値> -s
(略)
bt -t もやってみます。
crash> bt -t <実行していたPID>
(略)
もう一度、ps を確認します。
crash> ps <PID>
PID PPID CPU TASK ST %MEM VSZ RSS COMM
> <数値> 1 1 <アドレス値> RU 0.x xxxx xxxx <コマンド>
ST が、RU であることから、<コマンド> が実行中であったことを示しています。
次に、メモリの状況を確認します。
kmem -i とすると、メモリ全体の利用状況が表示できます。
crash> kmem -i
(略)
kmem は、カーネルのメモリ使用状況を表示できます。
-s オプションは、スラブキャッシュの情報を表示します。
/proc/slabinfo の情報と同等です。
crash> kmem -s
(略)
-p オプションで、メモリマップを表示できます。
crash> set scroll on
crash> kmem -p
大変な行数となります。
メモリを直接指定もできます。
メモリアドレスが分かっているので、直接指定して、このメモリが
利用されていたか、既に解放されていたかを確認します。
kecrash> kmem <アドレス値>
CACHE OBJSIZE ALLOCATED TOTAL SLABS SSIZE NAME
xxxxxxxxxx...
SLAB MEMORY NODE TOTAL ALLOCATED FREE
xxxxxx.....
FREE / [ALLOCATED]
[<アドレス値>]
PID: <数値>
COMMAND: "<コマンド名>"
TASK: <アドレス値> [THREAD_INFO: <アドレス値>]
CPU: 1
STATE: TASK_RUNNING (PANIC)
PAGE PHYSICAL MAPPING INDEX CNT FLAGS
xxxxxxxx....
[] で囲まれているページは、まだ解放されていないことを示します。
以下の行に注目します。
TASK: <アドレス値> [THREAD_INFO: <アドレス値>]
メモリマップで確認します。
crash> kmem <アドレス値>
(略)
まだ確認したい項目があります。
PID が開いていたファイルを確認します。
files で確認できます。
crash> files <PID>
PID: <PID> TASK: <アドレス値> CPU: 1 COMMAND: "<コマンド>"
ROOT: / CWD: /
FD FILE DENTRY INODE TYPE PATH
(略)
開いているファイルがわかりました。
つづきです。
https://qiita.com/intrajp/items/cf7482f2a084f47c303f