Oops信息及?;厮輄第1頁(yè)
Oops信息及棧回溯_第2頁(yè)
Oops信息及?;厮輄第3頁(yè)
Oops信息及?;厮輄第4頁(yè)
Oops信息及?;厮輄第5頁(yè)
已閱讀5頁(yè),還剩2頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、Oops信息及棧回溯(2011-10-2510:16)標(biāo)簽:信息分類:linuxOops信息來(lái)源及格式Oops這個(gè)單詞含義為“驚訝”,當(dāng)內(nèi)核出錯(cuò)時(shí)(比如訪問(wèn)非法地址)打印出來(lái)的信息被稱為Oops信息。Oops信息包含以下幾部分內(nèi)容:一段文本描述信息。比如類似“UnabletohandlekernelNULLpointerdereferenceatvirtualaddress00000000的信息,他說(shuō)明了發(fā)生的是哪類錯(cuò)誤。Oops信息的序號(hào)。比如是第幾次等。這些信息與下面類似,括號(hào)內(nèi)的數(shù)據(jù)表示序號(hào)。Internalerror:Oops:806#1內(nèi)核中加載的模塊名稱,也可能沒(méi)有,以下面字樣開(kāi)頭

2、。Moduleslinkedin:發(fā)生錯(cuò)誤的CPU的序號(hào),對(duì)于單處理器系統(tǒng),序號(hào)為0,如:CPU:0Nottainted(#36)發(fā)生錯(cuò)誤時(shí)CPU的各個(gè)寄存器值。當(dāng)前進(jìn)程的名字及進(jìn)程ID,比如:Processswapper(pid:1,stacklimit=0 xc0480258)這并不是說(shuō)發(fā)生錯(cuò)誤的是這個(gè)進(jìn)程,而是表示發(fā)生錯(cuò)誤時(shí),當(dāng)前進(jìn)程是它。錯(cuò)誤可能發(fā)生在內(nèi)核代碼、驅(qū)動(dòng)程序,也可能就是這個(gè)進(jìn)程的錯(cuò)誤。棧信息。?;厮菪畔ⅲ梢詮闹锌闯龊瘮?shù)調(diào)用關(guān)系,形式如下:Backtrace:(s3c2410fb_probe+0 x0/0 x560)from(platform_drv_pro

3、be+0 x20/0 x24)出錯(cuò)指令附近的指令機(jī)器碼,比如(出錯(cuò)指令在小括號(hào)內(nèi)):Code:e24cb004e24dd010e59f34e0e3a07000(e5873000)2.配置內(nèi)核使Oops信息的?;厮菪畔⒏庇^Linux2.26.32自身具備的調(diào)試功能,可以使打印出的Oops信息更直觀。通過(guò)Oops信息中PC寄存器的值可以知道出錯(cuò)指令的地址,通過(guò)?;厮菪畔⒖梢灾莱鲥e(cuò)時(shí)的函數(shù)調(diào)用關(guān)系,根據(jù)這兩點(diǎn)可以很快定位錯(cuò)誤。要讓內(nèi)核出錯(cuò)時(shí)能夠打印?;厮菪畔?,編譯內(nèi)核時(shí)要增力口“-fno-omit-frame-pointer選項(xiàng),這可以通過(guò)配置CONFIG_FRAME_POINTER來(lái)實(shí)現(xiàn)。查看

4、內(nèi)核目錄下的配置文件.config,確保CONFIG_FRAME_POINTER已經(jīng)被定義,如果沒(méi)有,執(zhí)行“makemenuconfig”命令重新配置內(nèi)核。CONFIG_FRAME_POINTER有可能被其他配置項(xiàng)目自動(dòng)選上。3使用Oops信息調(diào)試內(nèi)核的實(shí)例(1)獲得Oops信息本小節(jié)故意修改LCD驅(qū)動(dòng)程序drivers/video/s3c2410fb.c,加入錯(cuò)誤代碼:在be函數(shù)的開(kāi)頭增加下面兩條代碼:int*ptest=NULL;*ptest=0 x1234;重新編譯內(nèi)核,啟動(dòng)后會(huì)出錯(cuò)并打印出如下Oops信息:UnabletohandlekernelNULLpoi

5、nterdereferenceatvirtualaddress00000000pgd=c000400000000000*pgd=00000000Internalerror:Oops:805#1lastsysfsfile:Moduleslinkedin:CPU:0Nottainted(2.6.32#24)PCisats3c2410fb_probe+0 xc/0 x18LRisatplatform_drv_probe+0 x18/0 x1cpc:lr:psr:a0000013sp:c3823f30ip:c3842e7cfp:00000000r10:00000000r9:00000000r8:c04

