前回のつづきです。
https://qiita.com/intrajp/items/d31b4a86b50fd65f0995
手っ取り早く、カーネルのどこで引っかっかっているかを検出します。
set は、crash した時に実行していたプロセスそのものを表示します。
実行してみます。
crash> set
PID: <数値>
COMMAND: "<実行していたコマンドが表示される>"
TASK: <アドレスが表示される> [THREAD_INFO: <アドレスが表示される>]
CPU: 1
STATE: TASK_RUNNING (PANIC)
ここまでで、以下がわかりました。
実行していたコマンドとそのプロセスおよびCPU
では、このプロセス確認します。
crash>ps
パニック時には、CPU0 と CPU1 にて xxxxxxxx コマンドが実行されていました。
理由:アクティブなタスクが行頭の > となるため。
PID PPID CPU TASK ST %MEM VSZ RSS COMM
> <数値> 1 0 <アドレスが表示される> RU <数値> <数値> <数値> <コマンドが表示される>
<数値> 1 0 <アドレスが表示される> RU <数値> <数値> <数値> <コマンドが表示される>
<数値> 1 0 <アドレスが表示される> IN <数値> <数値> <数値> <コマンドが表示される>
> <数値> 1 1 <アドレスが表示される> RU <数値> <数値> <数値> <コマンドが表示される>
ページを繰っていきます
crash>log
G を押下して、最終行に飛びます。
あるいは、set scroll off とすると、最終行まで一気に表示します。
...(snip)...
[経過時間] Call Trace:
[経過時間] [<アドレスが表示される>] xxxx+0x../0x..
[経過時間] [<アドレスが表示される>] xxx+0x.../0x...
[経過時間] [<アドレスが表示される>] xxx+0x../0x..
[経過時間] [<アドレスが表示される>] xxx+0x../0x...
[経過時間] [<アドレスが表示される>] xxx+0x../0x..
[経過時間] [<アドレスが表示される>] xxx+0x../0x..
[経過時間] Code: xxxxxxxx
[経過時間] RIP [<アドレスが表示される>] <コマンド>+16進数
[経過時間] RSP <アドレスが表示される>
ここで確認できたメモリアドレスを、メモリマップで確認すると、どのコードの何行目かがわかります。
crash> kmem <メモリアドレス>
<メモリアドレス> (t) <関数名>+<数値> /usr/src/debug/<カーネルバージョン>/linux-xxx/xxx/xxx/xxx.c: 行数
PAGE PHYSICAL MAPPING INDEX CNT FLAGS
<仮想アドレス> <物理青レス> 0 0 1 xxxx reserved