kernel or user oops資訊定位步驟
1、獲取oops資訊
根據pc列印的位址,大致可以判斷死在什麼空間:kernel、module、user,對於kernel/user為2g:2g的分布如下:使用者空間:0x0~0x7f000000, module:0x7f000000~0x800000000,kernel:0x80000000~0xffffffff。
使用者程式掛掉如果需要列印pc指標,核心需要進行相應的支援:[*] verbose user fault messages。
另外,arch/arm/kernel/traps.c中引數user_debug=31設定。
以下以使用者程式為例,掛掉後列印如下資訊。
lag:1
pid: 444, comm: hidemo
cpu: 0 tainted: p (3.0.8 #11)
pc is at 0x4bac0
lr is at 0x52478
pc : [<0004bac0>] lr : [<00052478>] psr: 28000010
sp : 4acfd370 ip : 006ba9bc fp : 4acfd3bc
r10: 00152f0c r9 : 00000000 r8 : 00188244
r7 : 00000152 r6 : 4acfdb50 r5 : 0001b018 r4 : 00000005
r3 : 00000000 r2 : 00000000 r1 : 000282b0 r0 : 00412158
flags: nzcv irqs on fiqs on mode user_32 isa arm segment user
核心的列印:
cpu: 0 tainted: g o(3.4.7_stm24_0304-4.4-b2020-h416_a9 #1)
pc is at display_init+0x10/0x51c [stvideo]
lr is at stvideo_init+0x180/0x24c [stvideo]
pc : [<7f20f374>] lr : [<7f051180>] psr: 60000013
sp : 88cd1e28 ip : 88490200 fp : 00000000
r10: 0000001c r9 : 00000024 r8 : 00000001
r7 : 88490074 r6 : 00000001 r5 : 88490000 r4 : 00000000
r3 : 00000064 r2 : 00000000 r1 : 00000020 r0 : 00000000
flags: nzcv irqs on fiqs on mode svc_32 isa arm segment user
2、反彙編
反彙編為了列印函式名等資訊,編譯新增-g ;另外,不要通過strip命令將符號表資訊去除。
反彙編可以使用另種方式:objdump和gdb的disassemble命令。對於上面使用者程式沒有列印堆疊的呼叫情況無法確定函式,則使用objdump命令:
arm-hisiv200-linux-objdump -dsl test_dump> disassamble.txt。
對於kernel一般會列印函式呼叫情況,這時使用gdb比較方便。先確定函式定義的檔案,然後找到出現問題版本的檔案.o,接著 gdb *.o,進入gdb除錯介面再輸入反彙編命令:
disassemble display_init
3、根據oops資訊分析
0004b3c8 :
4b3c8: e52db004 push ; (str fp, [sp, #-4]!)
4b3cc: e28db000 add fp,sp, #0
4b3d0: e24dd04c sub sp,sp, #76 ; 0x4c
4ba8c: ea000027 b 4bb30
4ba90: e51b3040 ldr r3,[fp, #-64] ; 0x40
4ba94: e1d330b4 ldrh r3,[r3, #4]
4ba98: e51b2030 ldr r2,[fp, #-48] ; 0x30
4ba9c: e0020293 mul r2,r3, r2
4baa0: e51b302c ldr r3, [fp, #-44] ; 0x2c
4baa4: e0823003 add r3,r2, r3
4baa8: e50b3028 str r3,[fp, #-40] ; 0x28
4baac: e51b3040 ldr r3,[fp, #-64] ; 0x40
4bab0: e593201c ldr r2,[r3, #28]
4bab4: e51b3028 ldr r3,[fp, #-40] ; 0x28
4bab8: e1a031c3 asr r3, r3, #3
4babc: e0823003 add r3,r2, r3
4bac0: e5d33000 ldrb r3, [r3]
4bac4: e54b3019 strb r3,[fp, #-25]
4bac8: e51b302c ldr r3,[fp, #-44] ; 0x2c
4bacc: e50b3020 str r3,[fp, #-32]
4bad0: e55b2019 ldrb r2,[fp, #-25]
4bad4: e51b3028 ldr r3,[fp, #-40] ; 0x28
4bad8: e1e03003 mvn r3,r3
4badc: e2033007 and r3,r3, #7
4bae0: e1a03352 asr r3,r2, r3
4bae4: e2033001 and r3,r3, #1
4bae8: e20330ff and r3,r3, #255 ; 0xff
4baec: e3530000 cmp r3,#0
4bb78: e49db004 pop ; (ldr fp, [sp], #4)
4bb7c: e12fff1e bx lr
取值pc:當前pc
解碼pc:當前pc-4
執行pc:當前pc-8
從上面紅色的部分可以看到,r3=00000000,然後再進行操作就出錯了。
根據pc
位址尋找到函式名,然後根據位址前後彙編**及
oopsr0~r7
的值,結合函式原始碼進行分析可能出錯地方。也可以使用
ida.pro.5.5dapro55
軟體進行彙編執行流程圖形化查詢出錯原因。
4、其他情況
如果堆疊資訊裡指定的pc指標在使用者態或者核心態,但是對二進位制檔案反彙編時,沒有找到對應的定製,或者pc指標位址遠大於反彙編**位址。這個時候蹦掉,很可能是臨時申請堆疊,陣列越界等情況。
更改預設定位資訊
1.這裡我測試使用 九寨溝 2.用xcode建立乙個工程fakegps 此時在外面新建立乙個 jzg.gpx 的 xml 檔案 檔案資訊如下,然後匯入工程 xml version 1.0 encoding utf 8 gpx version 1.1 creator gmaptogpx 6.4j xm...
02步獲取網頁片段資訊
from urllib.request import urlopen,request from lxml import etree 建構函式,抓取第i頁資訊 構造第i頁的 url ret request url,headers headers res urlopen ret html res.rea...
異常資訊定位具體資料行
下午在執行乙個dml操作時候,出現單行返回多行的異常資訊,但不能知道具體是那列資料的問題,因為dml語句本身比較複雜,就想通過迴圈的方式找出異常資料行。只想到了一種游標的方法來定位,應該還有更好的方法。declare cursor c cur is select from emp1 order by...