2016-11-29 22 views
0
Pid: 16251, comm: bash Not tainted 2.6.32.59 #78 

Call Trace: 

[<ffffffff81367a50>] ? do_page_fault+0x1b6/0x394 

[<ffffffff8136583f>] ? page_fault+0x1f/0x30 

[<ffffffff812160c5>] ? sysrq_handle_crash+0xd/0x16 

[<ffffffff812164be>] ? __handle_sysrq+0xaf/0x14a 

[<ffffffff8121659e>] ? write_sysrq_trigger+0x45/0x4c 

[<ffffffff81216559>] ? write_sysrq_trigger+0x0/0x4c 

[<ffffffff81116468>] ? proc_reg_write+0x85/0xa6 

[<ffffffff810d54cc>] ? vfs_write+0xa8/0x14c 

[<ffffffff810d566e>] ? sys_write+0x48/0x9e 

[<ffffffff8102d025>] ? sysenter_dispatch+0x7/0x2b 

BUG: unable to handle kernel NULL pointer dereference at (null) 

IP: [<ffffffff812160c5>] sysrq_handle_crash+0xd/0x16 

PGD 26ad8f067 PUD 1e2aa6067 PMD 0 

Oops: 0002 [#1] SMP 

linuxのどのコンポーネントがこれらの情報をコンソールに記録しますか?Linuxカーネルがクラッシュしたときカーネルスタックとコールトレースがコンソールにどのように記録されたか?

+0

[のprintk](https://git.kernel.org/cgit/linux/kernel/git/stable/linuxだろう-stable.git/tree/kernel/printk?id = refs/tags/v4.8.11)。 –

+0

@sudheer panic()も参照:http://lxr.free-electrons.com/source/kernel/panic.c?v=3.11#L30 –

+0

panic()とdump_stack()の両方の関数... call printk )。 – sudheer

答えて

0

これらのログはカーネルのパニック機能で表示されます。

Linuxカーネルパニックは、悪いドライバ、過度のメモリやソフトウェアのバグなど、迅速かつ簡単に回復できないときに呼び出されます。

パニックが呼び出されたときに、vsnprintfやdump_stackなどのAPIを使用して、コンソールで問題の理由を示す有用な情報を表示します。KDUMP機能を有効にすると、ロードクラッシュカーネルを起動することもできますときカーネルクラッシュ必要な情報を収集するために助けるために、この機能では、いくつかのカスタムアクション:

linux/kernel/panic.c 

/** 
*  panic - halt the system 
*  @fmt: The text string to print 
* 
*  Display a message, then perform cleanups. 
* 
*  This function never returns. 
*/ 
NORET_TYPE void panic(const char * fmt, ...) 
{ 
.... 
    bust_spinlocks(1); 
    va_start(args, fmt); 
    vsnprintf(buf, sizeof(buf), fmt, args); 
    va_end(args); 
.... 
#ifdef CONFIG_DEBUG_BUGVERBOSE 
    dump_stack(); 
#endif 
    .... 

    /* 
    * If we have crashed and we have a crash kernel loaded let it handle 
    * everything else. 
    * Do we want to call this before we try to display a message? 
    */ 
    crash_kexec(NULL); 

    kmsg_dump(KMSG_DUMP_PANIC); 


    kcore_logon(1); 
    printk(KERN_EMERG "Kernel panic - not syncing: %s\n",buf); 
.... 
+0

panic()とdump_stack()の両方がprintk()を呼び出します。しかし、printkはコンソール上で出力を生成しますか?私は思う..それはo/pをカーネルリングバッファに送る。どのようにこれらのメッセージがコンソールに来ているのですか? – sudheer

関連する問題