kernel or user oops資訊定位步驟

2021-08-04 05:43:35 字數 3940 閱讀 1073

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...