LoginSignup
0
2

More than 1 year has passed since last update.

vmcore を読んでみる(3)

Last updated at Posted at 2019-10-05

前回のつづきです。
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

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2