核心中列印調用棧
do_page_fault
info [ft2CPU 0 Unable to handle kernel paging request at virtual address 00000000, epc == 801bcf00, ra == 801c0210
Oops[#1]:
CPU: 0 PID: 14190 Comm: date Not tainted 3.10.27+ #71
task: 8fd70600 ti: 88e9a000 task.ti: 88e9a000
$ 0 : 00000000 1000d000 8fee1eb8 8f5d9eb8
$ 4 : 00000000 80578b44 fffffffc 8fee1eb9
$ 8 : 00003bc4 e340f3f2 2d04acbd 562b5c3d
$12 : 00000000 00000000 00000000 00000000
$16 : 8ff05eb8 80578b44 00000002 80523478
$20 : 805b0000 80578b38 8ff05eb8 00000001
$24 : 00000000 77635ea4
$28 : 88e9a000 88e9bb78 8052471c 801c0210
Hi : 00000000
Lo : 000006cc
epc : 801bcf00 0x801bcf00
Not tainted
ra : 801c0210 0x801c0210
Status: 1000d000
Cause : 0000400c
BadVA : 00000000
PrId : 0000dc02
Process date (pid: 14190, threadinfo=88e9a000, task=8fd70600, tls=7796b460)
Stack : 8fd93040 00000000 00000006 805799a8 80578b38 8ff05eb8 00000002 80040478
80578b30 80578b30 3b9aca00 80523478 80578b30 80578b30 3b9aca00 80040fbc
805e0000 8004f91c 805ac528 00000000 00000000 00000000 a9d4a3c2 0e961d43
562b9802 1045a0af 8fd70600 00000000 00000000 00000000 00000000 88e677f8
805b0000 80524708 8052471c 8002b3c4 8fd70600 00000000 00000000 00000000
...
Call Trace:[<80040478>] 0x80040478
[<80040fbc>] 0x80040fbc
[<8004f91c>] 0x8004f91c
[<805b0000>] 0x805b0000
[<8002b3c4>] 0x8002b3c4
[<8002b40c>] 0x8002b40c
[<800548c4>] 0x800548c4
[<80054934>] 0x80054934
[<80059368>] 0x80059368
[<80016400>] 0x80016400
[<80010ab8>] 0x80010ab8
[<80059aa4>] 0x80059aa4
[<801f9f40>] 0x801f9f40
[<8005cc84>] 0x8005cc84
[<801c3284>] 0x801c3284
[<80059368>] 0x80059368
[<80013968>] 0x80013968
[<80012860>] 0x80012860
[<8007c774>] 0x8007c774
[<80018e98>] 0x80018e98
[<801c3260>] 0x801c3260
[<8007c938>] 0x8007c938
[<801bd644>] 0x801bd644
[<800180e8>] 0x800180e8
[<80081674>] 0x80081674
[<801bd784>] 0x801bd784
[<801c3284>] 0x801c3284
[<8007498c>] 0x8007498c
[<8007fb5c>] 0x8007fb5c
[<80012864>] 0x80012864
Code: 34470001 ac440004 ac620008 <ac870000> 8c480000 01063824 ac680000 10e00008 ac430000
_test_uart:226]: uart test!
inf---[ end trace 21a2434fd3af4cbd ]---
o [ft2_test_uart:236]: uart testKernel panic - not syncing: Fatal exception in interrupt
ok!
核心在發生crash的時候會列印上面這段資訊,對應到核心中的代碼的流程是:
do_page_fault
__do_page_fault arch/rlx/mm/fault.c
die
show_register arch/rlx/kernel/traps.c
__show_regs
show_stacktrace -> show_backtrace
show_code
if (in_interrupt())
panic("Fatal exception in interrupt");
dump_stack
dump_stack用于核心調試,列印核心堆棧段資訊,需要在核心中配置DEBUG_KERNEL,可以在自己寫的driver中加上這句話來檢視函數調用流程。
注意在使用dump_stack要加上這兩個頭檔案:
#include <linux/kprobes.h>
#include <asm/traps.h>
BUG()\WARN()
使用者空間中列印調用棧
__builtin_frame_address(int level)
backtrace()和backtrace_symbols()
參考文章
- dump_stack的簡單使用
- Linux Call Trace原理分析