設備linux2.4內核代碼奔潰解決方案

此方法用於死機故障出現間隔很長,而且不是空指針導致的死機問題.用於查找出現問題的函數.因爲這種情況.你不可能花幾天甚至幾月時間來完成一次調試.不是簡單的靠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語言反彙編代碼的閱讀能力了....

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章