6、45008r7:c38a0840r6:c0440d18r5:c042d178r4:00000000r3:00001234r2:00000000r1:00000000r0:c042d170Flags:NzCvIRQsonFIQsonModeSVC_32ISAARMSegmentkernelControl:c000717fTable:30004000DAC:00000017Processswapper(pid:1,stacklimit=0 xc3822270)Stack:(0 xc3823f30to0 xc3824000)3f20:00000000c01d2e7cc0440d18c042d1783

7、f40:0000000cc042d178c042d1acc0440d18c38a0840c01d306800000000c01d300c3f60:c0440d18c01d24e8c3804938c38473300000000000000000c0440d18c01d1d483f80:c03a1506c03a150600000001c0022dd400000000c0440d18c0018f84000000003fa0:00000000c01d3334c0022dd40000000000000000c0018f8400000000c0018f903fc0:c0022dd4c002e37cc001

8、8f84c03c5ab3c0457880c0022fc8c0022dd4000000003fe0:000000000000000000000000c00083f800000000c002fe540000000000000000(s3c2410fb_probe+0 xc/0 x18)from(platform_drv_probe+0 x18/0 x1c)(platform_drv_probe+0 x18/0 x1c)from(driver_probe_device+0 x148/0 x2d8)(driver_probe_device+0 x148/0 x2d8)from(_driver_atta

9、ch+0 x5c/0 x7c)(_driver_attach+0 x5c/0 x7c)from(bus_for_each_dev+0 x48/0 x78)(bus_for_each_dev+0 x48/0 x78)from(bus_add_driver+0 xe0/0 x288)(bus_add_driver+0 xe0/0 x288)from(driver_register+0 xa4/0 x130)(driver_register+0 xa4/0 x130)from(s3c2410fb_init+0 xc/0 x28)(s3c2410fb_init+0 xc/0 x28)from(do_o

10、ne_initcall+0 x5c/0 x1b4)(do_one_initcall+0 x5c/0 x1b4)from(kernel_init+0 x94/0 x10c)(kernel_init+0 x94/0 x10c)from(kernel_thread_exit+0 x0/0 x8)Code:eafffe97e3a02000e59f3008e1a01002(e5823000)endtraceda227214a82491b7swapperusedgreateststackdepth:5792bytesleftKernelpanic-notsyncing:Attemptedtokill(un

11、wind_backtrace+0 x0/0 x150)from(panic+0 x40/0 x120).1.2.3.(panic+0 x40/0 x120)from(do_exit+0 x64/0 x5f4)(do_exit+0 x64/0 x5f4)from(die+0 x15c/0 x180)(die+0 x15c/0 x180)from(_do_kernel_fault+0 x64/0 x74)(_do_kernel_fault+0 x64/0 x74)from

12、(do_page_fault+0 x1b8/0 x1cc)(do_page_fault+0 x1b8/0 x1cc)from(do_DataAbort+0 x34/0 x94)(do_DataAbort+0 x34/0 x94)from(_dabt_svc+0 x40/0 x60)Exceptionstack(0 xc3823ee8to0 xc3823f30)3ee0:c042d17000000000000000000000123400000000c042d1783f00:c0440d18c38a0840c0445008000000000000000000000000c3842e7cc3823

13、f303f20:c01d3f88c0018f78a0000013ffffffff(_dabt_svc+0 x40/0 x60)from(s3c2410fb_probe+0 xc/0 x18)(s3c2410fb_probe+0 xc/0 x18)from(platform_drv_probe+0 x18/0 x1c)(platform_drv_probe+0 x18/0 x1c)from(driver_probe_device+0 x148/0 x2d8)(driver_probe_device+0 x148/0 x2d8)from(_driver_attach+0 x5c/0 x7c)(_d

14、river_attach+0 x5c/0 x7c)from(bus_for_each_dev+0 x48/0 x78)(bus_for_each_dev+0 x48/0 x78)from(bus_add_driver+0 xe0/0 x288)(bus_add_driver+0 xe0/0 x288)from(driver_register+0 xa4/0 x130)(driver_register+0 xa4/0 x130)from(s3c2410fb_init+0 xc/0 x28)(s3c2410fb_init+0 xc/0 x28)from(do_one_initcall+0 x5c/

15、0 x1b4)(do_one_initcall+0 x5c/0 x1b4)from(kernel_init+0 x94/0 x10c)(kernel_init+0 x94/0 x10c)from(kernel_thread_exit+0 x0/0 x8)(2)分析Oops信息確出錯(cuò)原因。由出錯(cuò)信息“UnabletohandlekernelNULLpointerdereferenceatvirtualaddress00000000”可知內(nèi)核是因?yàn)榉欠ǖ刂吩L問(wèn)出錯(cuò),使用了空指針。根據(jù)?;厮菪畔⒄页龊瘮?shù)調(diào)用關(guān)系。內(nèi)核崩潰時(shí),可以從pc寄存器得知崩潰發(fā)生時(shí)的函數(shù)、出錯(cuò)指令。但是很多情況下,錯(cuò)誤有可能是

