0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何解读内核的oops

嵌入式与Linux那些事 来源:嵌入式与Linux那些事 作者: 仲一 2022-10-21 12:39 次阅读

OOPS信息解读

root@firefly:~/mnt/module#insmodoops_module.ko
[867.140514]UnabletohandlekernelNULLpointerdereferenceatvirtualaddress00000000
[867.141279]pgd=ffffffc0f0a65000
[867.141582][00000000]*pgd=0000000000000000,*pud=0000000000000000
[867.142164]Internalerror:Oops:96000045[#1]SMP
[867.142592]Moduleslinkedin:oops_module(O+)
[867.143006]CPU:4PID:1163Comm:insmodTainted:GO4.4.194+#7
[867.143649]Hardwarename:Firefly-RK3399Board(LinuxOpensource)(DT)
[867.144236]task:ffffffc0cdc44380task.stack:ffffffc00a4fc000
[867.144761]PCisatinit_oopsdemo+0x24/0x38[oops_module]
[867.145247]LRisatinit_oopsdemo+0x18/0x38[oops_module]
[867.145732]pc:[]lr:[]pstate:40000145
[867.146386]sp:ffffffc00a4ffc40
[867.146688]x29:ffffffc00a4ffc40x28:ffffff80081376d0
[867.147178]x27:0000000000000001x26:ffffffc0cde6e880
[867.147491]x25:0000000000000001x24:ffffff8000ef2050
[867.147495]x23:0000000000000000x22:ffffff80095b7860
[867.147498]x21:ffffffc0cdce10c0x20:ffffff80095b7860
[867.147501]x19:ffffff8000ef0000x18:ffffff80897bfa97
[867.147504]x17:0000007fb096c8a0x16:ffffff800813b204Segmentationfau
lt
[867.147508]x15:0000000000000000root@firefly:~/mx14:00000000000224d6nt/module#
[867.147511]x13:000000000000000ax12:0000000000000030
[867.147515]x11:00000000fffffffex10:ffffff80097bfa9f
[867.147518]x9:0000000005f5e0ffx8:ffffff8008463c3c
[867.147522]x7:ffffff80096280b0x6:0000000000000022
[867.147525]x5:ffffffc0f7f24b38x4:0000000000000001
[867.147528]x3:0000000000000007x2:0000000000000007
[867.147534]x1:0000000019760817x0:0000000000000000
[867.147536]
[867.147536]PC:0xffffff8000eeffa4:
[867.147550]ffa4****************************************************************
[867.147561]ffc4****************************************************************
[867.147572]ffe4********************************************************a9bf7bfd
[867.147581]0004910003fdaa1e03e0d503201f5800010095ca7426d2800000528102e172a32ec1
[867.147590]0024b9000001a8c17bfdd65f03c000ef1024ffffff80a9bf7bfd910003fdaa1e03e0
[867.147599]0044d503201f5800008095ca7418a8c17bfdd65f03c000ef1038ffffff8000000000
[867.147607]00640000000000000000000000000000000000000000000000000000000000000000
[867.147616]00840000000000000000000000000000000000000000000000000000000000000000
[867.147618]
[867.147618]LR:0xffffff8000eeff98:
[867.147629]ff98****************************************************************
[867.147639]ffb8****************************************************************
[867.147650]ffd8****************************************************************
[867.147659]fff8****************a9bf7bfd910003fdaa1e03e0d503201f5800010095ca7426
[867.147668]0018d2800000528102e172a32ec1b9000001a8c17bfdd65f03c000ef1024ffffff80
[867.147677]0038a9bf7bfd910003fdaa1e03e0d503201f5800008095ca7418a8c17bfdd65f03c0
[867.147685]005800ef1038ffffff80000000000000000000000000000000000000000000000000
[867.147693]00780000000000000000000000000000000000000000000000000000000000000000
[867.147695]
[867.147695]SP:0xffffffc00a4ffbc0:
[867.147705]fbc0095b7860ffffff80000000000000000000ef2050ffffff800000000100000000
[867.147713]fbe0cde6e880ffffffc00000000100000000081376d0ffffff800a4ffc40ffffffc0
[867.147726]fc0000ef0018ffffff800a4ffc40ffffffc000ef0024ffffff804000014500000000
[867.147734]fc20ee9ae0000000004000012ffb0000000000000000000000800000000000000000
[867.147743]fc400a4ffc50ffffffc0080830f8ffffff800a4ffcd0ffffffc00818d2d0ffffff80
[867.147765]fc6000ef2000ffffff80095cd000ffffff80cde6e8c8ffffffc0cdce1140ffffffc0
[867.147774]fc8000000000000000000818d2a4ffffff8000ef2000ffffff80095cd000ffffff80
[867.147782]fca0cde6e8c8ffffffc0095cd000ffffff80000000000000000000ef2050ffffff80
[867.147785]
[867.147785]X5:0xffffffc0f7f24ab8:
[867.147794]4ab80000003f000000000000003f0000000000000000000000000000000000000000
[867.147803]4ad80000000000000000000000000000000000000000000000000000000000000000
[867.147811]4af80000000000000000000000000000000000000000000000000000000000000000
[867.147819]4b18afbe53560000000100000000000000000810d62cffffff800000000100000000
[867.147828]4b38000000070000000000000000000000000810dd18ffffff800000000000000000
[867.147836]4b580000000001400000000000000000e29300000000000000000000000000000000
[867.147845]4b780000000000000000d591d591dead4eadffffffff00000000ffffffffffffffff
[867.147853]4b9800000000000000000008a70b000000010008a701000000010000000d00000000
[867.147855]
[867.147855]X7:0xffffff8009628030:
[867.147863]8030f26a3900ffffffc0000000000000000000000000000000000011000000000000
[867.147872]8050000f000000000000000000000000000000040000000000000008000000000000
[867.147880]80700000000000000000000000000000000000000001000000000000000000000000
[867.147889]80900000000000000001000000000000000100000002000000010000000100000000
[867.147897]80b000000000000000000927e623ffffff8004e804e8dead4eadffffffff00000000
[867.147905]80d0fffffffffffffffff2000000ffffffc000040000000000000000000100000000
[867.147914]80f000000000dead4eadffffffff00000000ffffffffffffffff09628108ffffff80
[867.147922]811009628108ffffff80000000000000000000000000000000000000000000000000
[867.147924]
[867.147924]X8:0xffffff8008463bbc:
[867.147933]3bbc9400054aaa1303e09400055452800000a94153f3f94013f5a8c37bfdd65f03c0
[867.147942]3bdcf940041317fffff6f940081317fffff4f9400c1317fffff2128002a017fffff5
[867.147950]3bfc71001c1f54000161f9405ce0f9400c00b4000140a9bf7bfdaa0603e2aa0403e1
[867.147959]3c1c910003fd940004cea8c17bfdd65f03c0128002a0d65f03c012800160d65f03c0
[867.147967]3c3ca9bb7bfd7100081f910003fda9025bf5aa0403f6a90153f3aa0603f5a90363f7
[867.147975]3c5cf9405cf354000181f9400660b4000a202a1503e2aa1603e19400047d52800000
[867.147984]3c7ca94153f3a9425bf5a94363f7a8c57bfdd65f03c071000c1f54000061f9400a60
[867.147992]3c9c17fffff371001c1f54000061f9400e6017ffffef35000820510004207100041f
[867.147994]
[867.147994]X10:0xffffff80097bfa1f:
[867.148003]fa1c0000000000000000000000000000000000000000000000000000000000000000
[867.148011]fa3c0000000000000000000000000000000000000000000000000000000000000000
[867.148020]fa5c0000000000000000000000000000000000000000000000000000000000000000
[867.148028]fa7c000000000000000000000000000000000000000000000001000000003820205b
[867.148037]fa9c312e37363934373478205d31203a353230303030303030303030303031303030
[867.148045]fabc5d3e342020726c203c5b203a6666666630386666666530303831303070205d3e
[867.148054]fadc7461747334203a65303030300a353431303030300a303030742f0a67296d0a78
[867.148062]fafc3028202c0a2973203331200a3a34353a762033346973726537206e6f2e35332e
[867.148071]fb1c2e34383135722e3132412820617453206e6f69745032502f5746202930204449
[867.148074]
[867.148074]X16:0xffffff800813b184:
[867.148083]b184fa4130029a9f87e2b4000202aa1303e2aa1403e1aa1503e0940e73e9b5000220
[867.148093]b1a4943672e08b1302b58b130294eb1302f754fffde152800002aa1603e1910163a0
[867.148101]b1c497fff7ff17ffffc6aa1303e252800001aa1503e0940e775aaa1303e017fffff0
[867.148110]b1e4f9402fa094021fc6128001a017ffffbc128000e017ffffba1280016017ffffb8
[867.148118]b204a9b67bfd910003fda90153f3f90013f5aa0003f5aa1e03e0aa0103f4aa0203f3
[867.148127]b224d503201fa903ffbfa904ffbfa905ffbfa906ffbfa907ffbfa908ffbff9004fbf
[867.148135]b24497ffefb2340000c093407c00a94153f3f94013f5a8ca7bfdd65f03c0f000b220
[867.148143]b264913d0000910aa00079404401361000e1d00088a12a1303e4aa1403e32a1503e2
[867.148146]
[867.148146]X18:0xffffff80897bfa17:
[867.148157]fa14****************************************************************
[867.148167]fa34****************************************************************
[867.148178]fa54****************************************************************
[867.148189]fa74****************************************************************
[867.148199]fa94****************************************************************
[867.148210]fab4****************************************************************
[867.148221]fad4****************************************************************
[867.148232]faf4****************************************************************
[867.148243]fb14****************************************************************
[867.148244]
[867.148244]X19:0xffffff8000eeff80:
[867.148256]ff80****************************************************************
[867.148271]ffa0****************************************************************
[867.148282]ffc0****************************************************************
[867.148293]ffe0****************************************************************
[867.148303]0000a9bf7bfd910003fdaa1e03e0d503201f5800010095ca7426d2800000528102e1
[867.148311]002072a32ec1b9000001a8c17bfdd65f03c000ef1024ffffff80a9bf7bfd910003fd
[867.148320]0040aa1e03e0d503201f5800008095ca7418a8c17bfdd65f03c000ef1038ffffff80
[867.148328]00600000000000000000000000000000000000000000000000000000000000000000
[867.148330]
[867.148330]X20:0xffffff80095b77e0:
[867.148338]77e00000000000000000000000000000000000000000000000000000000000000000
[867.148346]78000000000000000000000000000000000000000000000000000000000000000000
[867.148355]78200000000000000000000000000000000000000000000000000000000000000000
[867.148363]78400000000000000000000000000000000000000000000000000000000000000000
[867.148372]7860095b7860ffffff80095b7860ffffff80000000010000000000005dc000000000
[867.148380]788000000009756e694c000000780000000000000000000000000000000000000000
[867.148388]78a00000000000000000000000000000000000000000000000000000000000000000
[867.148397]78c00000000072696600796c66650000000000000000000000000000000000000000
[867.148398]
[867.148398]X21:0xffffffc0cdce1040:
[867.148407]1040746f6e2e6e672e6575622e752d646c6900006469dead000000000200dead0000
[867.148415]1060000000010000000000000000000000000000000000000000055aab5600000000
[867.148424]1080cdce1bc0ffffffc0cde6d909ffffffc0cde6d888ffffffc0cdce1bc8ffffffc0
[867.148433]10a00000000000000000000003dd6c62010e6c6b63612e747369666e6f6300000000
[867.148441]10c0cdce1080ffffffc06d6564736f5b206f5f73706f75646f6d005d656c00000000
[867.148449]10e000000000000000000000000f2e2e020200000000000000000000000000000000
[867.148458]11000000000000000000000000000000000000000000000000000000000000000000
[867.148466]11200000000000000000000000000000000000000000000000000000000000000000
[867.148468]
[867.148468]X22:0xffffff80095b77e0:
[867.148476]77e00000000000000000000000000000000000000000000000000000000000000000
[867.148484]78000000000000000000000000000000000000000000000000000000000000000000
[867.148493]78200000000000000000000000000000000000000000000000000000000000000000
[867.148501]78400000000000000000000000000000000000000000000000000000000000000000
[867.148510]7860095b7860ffffff80095b7860ffffff80000000010000000000005dc000000000
[867.148518]788000000009756e694c000000780000000000000000000000000000000000000000
[867.148526]78a00000000000000000000000000000000000000000000000000000000000000000
[867.148535]78c00000000072696600796c66650000000000000000000000000000000000000000
[867.148536]
[867.148536]X24:0xffffff8000ef1fd0:
[867.148545]1fd00000000000000000000000000000000000000000000000000000000000000000
[867.148553]1ff0000000000000000000000000000000000000000100000000095cd3a0ffffff80
[867.148562]2010095cd3a0ffffff8073706f6f646f6d5f00656c75000000000000000000000000
[867.148570]20300000000000000000000000000000000000000000000000000000000000000000
[867.148578]2050f089a080ffffffc0f26add00ffffffc0f2117e88ffffffc0f26add28ffffffc0
[867.148588]2070f26add00ffffffc0095c4c08ffffff80dbb66f78ffffffc00000000300000007
[867.148596]209000ef2000ffffff80000000000000000000000000000000000000000000000000
[867.148605]20b0f2f99c00ffffffc000000000000000000000000000000000f089ab40ffffffc0
[867.148606]
[867.148606]X26:0xffffffc0cde6e800:
[867.148615]e8000000000100000000d11d71a8ffffffc000000000000000000000000000000000
[867.148623]e820cf2e6030ffffffc000000000000000000000046d00000000095c42c8ffffff80
[867.148632]e8400000000000000000f7ec5e68ffffffc000000000000000000000000000000000
[867.148640]e8600000000000000000000000000000000000000000000000000000000000000000
[867.148649]e880f106a880ffffffc00000000100000000f089aa40ffffffc00000012400000000
[867.148657]e8a0000000240000000000ef1000ffffff80081375b0ffffff800000000000000000
[867.148665]e8c00000000000000000000000000000000000000000000000000000000000000000
[867.148674]e8e00000000000000000000000000000000000000000000000000000000000000000
[867.148675]
[867.148675]X28:0xffffff8008137650:
[867.148684]7650a90153f3aa0103f4aa0203f3aa1e03e0d503201ff0008f21913a1c21f9402280
[867.148693]7670b941d802aa1303e0940eb71d93407c00a94153f3a8c27bfdd65f03c0a9be7bfd
[867.148701]7690910003fda90153f3aa0103f4aa0203f3aa1e03e0d503201ff0008f21913a1c21
[867.148710]76b0f9402280b9418802aa1303e0940eb70c93407c00a94153f3a8c27bfdd65f03c0
[867.148718]76d0a9be7bfd910003fda90153f3aa0003f4aa0203f3aa1e03e0d503201faa1303e0
[867.148727]76f0b0008b61f940228291068021940eb6fc93407c00a94153f3a8c27bfdd65f03c0
[867.148735]7710a9be7bfd910003fda90153f3aa0003f3aa0103f4aa1e03e0d503201f52801801
[867.148743]7730aa1403e072a048019401c11af9006260a94153f3a8c27bfdd65f03c0a9be7bfd
[867.148745]
[867.148745]X29:0xffffffc00a4ffbc0:
[867.148754]fbc0095b7860ffffff80000000000000000000ef2050ffffff800000000100000000
[867.148763]fbe0cde6e880ffffffc00000000100000000081376d0ffffff800a4ffc40ffffffc0
[867.148771]fc0000ef0018ffffff800a4ffc40ffffffc000ef0024ffffff804000014500000000
[867.148780]fc20ee9ae0000000004000012ffb0000000000000000000000800000000000000000
[867.148790]fc400a4ffc50ffffffc0080830f8ffffff800a4ffcd0ffffffc00818d2d0ffffff80
[867.148798]fc6000ef2000ffffff80095cd000ffffff80cde6e8c8ffffffc0cdce1140ffffffc0
[867.148807]fc8000000000000000000818d2a4ffffff8000ef2000ffffff80095cd000ffffff80
[867.148815]fca0cde6e8c8ffffffc0095cd000ffffff80000000000000000000ef2050ffffff80
[867.148816]
[867.148820]Processinsmod(pid:1163,stacklimit=0xffffffc00a4fc000)
[867.148822]Stack:(0xffffffc00a4ffc40to0xffffffc00a500000)
[867.148826]fc40:ffffffc00a4ffc50ffffff80080830f8ffffffc00a4ffcd0ffffff800818d2d0
[867.148829]fc60:ffffff8000ef2000ffffff80095cd000ffffffc0cde6e8c8ffffffc0cdce1140
[867.148832]fc80:0000000000000000ffffff800818d2a4ffffff8000ef2000ffffff80095cd000
[867.148834]fca0:ffffffc0cde6e8c8ffffff80095cd0000000000000000000ffffff8000ef2050
[867.148837]fcc0:0000000000000001ffffffc0cde6e880ffffffc00a4ffd00ffffff800813ab5c
[867.148840]fce0:ffffff8000ef2000ffffffc00a4ffe58ffffffc0cde6e8c8ffffff80095cd000
[867.148843]fd00:ffffffc00a4ffe20ffffff800813b2b4000000000000000000000055736b60f0
[867.148846]fd20:00000000000000030000007fb096c8c400000000400000000000000000000015
[867.148849]fd40:000000000000011d0000000000000111ffffff8008ef2000ffffffc0cdc44380
[867.148851]fd60:0000000000000000000000000002c098ffffffc00a4ffe20ffffff8008f00000
[867.148854]fd80:000000000000000000000055736b60f0ffffffc000000064ffffff8000000072
[867.148857]fda0:ffffff800000006effffff800000003fffffff800000012400000000024000c0
[867.148860]fdc0:ffff81b400000030000003e80000000100000000000003e8000000000002c098
[867.148862]fde0:00000000633eccfc000000000000000000000000000000000000000000000000
[867.148865]fe00:0000000000000000000000000000000000000000000000000000000000000000
[867.148868]fe20:0000000000000000ffffff8008082f70000000000000000000000040ee9ae000
[867.148871]fe40:ffffffffffffffff00000000000000010000000000000002ffffff800bea0000
[867.148874]fe60:000000000002c098ffffff800becb9d8ffffff800becb8d0ffffff800beb7748
[867.148876]fe80:000000000000300000000000000030d800000000000000000000000000000000
[867.148879]fea0:00000000000004780000001a0000001900000000000000090000000000000004
[867.148882]fec0:000000000000000300000055736b60f000000000000000000000000000000003
[867.148884]fee0:0000000000000000000000000000021800000000000000010000000000000001
[867.148887]ff00:0000000000000111000000000000000300000002000000020000000000000000
[867.148890]ff20:00000000000010f0000000000000000000000000000000000000000000000040
[867.148892]ff40:00000055736cddb00000007fb096c8a000000000000000000000005585e6b600
[867.148895]ff60:00000055736b60f0000000000000000000000000000000000000005585e6b5d0
[867.148898]ff80:00000055736b2ef8000000000000000000000000000000000000000000000000
[867.148901]ffa0:00000000000000000000007fdbea3bd000000055736abdc00000007fdbea3bd0
[867.148903]ffc0:0000007fb096c8c4000000004000000000000000000000030000000000000111
[867.148906]ffe0:0000000000000000000000000000000000000000000000000000000000000000
[867.148907]Calltrace:
[867.148911]Exceptionstack(0xffffffc00a4ffa70to0xffffffc00a4ffba0)
[867.148913]fa60:ffffff8000ef00000000008000000000
[867.148916]fa80:ffffffc00a4ffc40ffffff8000ef0024ffffff80097c02f80000000000000002
[867.148918]faa0:ffffffc00a4ffac0000000020001b57c00000000000000000000000100000000
[867.148921]fac0:ffffffc00a4ffb60ffffff800810d674ffffffc00a4ffbc0ffffff8000ef1024
[867.148924]fae0:ffffffc0cdce10c0ffffff80095b78600000000000000000ffffff8000ef2050
[867.148927]fb00:0000000000000001ffffffc0cde6e88000000000000000000000000019760817
[867.148929]fb20:000000000000000700000000000000070000000000000001ffffffc0f7f24b38
[867.148932]fb40:0000000000000022ffffff80096280b0ffffff8008463c3c0000000005f5e0ff
[867.148935]fb60:ffffff80097bfa9f00000000fffffffe0000000000000030000000000000000a
[867.148937]fb80:00000000000224d60000000000000000ffffff800813b2040000007fb096c8a0
[867.148944][]init_oopsdemo+0x24/0x38[oops_module]
[867.148953][]do_one_initcall+0x78/0x194
[867.148958][]do_init_module+0x64/0x1c0
[867.148962][]load_module+0x199c/0x1ed0
[867.148964][]SyS_finit_module+0xb0/0xbc
[867.148968][]el0_svc_naked+0x24/0x28
[867.148972]Code:95ca7426d2800000528102e172a32ec1(b9000001)
[867.148975]---[endtrace1983a52768236533]---
[867.140514]UnabletohandlekernelNULLpointerdereferenceatvirtualaddress00000000

这里能够简要的告诉是什么问题触发了oops,显然是由于访问非法地址00000000异常。如果是由代码直接调用BUG()/BUG_ON()一类的,还能给出源代码中触发的行号。

[867.141279]pgd=ffffffc0f0a65000
[867.141582][00000000]*pgd=0000000000000000,*pud=0000000000000000

pgd,pud试图访问的地址的页表信息,本例中为0。

[867.142164]Internalerror:Oops:96000045[#1]SMP

96000045表示错误码。后面[]内的数值是与页面有关的oops信息被显示的次数。之后显示内核的重要特性SMP和PREEMPT被显示的配置情况。这条信息所在的内核启用了SMP支持,所以只显示SMP。

96000045这种错误码我也是第一次见,内核中也没找到。一般见的最多的就是001,002这种形式的?有大佬知道原因的可以评论下。

Oops的错误代码根据错误的原因会有不同的定义,如果发现自己遇到的Oops和下面无法对应的话,最好去内核代码里查找:

* error_code:* bit 0 == 0 means no page found, 1 means protection fault* bit 1 == 0 means read, 1 means write* bit 2 == 0 means kernel, 1 means user-mode* bit 3 == 0 means data, 1 means instruction

[867.142592]Moduleslinkedin:oops_module(O+)[lastunloaded:hello_module]

Modules linked in为加载了的模块列表,hello_module为上次加载的模块。

[867.143006]CPU:4PID:1163Comm:insmodTainted:GO4.4.194+#7
[867.143649]Hardwarename:Firefly-RK3399Board(LinuxOpensource)(DT)
[867.144236]task:ffffffc0cdc44380task.stack:ffffffc00a4fc000

CPU后的数字是错误所在逻辑CPU的编号,PID表示正在运行的进程ID1511,内核污染原因(G),内核版本( 4.4.194)。

内核污染原因包括私有驱动加载(P),模块强制加载(F),模块强制卸载(R),机器检查异常发生(M),检测到错误页(B)等。

如果涉及到了某项原因,就会显示为Tainted: G PF R这样。如果不存在问题,就会显示为Not Tainted。

其中Tainted的表示可以从内核中 kernel/panic.c 中找到:

Tainted 描述
‘G’ if all modules loaded have a GPL or compatible license
‘P’ if any proprietary module has been loaded. Modules without a MODULE_LICENSE or with a MODULE_LICENSE that is not recognised by insmod as GPL compatible are assumed to be proprietary.
‘F’ if any module was force loaded by “insmod -f”.
‘S’ if the Oops occurred on an SMP kernel running on hardware that hasn’t been certified as safe to run multiprocessor. Currently this occurs only on various Athlons that are not SMP capable.
‘R’ if a module was force unloaded by “rmmod -f”.
‘M’ if any processor has reported a Machine Check Exception.
‘B’ if a page-release function has found a bad page reference or some unexpected page flags.
‘U’ if a user or user application specifically requested that the Tainted flag be set.
‘D’ if the kernel has died recently, i.e. there was an OOPS or BUG.
‘W’ if a warning has previously been issued by the kernel.
‘C’ if a staging module / driver has been loaded.
‘I’ if the kernel is working around a sever bug in the platform’s firmware (BIOS or similar).

Hardware name表示硬件平台的名称。

task表示当前进程的地址, task.stack表示当前进程栈的地址。

[867.144761]PCisatinit_oopsdemo+0x24/0x38[oops_module]
[867.145247]LRisatinit_oopsdemo+0x18/0x38[oops_module]
[867.145732]pc:[]lr:[]pstate:40000145
[867.146386]sp:ffffffc00a4ffc40

init_oopsdemo+0x24/0x38[oops_module]表示错误发生的地址是oops_module中的init_oopsdemo函数的第44个字节,0x38表示init_oopsdemo函数的大小。

第3行,第4行分别是PC,LR,SP寄存器的具体地址。

[867.146688]x29:ffffffc00a4ffc40x28:ffffff80081376d0
[867.147178]x27:0000000000000001x26:ffffffc0cde6e880
[867.147491]x25:0000000000000001x24:ffffff8000ef2050
[867.147495]x23:0000000000000000x22:ffffff80095b7860
[867.147498]x21:ffffffc0cdce10c0x20:ffffff80095b7860
[867.147501]x19:ffffff8000ef0000x18:ffffff80897bfa97
[867.147504]x17:0000007fb096c8a0x16:ffffff800813b204Segmentationfau
lt
[867.147508]x15:0000000000000000root@firefly:~/mx14:00000000000224d6nt/module#
[867.147511]x13:000000000000000ax12:0000000000000030
[867.147515]x11:00000000fffffffex10:ffffff80097bfa9f
[867.147518]x9:0000000005f5e0ffx8:ffffff8008463c3c
[867.147522]x7:ffffff80096280b0x6:0000000000000022
[867.147525]x5:ffffffc0f7f24b38x4:0000000000000001
[867.147528]x3:0000000000000007x2:0000000000000007
[867.147534]x1:0000000019760817x0:0000000000000000
[867.147536]
[867.147536]PC:0xffffff8000eeffa4:
[867.147550]ffa4****************************************************************
[867.147561]ffc4****************************************************************
[867.147572]ffe4********************************************************a9bf7bfd
[867.147581]0004910003fdaa1e03e0d503201f5800010095ca7426d2800000528102e172a32ec1
[867.147590]0024b9000001a8c17bfdd65f03c000ef1024ffffff80a9bf7bfd910003fdaa1e03e0
[867.147599]0044d503201f5800008095ca7418a8c17bfdd65f03c000ef1038ffffff8000000000
[867.147607]00640000000000000000000000000000000000000000000000000000000000000000
[867.147616]00840000000000000000000000000000000000000000000000000000000000000000
[867.147618]
[867.147618]LR:0xffffff8000eeff98:
[867.147629]ff98****************************************************************
[867.147639]ffb8****************************************************************
[867.147650]ffd8****************************************************************
[867.147659]fff8****************a9bf7bfd910003fdaa1e03e0d503201f5800010095ca7426
[867.147668]0018d2800000528102e172a32ec1b9000001a8c17bfdd65f03c000ef1024ffffff80
[867.147677]0038a9bf7bfd910003fdaa1e03e0d503201f5800008095ca7418a8c17bfdd65f03c0
[867.147685]005800ef1038ffffff80000000000000000000000000000000000000000000000000
[867.147693]00780000000000000000000000000000000000000000000000000000000000000000
[867.147695]
[867.147695]SP:0xffffffc00a4ffbc0:
[867.147705]fbc0095b7860ffffff80000000000000000000ef2050ffffff800000000100000000
[867.147713]fbe0cde6e880ffffffc00000000100000000081376d0ffffff800a4ffc40ffffffc0
[867.147726]fc0000ef0018ffffff800a4ffc40ffffffc000ef0024ffffff804000014500000000
[867.147734]fc20ee9ae0000000004000012ffb0000000000000000000000800000000000000000
[867.147743]fc400a4ffc50ffffffc0080830f8ffffff800a4ffcd0ffffffc00818d2d0ffffff80
[867.147765]fc6000ef2000ffffff80095cd000ffffff80cde6e8c8ffffffc0cdce1140ffffffc0
[867.147774]fc8000000000000000000818d2a4ffffff8000ef2000ffffff80095cd000ffffff80
[867.147782]fca0cde6e8c8ffffffc0095cd000ffffff80000000000000000000ef2050ffffff80
[867.147785]
[867.147785]X5:0xffffffc0f7f24ab8:
[867.147794]4ab80000003f000000000000003f0000000000000000000000000000000000000000
[867.147803]4ad80000000000000000000000000000000000000000000000000000000000000000
[867.147811]4af80000000000000000000000000000000000000000000000000000000000000000
[867.147819]4b18afbe53560000000100000000000000000810d62cffffff800000000100000000
[867.147828]4b38000000070000000000000000000000000810dd18ffffff800000000000000000
[867.147836]4b580000000001400000000000000000e29300000000000000000000000000000000
[867.147845]4b780000000000000000d591d591dead4eadffffffff00000000ffffffffffffffff
[867.147853]4b9800000000000000000008a70b000000010008a701000000010000000d00000000
[867.147855]
[867.147855]X7:0xffffff8009628030:
[867.147863]8030f26a3900ffffffc0000000000000000000000000000000000011000000000000
[867.147872]8050000f000000000000000000000000000000040000000000000008000000000000
[867.147880]80700000000000000000000000000000000000000001000000000000000000000000
[867.147889]80900000000000000001000000000000000100000002000000010000000100000000
[867.147897]80b000000000000000000927e623ffffff8004e804e8dead4eadffffffff00000000
[867.147905]80d0fffffffffffffffff2000000ffffffc000040000000000000000000100000000
[867.147914]80f000000000dead4eadffffffff00000000ffffffffffffffff09628108ffffff80
[867.147922]811009628108ffffff80000000000000000000000000000000000000000000000000
[867.147924]
[867.147924]X8:0xffffff8008463bbc:
[867.147933]3bbc9400054aaa1303e09400055452800000a94153f3f94013f5a8c37bfdd65f03c0
[867.147942]3bdcf940041317fffff6f940081317fffff4f9400c1317fffff2128002a017fffff5
[867.147950]3bfc71001c1f54000161f9405ce0f9400c00b4000140a9bf7bfdaa0603e2aa0403e1
[867.147959]3c1c910003fd940004cea8c17bfdd65f03c0128002a0d65f03c012800160d65f03c0
[867.147967]3c3ca9bb7bfd7100081f910003fda9025bf5aa0403f6a90153f3aa0603f5a90363f7
[867.147975]3c5cf9405cf354000181f9400660b4000a202a1503e2aa1603e19400047d52800000
[867.147984]3c7ca94153f3a9425bf5a94363f7a8c57bfdd65f03c071000c1f54000061f9400a60
[867.147992]3c9c17fffff371001c1f54000061f9400e6017ffffef35000820510004207100041f
[867.147994]
[867.147994]X10:0xffffff80097bfa1f:
[867.148003]fa1c0000000000000000000000000000000000000000000000000000000000000000
[867.148011]fa3c0000000000000000000000000000000000000000000000000000000000000000
[867.148020]fa5c0000000000000000000000000000000000000000000000000000000000000000
[867.148028]fa7c000000000000000000000000000000000000000000000001000000003820205b
[867.148037]fa9c312e37363934373478205d31203a353230303030303030303030303031303030
[867.148045]fabc5d3e342020726c203c5b203a6666666630386666666530303831303070205d3e
[867.148054]fadc7461747334203a65303030300a353431303030300a303030742f0a67296d0a78
[867.148062]fafc3028202c0a2973203331200a3a34353a762033346973726537206e6f2e35332e
[867.148071]fb1c2e34383135722e3132412820617453206e6f69745032502f5746202930204449
[867.148074]
[867.148074]X16:0xffffff800813b184:
[867.148083]b184fa4130029a9f87e2b4000202aa1303e2aa1403e1aa1503e0940e73e9b5000220
[867.148093]b1a4943672e08b1302b58b130294eb1302f754fffde152800002aa1603e1910163a0
[867.148101]b1c497fff7ff17ffffc6aa1303e252800001aa1503e0940e775aaa1303e017fffff0
[867.148110]b1e4f9402fa094021fc6128001a017ffffbc128000e017ffffba1280016017ffffb8
[867.148118]b204a9b67bfd910003fda90153f3f90013f5aa0003f5aa1e03e0aa0103f4aa0203f3
[867.148127]b224d503201fa903ffbfa904ffbfa905ffbfa906ffbfa907ffbfa908ffbff9004fbf
[867.148135]b24497ffefb2340000c093407c00a94153f3f94013f5a8ca7bfdd65f03c0f000b220
[867.148143]b264913d0000910aa00079404401361000e1d00088a12a1303e4aa1403e32a1503e2
[867.148146]
[867.148146]X18:0xffffff80897bfa17:
[867.148157]fa14****************************************************************
[867.148167]fa34****************************************************************
[867.148178]fa54****************************************************************
[867.148189]fa74****************************************************************
[867.148199]fa94****************************************************************
[867.148210]fab4****************************************************************
[867.148221]fad4****************************************************************
[867.148232]faf4****************************************************************
[867.148243]fb14****************************************************************
[867.148244]
[867.148244]X19:0xffffff8000eeff80:
[867.148256]ff80****************************************************************
[867.148271]ffa0****************************************************************
[867.148282]ffc0****************************************************************
[867.148293]ffe0****************************************************************
[867.148303]0000a9bf7bfd910003fdaa1e03e0d503201f5800010095ca7426d2800000528102e1
[867.148311]002072a32ec1b9000001a8c17bfdd65f03c000ef1024ffffff80a9bf7bfd910003fd
[867.148320]0040aa1e03e0d503201f5800008095ca7418a8c17bfdd65f03c000ef1038ffffff80
[867.148328]00600000000000000000000000000000000000000000000000000000000000000000
[867.148330]
[867.148330]X20:0xffffff80095b77e0:
[867.148338]77e00000000000000000000000000000000000000000000000000000000000000000
[867.148346]78000000000000000000000000000000000000000000000000000000000000000000
[867.148355]78200000000000000000000000000000000000000000000000000000000000000000
[867.148363]78400000000000000000000000000000000000000000000000000000000000000000
[867.148372]7860095b7860ffffff80095b7860ffffff80000000010000000000005dc000000000
[867.148380]788000000009756e694c000000780000000000000000000000000000000000000000
[867.148388]78a00000000000000000000000000000000000000000000000000000000000000000
[867.148397]78c00000000072696600796c66650000000000000000000000000000000000000000
[867.148398]
[867.148398]X21:0xffffffc0cdce1040:
[867.148407]1040746f6e2e6e672e6575622e752d646c6900006469dead000000000200dead0000
[867.148415]1060000000010000000000000000000000000000000000000000055aab5600000000
[867.148424]1080cdce1bc0ffffffc0cde6d909ffffffc0cde6d888ffffffc0cdce1bc8ffffffc0
[867.148433]10a00000000000000000000003dd6c62010e6c6b63612e747369666e6f6300000000
[867.148441]10c0cdce1080ffffffc06d6564736f5b206f5f73706f75646f6d005d656c00000000
[867.148449]10e000000000000000000000000f2e2e020200000000000000000000000000000000
[867.148458]11000000000000000000000000000000000000000000000000000000000000000000
[867.148466]11200000000000000000000000000000000000000000000000000000000000000000
[867.148468]
[867.148468]X22:0xffffff80095b77e0:
[867.148476]77e00000000000000000000000000000000000000000000000000000000000000000
[867.148484]78000000000000000000000000000000000000000000000000000000000000000000
[867.148493]78200000000000000000000000000000000000000000000000000000000000000000
[867.148501]78400000000000000000000000000000000000000000000000000000000000000000
[867.148510]7860095b7860ffffff80095b7860ffffff80000000010000000000005dc000000000
[867.148518]788000000009756e694c000000780000000000000000000000000000000000000000
[867.148526]78a00000000000000000000000000000000000000000000000000000000000000000
[867.148535]78c00000000072696600796c66650000000000000000000000000000000000000000
[867.148536]
[867.148536]X24:0xffffff8000ef1fd0:
[867.148545]1fd00000000000000000000000000000000000000000000000000000000000000000
[867.148553]1ff0000000000000000000000000000000000000000100000000095cd3a0ffffff80
[867.148562]2010095cd3a0ffffff8073706f6f646f6d5f00656c75000000000000000000000000
[867.148570]20300000000000000000000000000000000000000000000000000000000000000000
[867.148578]2050f089a080ffffffc0f26add00ffffffc0f2117e88ffffffc0f26add28ffffffc0
[867.148588]2070f26add00ffffffc0095c4c08ffffff80dbb66f78ffffffc00000000300000007
[867.148596]209000ef2000ffffff80000000000000000000000000000000000000000000000000
[867.148605]20b0f2f99c00ffffffc000000000000000000000000000000000f089ab40ffffffc0
[867.148606]
[867.148606]X26:0xffffffc0cde6e800:
[867.148615]e8000000000100000000d11d71a8ffffffc000000000000000000000000000000000
[867.148623]e820cf2e6030ffffffc000000000000000000000046d00000000095c42c8ffffff80
[867.148632]e8400000000000000000f7ec5e68ffffffc000000000000000000000000000000000
[867.148640]e8600000000000000000000000000000000000000000000000000000000000000000
[867.148649]e880f106a880ffffffc00000000100000000f089aa40ffffffc00000012400000000
[867.148657]e8a0000000240000000000ef1000ffffff80081375b0ffffff800000000000000000
[867.148665]e8c00000000000000000000000000000000000000000000000000000000000000000
[867.148674]e8e00000000000000000000000000000000000000000000000000000000000000000
[867.148675]
[867.148675]X28:0xffffff8008137650:
[867.148684]7650a90153f3aa0103f4aa0203f3aa1e03e0d503201ff0008f21913a1c21f9402280
[867.148693]7670b941d802aa1303e0940eb71d93407c00a94153f3a8c27bfdd65f03c0a9be7bfd
[867.148701]7690910003fda90153f3aa0103f4aa0203f3aa1e03e0d503201ff0008f21913a1c21
[867.148710]76b0f9402280b9418802aa1303e0940eb70c93407c00a94153f3a8c27bfdd65f03c0
[867.148718]76d0a9be7bfd910003fda90153f3aa0003f4aa0203f3aa1e03e0d503201faa1303e0
[867.148727]76f0b0008b61f940228291068021940eb6fc93407c00a94153f3a8c27bfdd65f03c0
[867.148735]7710a9be7bfd910003fda90153f3aa0003f3aa0103f4aa1e03e0d503201f52801801
[867.148743]7730aa1403e072a048019401c11af9006260a94153f3a8c27bfdd65f03c0a9be7bfd
[867.148745]
[867.148745]X29:0xffffffc00a4ffbc0:
[867.148754]fbc0095b7860ffffff80000000000000000000ef2050ffffff800000000100000000
[867.148763]fbe0cde6e880ffffffc00000000100000000081376d0ffffff800a4ffc40ffffffc0
[867.148771]fc0000ef0018ffffff800a4ffc40ffffffc000ef0024ffffff804000014500000000
[867.148780]fc20ee9ae0000000004000012ffb0000000000000000000000800000000000000000
[867.148790]fc400a4ffc50ffffffc0080830f8ffffff800a4ffcd0ffffffc00818d2d0ffffff80
[867.148798]fc6000ef2000ffffff80095cd000ffffff80cde6e8c8ffffffc0cdce1140ffffffc0
[867.148807]fc8000000000000000000818d2a4ffffff8000ef2000ffffff80095cd000ffffff80
[867.148815]fca0cde6e8c8ffffffc0095cd000ffffff80000000000000000000ef2050ffffff80
[867.148816]

上面打印出的这些都是异常发生时寄存器的值。

PC:PC也叫计数寄存器,用于存放下一条要执行的指令的地址,因此在子程序返回后,要将LR中的地址存入PC,即mov PC LR。

LR:子程序的返回地址:从子程序返回后,主程序继续执行的指令的地址称为子程序的返回地址.LR也叫链接寄存器,用于存放子程序的返回地址。在要进入子程序之前,先将子程序的返回地址存入LR

SP:SP也叫堆栈寄存器,用于存放要执行的数据。

X0~X7:传递子程序的参数和返回值,使用时不需要保存,多余的参数用堆栈传递,64位的返回结果保存在x0中。

X8:用于保存子程序的返回地址,使用时不需要保存。

X9~X15:临时寄存器,也叫可变寄存器,子程序使用时不需要保存。

X16~X17:子程序内部调用寄存器(IPx),使用时不需要保存,尽量不要使用。

X18:平台寄存器,它的使用与平台相关,尽量不要使用。

X19~X28:临时寄存器,子程序使用时必须保存。

X29:帧指针寄存器(FP),用于连接栈帧,使用时必须保存。

X30:链接寄存器(LR),用于保存子程序的返回地址。

X31:堆栈指针寄存器(SP),用于指向每个函数的栈顶。

[867.148820]Processinsmod(pid:1163,stacklimit=0xffffffc00a4fc000)
[867.148822]Stack:(0xffffffc00a4ffc40to0xffffffc00a500000)
[867.148826]fc40:ffffffc00a4ffc50ffffff80080830f8ffffffc00a4ffcd0ffffff800818d2d0
[867.148829]fc60:ffffff8000ef2000ffffff80095cd000ffffffc0cde6e8c8ffffffc0cdce1140
[867.148832]fc80:0000000000000000ffffff800818d2a4ffffff8000ef2000ffffff80095cd000
[867.148834]fca0:ffffffc0cde6e8c8ffffff80095cd0000000000000000000ffffff8000ef2050
[867.148837]fcc0:0000000000000001ffffffc0cde6e880ffffffc00a4ffd00ffffff800813ab5c
[867.148840]fce0:ffffff8000ef2000ffffffc00a4ffe58ffffffc0cde6e8c8ffffff80095cd000
[867.148843]fd00:ffffffc00a4ffe20ffffff800813b2b4000000000000000000000055736b60f0
[867.148846]fd20:00000000000000030000007fb096c8c400000000400000000000000000000015
[867.148849]fd40:000000000000011d0000000000000111ffffff8008ef2000ffffffc0cdc44380
[867.148851]fd60:0000000000000000000000000002c098ffffffc00a4ffe20ffffff8008f00000
[867.148854]fd80:000000000000000000000055736b60f0ffffffc000000064ffffff8000000072
[867.148857]fda0:ffffff800000006effffff800000003fffffff800000012400000000024000c0
[867.148860]fdc0:ffff81b400000030000003e80000000100000000000003e8000000000002c098
[867.148862]fde0:00000000633eccfc000000000000000000000000000000000000000000000000
[867.148865]fe00:0000000000000000000000000000000000000000000000000000000000000000
[867.148868]fe20:0000000000000000ffffff8008082f70000000000000000000000040ee9ae000
[867.148871]fe40:ffffffffffffffff00000000000000010000000000000002ffffff800bea0000
[867.148874]fe60:000000000002c098ffffff800becb9d8ffffff800becb8d0ffffff800beb7748
[867.148876]fe80:000000000000300000000000000030d800000000000000000000000000000000
[867.148879]fea0:00000000000004780000001a0000001900000000000000090000000000000004
[867.148882]fec0:000000000000000300000055736b60f000000000000000000000000000000003
[867.148884]fee0:0000000000000000000000000000021800000000000000010000000000000001
[867.148887]ff00:0000000000000111000000000000000300000002000000020000000000000000
[867.148890]ff20:00000000000010f0000000000000000000000000000000000000000000000040
[867.148892]ff40:00000055736cddb00000007fb096c8a000000000000000000000005585e6b600
[867.148895]ff60:00000055736b60f0000000000000000000000000000000000000005585e6b5d0
[867.148898]ff80:00000055736b2ef8000000000000000000000000000000000000000000000000
[867.148901]ffa0:00000000000000000000007fdbea3bd000000055736abdc00000007fdbea3bd0
[867.148903]ffc0:0000007fb096c8c4000000004000000000000000000000030000000000000111
[867.148906]ffe0:0000000000000000000000000000000000000000000000000000000000000000

stack limit显示的大小为kstack内核选项指定的大小。Stack 是栈开头部分的值。

[867.148907]Calltrace:
[867.148911]Exceptionstack(0xffffffc00a4ffa70to0xffffffc00a4ffba0)
[867.148913]fa60:ffffff8000ef00000000008000000000
[867.148916]fa80:ffffffc00a4ffc40ffffff8000ef0024ffffff80097c02f80000000000000002
[867.148918]faa0:ffffffc00a4ffac0000000020001b57c00000000000000000000000100000000
[867.148921]fac0:ffffffc00a4ffb60ffffff800810d674ffffffc00a4ffbc0ffffff8000ef1024
[867.148924]fae0:ffffffc0cdce10c0ffffff80095b78600000000000000000ffffff8000ef2050
[867.148927]fb00:0000000000000001ffffffc0cde6e88000000000000000000000000019760817
[867.148929]fb20:000000000000000700000000000000070000000000000001ffffffc0f7f24b38
[867.148932]fb40:0000000000000022ffffff80096280b0ffffff8008463c3c0000000005f5e0ff
[867.148935]fb60:ffffff80097bfa9f00000000fffffffe0000000000000030000000000000000a
[867.148937]fb80:00000000000224d60000000000000000ffffff800813b2040000007fb096c8a0
[867.148944][]init_oopsdemo+0x24/0x38[oops_module]
[867.148953][]do_one_initcall+0x78/0x194
[867.148958][]do_init_module+0x64/0x1c0
[867.148962][]load_module+0x199c/0x1ed0
[867.148964][]SyS_finit_module+0xb0/0xbc
[867.148968][]el0_svc_naked+0x24/0x28

栈回溯信息,可以从中看出函数调用关系

[867.148972]Code:95ca7426d2800000528102e172a32ec1(b9000001)
[867.148975]---[endtrace1983a52768236533]---
Segmentationfault

code是错误发生时PC指向的地址处的开头20字节的代码,括号里的是出错的具体指令。

如何根据OOPS找出bug

确定出错位置在内核函数还是驱动

System.map文件记录了所有符号的运行地址,这里的符号可以理解成函数名和变量。

System.map一般在内核编译完成后,根目录下生成。

0000000000000000A__rela_size
0000000000000000A_kernel_flags_le_hi32
0000000000000000A_kernel_offset_le_hi32
0000000000000000A_kernel_size_le_hi32
000000000000000aA_kernel_flags_le_lo32
0000000000000200APECOFF_FILE_ALIGNMENT
0000000000080000A_kernel_offset_le_lo32
000000000159e638A__rela_offset
0000000001800000A_kernel_size_le_lo32
ffffff8008080000t_head
ffffff8008080000T_text
ffffff8008080800T__exception_text_start
ffffff8008080800T_stext
ffffff8008080800Tdo_undefinstr
ffffff8008080a18Tdo_sysinstr
ffffff8008080ab4Tdo_mem_abort
ffffff8008080b60Tdo_sp_pc_abort
ffffff8008080c34Tdo_debug_exceptio
.............
ffffff8009879a48b__key.30413
ffffff8009879a48b__key.30416
ffffff8009879a48b__key.48814
ffffff8009879a48b__key.48818
ffffff8009879a48b__key.48819
ffffff8009879a48b__key.48820
ffffff8009879a48b__key.48821
ffffff800987a000Bidmap_pg_dir
ffffff800987d000Bswapper_pg_dir
ffffff800987f000Btramp_pg_dir
ffffff8009880000B_end

System.map中内核函数的范围是:ffffff8008080000 ~ ffffff8009880000。而PC出错的位置是ffffff8000ef0024。

所以,可以判定不是内核函数出错引起的,而是某个驱动模块。

如果把oops_module.ko直接编译进ko中,就是内核引起的错误了。PC出错时的地址也会刚好在System.map中。

汇编驱动文件

而OOPS信息也告诉我们,错误是出在了init_oopsdemo。

[17981.657899]PCisatinit_oopsdemo+0x24/0x38[oops_module]
[17981.658385]LRisatinit_oopsdemo+0x18/0x38[oops_module]

那如果OOPS没有打印出出错驱动的名字呢?

我们可以使用 cat /proc/kallsyms > kallsyms.txt命令,在kallsyms.txt中找出与PC值接近的符号。kallsyms.txt内容如下。

ffffff8008080800Tdo_undefinstr
ffffff8008080800T_stext
ffffff8008080800T__exception_text_start
ffffff8008080a18Tdo_sysinstr
ffffff8008080ab4Tdo_mem_abort
ffffff8008080b60Tdo_sp_pc_abort
ffffff8008080c34Tdo_debug_exception
.........
ffffff80094cfc0cTsparse_mem_map_populate
ffffff80094cfc64T_einittext
0000000000000000aoops_module.c[oops_module]
ffffff8000ef0000t$x[oops_module]
ffffff8000ef0000tinit_oopsdemo[oops_module]
ffffff8000ef0030t$d[oops_module]
ffffff8000ef0038t$x[oops_module]
ffffff8000ef0038tcleanup_oopsdemo[oops_module]
ffffff8000ef0058t$d[oops_module]
ffffff800bee40c8?__UNIQUE_ID_license2[oops_module]
ffffff800bee40d4?__UNIQUE_ID_author1[oops_module]
ffffff800bee40e3?__UNIQUE_ID_license0[oops_module]
ffffff800befb368n$d[oops_module]
0000000000000000aoops_module.mod.c[oops_module]
ffffff8000ef2000d$d[oops_module]
ffffff800bee40f8?$d[oops_module]
ffffff800bee40f8?__module_depends[oops_module]
ffffff800bee4101?__UNIQUE_ID_vermagic0[oops_module]
ffffff8000ef2000d__this_module[oops_module]
ffffff8000ef0038tcleanup_module[oops_module]
ffffff8000ef0000tinit_module[oops_module]
ffffff800818d0acuprintk[oops_module]
ffffff800808e770u_mcount[oops_module]

从上面可以看出,PC的值和ffffff8000ef0058很接近。所以,基本可以确定出错的模块是oops_module。而这个模块正是我自己写的例程。

接下来,我们就要准备反汇编oops_module.ko了,根据反汇编可以进一步确认出错的行数。

aarch64-linux-gnu-objdump-Doops_module.ko>oops_module.dis

oops_module.dis 内容如下

oops_module.ko:fileformatelf64-littleaarch64


Disassemblyofsection.note.gnu.build-id:

0000000000000000<.note.gnu.build-id>:
0:00000004.inst0x00000004;undefined
4:00000014.inst0x00000014;undefined
8:00000003.inst0x00000003;undefined
c:00554e47.inst0x00554e47;undefined
10:70d55614adrx20,fffffffffffaaad3<__UNIQUE_ID_vermagic0+0xfffffffffffaaa9a>
14:56a7eb64.inst0x56a7eb64;undefined
18:a66fbdf8.inst0xa66fbdf8;undefined
1c:2b31c03fcmnw1,w17,sxtw
20:bd9e1ffe.inst0xbd9e1ffe;undefined

Disassemblyofsection.text:

0000000000000000:
0:a9bf7bfdstpx29,x30,[sp,#-16]!
4:910003fdmovx29,sp
8:aa1e03e0movx0,x30
c:94000000bl0<_mcount>
10:58000100ldrx0,30
14:94000000bl0
18:d2800000movx0,#0x0//#0
1c:528102e1movw1,#0x817//#2071
20:72a32ec1movkw1,#0x1976,lsl#16
24:b9000001strw1,[x0]
28:a8c17bfdldpx29,x30,[sp],#16
2c:d65f03c0ret
...

0000000000000038:
38:a9bf7bfdstpx29,x30,[sp,#-16]!
3c:910003fdmovx29,sp
40:aa1e03e0movx0,x30
44:94000000bl0<_mcount>
48:58000080ldrx0,58
4c:94000000bl0
50:a8c17bfdldpx29,x30,[sp],#16
54:d65f03c0ret
...

Disassemblyofsection.modinfo:

0000000000000000<__UNIQUE_ID_license2>:
0:6563696cfnmlsz12.h,p2/m,z11.h,z3.h
4:3d65736eldrb14,[x27,#2396]
8:004c5047.inst0x004c5047;undefined

根据反汇编和之前 PC is at init_oopsdemo+0x24/0x38 [oops_module],可以确定发生错误的是0x24的位置。

24:b9000001strw1,[x0]#将w1寄存器的值,传送到地址值为x0的(存储器)内存中

而根据18: d2800000 mov x0, #0x0 // #0 可以确定x0 为0。

到这里也基本可以确定,是w1的值赋值给0地址时出错了。

其他方法

gdb

➜oops_moduleaarch64-linux-gnu-gdb-q./oops_module.ko
Readingsymbolsfrom./oops_module.ko...done.
(gdb)list*init_oopsdemo+0x24
0x4cisininit_oopsdemo(/home/zhongyi/code/module/oops_module/oops_module.c:10).
5MODULE_AUTHOR("ZHONGYI");
6
7staticintinit_oopsdemo(void)
8{
9printk("oopsmoduleinit!
");
10*((int*)0x00)=0x19760817;
11return0;
12}
13
14module_init(init_oopsdemo);
(gdb)

addr2line

Linux下addr2line命令用于将程序指令地址转换为所对应的函数名、以及函数所在的源文件名和行号。当含有调试信息(-g)的执行程序出现crash时(core dumped),可使用addr2line命令快速定位出错的位置。

如果无法确定文件名或函数名,addr2line将在它们的位置打印两个问号;如果无法确定行号,addr2line将打印0或一个问号。

参数说明:

-a:在函数名、文件名和行号信息之前,以十六进制形式显示地址。

-b:指定目标文件的格式为bfdname。

-C:将低级别的符号名解码为用户级别的名字。

-e:指定需要转换地址的可执行文件名,默认文件是a.out。

-f:在显示文件名、行号信息的同时显示函数名。

-s:仅显示每个文件名(the base of each file name)去除目录名。

-i:如果需要转换的地址是一个内联函数,则还将打印返回第一个非内联函数的信息。

-j:读取指定section的偏移而不是绝对地址。

-p:使打印更加人性化:每个地址(location)的信息都打印在一行上。

-r:启用或禁用递归量限制。

--help:打印帮助信息。

--version:打印版本号。

➜oops_moduleaarch64-linux-gnu-addr2line-e./oops_module.ko-p-f0x24
init_oopsdemoat/home/zhongyi/code/module/oops_module/oops_module.c:10
➜oops_modulecat/home/zhongyi/code/module/oops_module/oops_module.c|tail-n+5|head-n10
MODULE_AUTHOR("ZHONGYI");

staticintinit_oopsdemo(void)
{
printk("oopsmoduleinit!
");
*((int*)0x00)=0x19760817;
return0;
}

module_init(init_oopsdemo);

decodecode

在linux内核里面有很多脚本工具,位于linux/scripts/,里面有一个decodecode工具可以用来转换机器码,decodecode脚本可以在没有源代码或符号表的情况下,将oops异常的log作为输入就可以解析出错误位置的汇编代码。

oops_log.txt内容如下

calltrace:
[867.148911]Exceptionstack(0xffffffc00a4ffa70to0xffffffc00a4ffba0)
[867.148913]fa60:ffffff8000ef00000000008000000000
[867.148916]fa80:ffffffc00a4ffc40ffffff8000ef0024ffffff80097c02f80000000000000002
[867.148918]faa0:ffffffc00a4ffac0000000020001b57c00000000000000000000000100000000
[867.148921]fac0:ffffffc00a4ffb60ffffff800810d674ffffffc00a4ffbc0ffffff8000ef1024
[867.148924]fae0:ffffffc0cdce10c0ffffff80095b78600000000000000000ffffff8000ef2050
[867.148927]fb00:0000000000000001ffffffc0cde6e88000000000000000000000000019760817
[867.148929]fb20:000000000000000700000000000000070000000000000001ffffffc0f7f24b38
[867.148932]fb40:0000000000000022ffffff80096280b0ffffff8008463c3c0000000005f5e0ff
[867.148935]fb60:ffffff80097bfa9f00000000fffffffe0000000000000030000000000000000a
[867.148937]fb80:00000000000224d60000000000000000ffffff800813b2040000007fb096c8a0
[867.148944][]init_oopsdemo+0x24/0x38[oops_module]
[867.148953][]do_one_initcall+0x78/0x194
[867.148958][]do_init_module+0x64/0x1c0
[867.148962][]load_module+0x199c/0x1ed0
[867.148964][]SyS_finit_module+0xb0/0xbc
[867.148968][]el0_svc_naked+0x24/0x2
$ARCH=arm64CROSS_COMPILE=/home/zhongyi/code/rk3399_linux_release_v2.5.1_20210301/prebuilts/gcc/linux-x86/aarch64/gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-./scripts/decodecode< /home/zhongyi/code/module/oops_module/oops_log.txt

Code: 95ca7426 d2800000 528102e1 72a32ec1 (b9000001)
All code
========
   0:   95ca7426        .word   0x95ca7426
   4:   d2800000        .word   0xd2800000
   8:   528102e1        .word   0x528102e1
   c:   72a32ec1        .word   0x72a32ec1
  10:*  b9000001        .word   0xb9000001              <-- trapping instruction

Code starting with the faulting instruction
===========================================
   0:   b9000001        .word   0xb9000001

执行脚本后,就可以得到出错的汇编代码。trapping instruction指出了出错的地址。根据oop_module.ko的反汇编可以知道出错的位置24: b9000001 str w1, [x0]。

注意:脚本认为该机器码是跟host结构相同的原生机器码,想要跨架构翻译要指定架构和交叉工具链。

faddr2line

内核开发者为了方便问题的排查,也经常需要根据内核栈,快速定位导致问题发生的代码位置。所以,Linux 内核维护了一个 faddr2line 脚本,根据函数名+偏移量输出源码文件名和行号。

在使用这个脚本之前,还需要注意两个前提条件:

第一,带有调试信息的内核文件,一般名字为 vmlinux(注意,/boot 目录下面的 vmlinz 是压缩后的内核,不可以直接拿来使用)。

第二,系统中需要安装 awk、readelf、addr2line、size、nm 等命令。

对于第二个条件,这些命令都包含在 binutils 软件包中,只需要执行 apt 或者 dnf 命令安装即可。

而对第一个条件中的内核调试信息,各个主要的发行版也都提供了相应的软件仓库,你可以根据文档进行安装。比如,对于 Ubuntu 来说,你可以执行下面的命令安装调试信息:

codename=$(lsb_release-cs)
sudotee/etc/apt/sources.list.d/ddebs.list<< EOF
deb http://ddebs.ubuntu.com/ ${codename}      main restricted universe multiverse
deb http://ddebs.ubuntu.com/ ${codename}-updates  main restricted universe multiverse
EOF
sudo apt-get install -y ubuntu-dbgsym-keyring
sudo apt-get update
sudo apt-get install -y linux-image-$(uname -r)-dbgsym

由于我们这里的oops 是发生在ko中,而不是内核。因此,使用faddr2line指定oops_module.ko 即可。

➜kernelgit:(firefly)✗scripts/faddr2line/home/zhongyi/code/module/oops_module/oops_module.koinit_oopsdemo+0x24
init_oopsdemo+0x24/0x30:
init_oopsdemoat/home/zhongyi/code/module/oops_module/oops_module.c:18

如果oops发生在内核中,将oops_module.ko 换成对应的vmlinux即可。

最后,贴下oops_module.c的源代码,感兴趣的大家可以自己写一个分析下。

#include
#include

MODULE_LICENSE("BSD/GPL");
MODULE_AUTHOR("ZHONGYI");

staticintinit_oopsdemo(void)
{
printk("oopsmoduleinit!
");
*((int*)0x00)=0x19760817;
return0;
}

module_init(init_oopsdemo);

staticvoidcleanup_oopsdemo(void)
{
printk("oopsmoduleexit!
");
}

module_exit(cleanup_oopsdemo);
MODULE_LICENSE("GPL");

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 内核
    +关注

    关注

    3

    文章

    1363

    浏览量

    40228
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10825

    浏览量

    211146
  • Oops
    +关注

    关注

    0

    文章

    4

    浏览量

    3305

原文标题:如何解读内核的oops

文章出处:【微信号:嵌入式与Linux那些事,微信公众号:嵌入式与Linux那些事】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Linux编程时遇到Oops提示该如何排查?

    各位工程师在Linux下开发程序时,有没有遇到由于系统中存在某些小故障而跳出了“Oops”提示的情况,此时你是如何排查故障?一行行的查看代码吗?其实不用那么复杂,本文将为你介绍一种高效的Linux编程的故障排除方法。
    的头像 发表于 11-28 16:52 9025次阅读
    Linux编程时遇到<b class='flag-5'>Oops</b>提示该如何排查?

    何解读运放数据规格书

    在理解了上面的主要的运放非理想参数后,再读运放的数据规格书应该就不难了,下面我们以比较常见的LM321集成运放为例,来过一遍如何解读运放数据规格书。
    发表于 02-02 14:00 3307次阅读
    如<b class='flag-5'>何解读</b>运放数据规格书

    multisim的灵敏度分析结果如何解读

    本帖最后由 test753 于 2015-4-7 20:28 编辑 结果如何解读?教下吧
    发表于 04-07 20:10

    何解决cortex内核hardfault错误问题?

    何解决cortex内核hardfault错误问题?
    发表于 01-26 06:42

    CH341par Linux端DEMO运行错误是什么原因?如何解决?

    测试usb转i2c功能。Ubuntu16.04,内核版本4.13.我尝试write data时,内核出现oops.定位到如下代码:在驱动中:get_user时出现oops:检查了一下发
    发表于 07-01 06:20

    内核oops的根本原因是什么?我们如何调试内核oops

    Broadcom 交换机设备连接到我们主板上带有 PCIe 的 T1042。开关工作在 EP 模式。linux内核版本是4.14。在检测到 pcie 错误的现场卡中引发内核 oops。但是这个
    发表于 04-20 06:19

    Linux内核解读入门

    Linux内核解读入门关键词:Linux, 内核,源代码一.核心源程序的文件组织: 1. Linux核心源程序通常都安装在/usr/src/linux下,而且它有一个非常简单的编号约定:任何偶数的核
    发表于 01-16 14:40 103次下载

    系统设计人员如何解读产品说明书规范

    作为应用工程师,我遇到过系统设计人员针对如何解读产品说明书规范提出的大量问题。就在我认为我已经掌握如何确定规范以及它们如何造成设计误差时,我总会从客户的 TI E2E 论坛帖子、电话或电子邮件中获得与我的理解不同的内容。
    发表于 04-08 03:38 2108次阅读
    系统设计人员如<b class='flag-5'>何解读</b>产品说明书规范

    浅谈Linux内核解读入门

    针对好多Linux 爱好者对内核很有兴趣却无从下口,本文旨在介绍一种解读linux内核源码的入门方法,而不是解说linux复杂的内核机制; 一.核心源程序的文件组织: 1.Linux核
    发表于 11-08 10:06 2次下载

    你了解Linux内核中的常见符号?

    一些内核调用可以用来方便标记bug,提供断言并输出信息。最常用的两个是BUG()和BUG_ON()。当被调用的时候,它们会引发oops,导致栈的回溯和错误信息的打印。
    发表于 05-15 15:47 570次阅读
    你了解Linux<b class='flag-5'>内核</b>中的常见符号?

    linux内核中的Oops

    真不是故意打碎您的杯子的”。看,Oops就是这个意思。在Linux内核开发中的Oops是什么呢?其实,它和上面的解释也没什么本质的差别,只不过说话的主角变成了Linux。当某些比较致命的问题出现时,我们
    发表于 04-02 14:31 585次阅读

    内核oops错误原因及处理方法

    最近在调试设备时,遇到了一个偶发的开机死机问题。通过查看输出日志,发现内核报告了oops错误,如下所示(中间省略了部分日志,以......代替)。
    的头像 发表于 05-12 16:20 8101次阅读

    怎么解读内核oops

    Oops的错误代码根据错误的原因会有不同的定义,如果发现自己遇到的Oops和下面无法对应的话,最好去内核代码里查找
    的头像 发表于 02-17 16:08 928次阅读

    深入分析内核panic的内核错误处理方案

    die函数主要执行oops相关流程,且若异常为中断流程中触发或设置了panic_on_oops选项,则进一步通过panic将系统挂起。
    发表于 04-14 15:18 3663次阅读

    Linux内核第一版开源代码解读

    《Exploring the internals of Linux v0.01》是一篇解读 Linux 内核第一版开源代码的文章。此文今天在 Reddit 和 Hacker News 都冲上了热门。
    发表于 08-15 09:47 693次阅读