此方法用於死機故障出現間隔很長,而且不是空指針導致的死機問題.用於查找出現問題的函數.因爲這種情況.你不可能花幾天甚至幾月時間來完成一次調試.不是簡單的靠printk函數輸出就能解決的了的.
內核死機前的有用的信息主要有下面下個:
CallTrace:
[<f89ef137>]
[<f89eed7e>]
[<c0235ed0>]
[<c01f314a>]
[<c0204460>]
[<c0207337>]
[<c0236e64>]
[<c0227894>]
[<f89ee370>]
[<c0239180>]
[<c01f2d97>]
[<c0239180>]
[<c0239180>]
[<c01f3113>]
[<c0239180>]
這是內核函數的調用棧.最上面的是最後調用的.這個地址爲:函數A調用函數B,函數B的下一行語句的地址.有助於定位出問題的函數.
函數B就是出問題的函數.如果地址開頭是f8還好問題不是很大這個函數一般來說是你自己寫的.如果是C0恭喜你是個內核函數....
Code:8b02833811757b83ec0883c004506a11e8688800
這是出問題的代碼的十六進制表示.
接下來你要做的就是定位具體是哪個函數出的問題.如果是函數調用棧的最近地址是f8開頭你就把你的內核模塊**.o反彙編.如果是c0開頭的.你把你設備跑的內核代碼編譯一次會產生一個vmlinux鏡像把它反彙編.
命令:
objdump-Dvmlinux>k.dmp
objdump-Dfw.o>k.dmp.
#vik.dmp
2143:8b02mov(%edx),%eax
2145:833811cmpl$0x11,(%eax)
2148:757bjne21c5<user_ac_policy+0x141>
214a:83ec08sub$0x8,%esp
214d:83c004add$0x4,%eax
2150:50push%eax
2151:6a11push$0x11
2153:e8fcffffffcall2154<user_ac_policy+0xd0>
2158:83c410add$0x10,%esp
215b:85c0test%eax,%eax
215d:7466je21c5<user_ac_policy+0x141>
215f:8b4058mov0x58(%eax),%eax
2162:8945e8mov%eax,0xffffffe8(%ebp)
8b02833811757b83ec0883c004506a11e8688800
錯誤代碼位置定位成功.然後在查找這部分代碼在哪個函數裏面.
00002084<user_ac_policy>:
2084:55push%ebp
2085:89e5mov%esp,%ebp
2087:57push%edi
2088:56push%esi
2089:53push%ebx
208a:83ec28sub$0x28,%esp
208d:8b550cmov0xc(%ebp),%edx
2090:8b5d08mov0x8(%ebp),%ebx
2093:52push%edx
2094:c745f000000000movl$0x0,0xfffffff0(%ebp)
209b:e8fcffffffcall209c<user_ac_policy+0x18>
20a0:5apop%edx
20a1:59pop%ecx
20a2:50push%eax
20a3:53push%ebx
確定了是user_ac_policy函數的問題具體能確定那一句..就看各位的C語言反彙編代碼的閱讀能力了....