16、它的調(diào)用者引入的,所以找出函數(shù)的調(diào)用關(guān)系也很重要。部分?;厮菪畔⑷缦?(s3c2410fb_probe+0 xc/0 x18)from(platform_drv_probe+0 x18/0 x1c)這行信息分為兩部分,表示后面的platform_drv_probe函數(shù)調(diào)用了前面的s3c2410fb_probe函數(shù)。前半部含義為:“c0018f78”是s3c2410fb_probe函數(shù)首地址偏移0 xc的地址,這個(gè)函數(shù)大小為0 x18。后半部含義為:“c01d3f88”是platform_drv_probe函數(shù)首地址偏移0 x18的地址,這個(gè)函數(shù)大小為0 x1c。另外,后半部的“”表示s3c24

17、10fb_probe執(zhí)行后的返回地址。對(duì)于類似下面的棧回溯信息,其中是r8r4表示driver_probe_device函數(shù)剛被調(diào)用時(shí)這些寄存器的值。從上面的棧回溯信息可以知道內(nèi)核出錯(cuò)時(shí)的函數(shù)調(diào)用關(guān)系如下最后在s3c2410fb_probe函數(shù)內(nèi)部崩潰。do_exit-kernel_init-do_one_initcall-s3c2410fb_init-driver_register-bus_add_driver-bus_for_each_dev-_driver_attach-driver_probe_device-platform_drv_probe-s3c2410fb_probe根據(jù)pc寄

18、存器的值確定出錯(cuò)位置。上述Oops信息中出錯(cuò)時(shí)的寄存器值如下:PCisats3c2410fb_probe+0 xc/0 x18LRisatplatform_drv_probe+0 x18/0 x1cpc:lr:psr:a0000013sp:c3823f30ip:c3842e7cfp:00000000r10:00000000r9:00000000r8:c0445008r7:c38a0840r6:c0440d18r5:c042d178r4:00000000r3:00001234r2:00000000r1:00000000r0:c042d170PCisats3c2410fb_probe+0 xc/0

19、 xl8表示出錯(cuò)指令為s3c2410fb_probe函數(shù)中偏移為Oxc的指令。pc:表示出錯(cuò)指令的地址為cOO18f78(十六進(jìn)制)。結(jié)合內(nèi)核源代碼和反匯編代碼定位問(wèn)題。先生成內(nèi)核的反匯編代碼vmlinux.dis,執(zhí)行以下命令:$cd/Documents/myTest/kernel/linux-2.6.32$arm-linux-objdump-Dvmlinuxvmlinux.dis出錯(cuò)地址cOO18f78附近的部分匯編代碼如下:cOO18f64:cOO18f64:e3aO1OO1movr1,#1;Ox1cOO18f68:eafffe97bcOO189cc4.cOO18f6c:cOO18f6c

20、:e3aO2OOOmovr2,#O;OxOcOO18f7O:e59f3OO8ldrr3,pc,#8;cOO18f8OcOO18f74:e1aO1OO2movr1,r2cOO18f78:e5823OOOstrr3,r2=出錯(cuò)指令cOO18f7c:eafffe92bcOO189cccOO18f8O:OOOO1234.wordOxOOOO123412.cOO18f84:cOO18f84:e92d4O1Opushr4,lrcOO18f88:e59fOO14ldrrO,pc,#2O;cOO18fa4cOO18f8c:ebO6edO6blcO1d43accOO18f9O:e35OOOOOcmprO,#O;

21、OxOc0018f94:18bd8010popner4,pcc0018f98:e59f0008ldrr0,pc,#8;c0018fa8c0018f9c:e8bd4010popr4,lrc0018fa0:ea06ed01bc01d43acc0018fa4:c0440d04.word0 xc0440d04出錯(cuò)指令為“strr3,r2”,它把r3寄存器的值放到內(nèi)存中,內(nèi)存地址為r2寄存器的值。根據(jù)Oops信息中的寄存器值可知:r3為00001234,r2為0。0地址不可訪問(wèn),所以出錯(cuò)。staticint_inits3c2410fb_probe(structplatform_device*pdev)/

22、addforkernelpanic-beginint*ptest=NULL;*ptest=0 x1234;/addforkernelpanic-endreturns3c24xxfb_probe(pdev,DRV_S3C2410);結(jié)合反匯編代碼,很容易知道是“*ptest=0 x1234;”導(dǎo)致錯(cuò)誤,其中的ptest為空。對(duì)于大多數(shù)情況,從反匯編代碼定位到C代碼并不會(huì)如此容易,這需要較強(qiáng)的閱讀匯編程序的能力。通過(guò)棧回溯信息知道函數(shù)的調(diào)用關(guān)系,這已經(jīng)可以幫助定位很多問(wèn)題了。4.使用Oops的棧信息手工進(jìn)行棧回溯前面說(shuō)過(guò),從Oops信息的pc寄存器值可知得知崩潰發(fā)生時(shí)的函數(shù)、出錯(cuò)指令。但是錯(cuò)誤有可

23、能是它的調(diào)用者引入的,所以還要找出函數(shù)的調(diào)用關(guān)系。由于內(nèi)核配置了CONFIG_FRAME_POINTER,當(dāng)出現(xiàn)Oops信息時(shí),會(huì)打印?;厮菪畔ⅰH绻麅?nèi)核沒(méi)有配置CONFIG_FRAME_POINTER,這時(shí)可以自己分析棧信息,找到函數(shù)的調(diào)用關(guān)系。棧的作用一個(gè)程序包含代碼段、數(shù)據(jù)段、BSS段、堆、棧;其中數(shù)據(jù)段用來(lái)中存儲(chǔ)初始值不為0的全局?jǐn)?shù)據(jù),BSS段用來(lái)存儲(chǔ)初始值為0的全局?jǐn)?shù)據(jù),堆用于動(dòng)態(tài)內(nèi)存分配,棧用于實(shí)現(xiàn)函數(shù)調(diào)用、存儲(chǔ)局部變量。被調(diào)用函數(shù)在執(zhí)行之前,它會(huì)將一些寄存器的值保存在棧中,其中包括返回地址寄存器lr。如果知道了所保存的lr寄存的值,那么就可以知道它的調(diào)用者是誰(shuí)。在棧信息中,一個(gè)函

24、數(shù)一個(gè)函數(shù)地往上找出所有保存的lr值,就可以知道各個(gè)調(diào)用函數(shù),這就是?;厮莸脑?。?;厮輰?shí)例分析仍以前面的LCD驅(qū)動(dòng)程序?yàn)槔?使用上面的Oops信息的棧信息進(jìn)行分析,棧信息如下:Stack:(0 xc3823f30to0 xc3824000)3f20:00000000c01d2e7cc0440d18c042d1783f40:0000000cc042d178c042d1acc0440d18c38a0840c01d306800000000c01d300c3f60:c0440d18c01d24e8c3804938c38473300000000000000000c0440d18c01d1d483f80

25、:c03a1506c03a150600000001c0022dd400000000c0440d18c0018f84000000003fa0:00000000c01d3334c0022dd40000000000000000c0018f8400000000c0018f903fc0:c0022dd4c002e37cc0018f84c03c5ab3c0457880c0022fc8c0022dd4000000003fe0:000000000000000000000000c00083f800000000c002fe540000000000000000根據(jù)pc寄存器值找到第一個(gè)函數(shù),確定它的棧大小,確定調(diào)用

26、函數(shù)。從Oops信息1.PCisats3c2410fb_probe+0 xc/0 x18LRisatplatform_drv_probe+0 x18/0 x1cpc:lr:psr:a0000013sp:c3823f30ip:c3842e7cfp:00000000r10:00000000r9:00000000r8:c0445008r7:c38a0840r6:c0440d18r5:c042d178r4:00000000r3:00001234r2:00000000r1:00000000r0:c042d170可知pc值為cOO18f7&使用它在內(nèi)核反匯編程序vmlinux.dis中可以知道它位于s3c

27、2410fb_probe函數(shù)內(nèi)。c0018f6c:c0018f6c:e3a02000movr2,#0;0 x0c0018f70:e59f3008ldrr3,pc,#8;c0018f80c0018f74:e1a01002movr1,r2c0018f78:e5823000strr3,r2=出錯(cuò)指令c0018f7c:eafffe92bc00189ccc0018f80:00001234.word0 x00001234lr存放的是函數(shù)返回值地址,為c01d3f88,根據(jù)這個(gè)地址,搜索內(nèi)核反匯編程序vmlinux.dis,可知它位于:c01d3f70:c01d3f70:e92d4010pushr4,lrc01d3f74:e1a03000movr3,r0c01d3f78:e5933044ldrr3,r3,#68c01d3f7c:e2400008subr0,r0,#8;0 x8c01d3f80:e1a0e00fmovlr,pcc01d3f84:e513f014ldrpc,r3,#-20c01d3f88:e8bd8010popr4,pc也就是說(shuō),函數(shù)s3c2410fb_p

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論