内容

[DESCRIPTION]
当kernel发生异常时,会在重启后生成对应的db,用GAT的logviewer可以解开,如果是普通的KE或HWT,并且存在SYS_MINI_RDUMP或者SYS_COREDUMP,则可以借助gdb/crash进一步debug,否则只能查看log分析问题的可能性了。
[SOLUTION]
以下两个方法都需要对应的vmlinux,详情请查看FAQ06985。
1. 存在SYS_MINI_RDUMP并且其大小>32KB(太小则可能文件错误)
  • 使用gdb分析

    • windows下,gdb可以使用NDK里的或者是GAT里的:gat-win32-3\prebuilt\android-sdk\bin\startGDB.bat(32bit kernel)或startGDB64.bat(64bit kernel)
    • linux下,可以使用prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.8/bin/arm-linux-androideabi-gdb (32bit kernel)或prebuilts/gcc/linux-x86/aarch64/arch64-linux-android-4.9/bin/aarch64-linux-android-gdb(64bit kernel)。其中的4.8或4.9是版本,最好使用最新的版本。
    • 直接启动gdb,进入gdb命令行,然后将vmlinux和SYS_MINI_RDUMP放到gdb所在的目录中,直接输入如下命令:
      • file vmlinux
      • core SYS_MINI_RDUMP
      • bt
    • 最后的bt是查看当前的调用栈,其他命令的话,直接到官方网站看手册即可。
    • 如果是HWT(看门狗复位),可以通过info threads看到其他CPU的状态和调用栈,用thread 2/3/4...切换不同的CPU,thread 2 => 切换到CPU0,thread 3 => 切换到CPU1,以此类推。
  • 使用trace32分析
    • 将匹配的vmlinux放入db解开的目录中,将以下内容保存成debug.cmm:
    • [XML]hide
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      71
      72
      73
      74
      75
      76
      77
      78
      79
      80
      81
      82
      83
      84
      85
      86
      87
      88
      89
      90
      91
      92
      93
      94
      95
      96
      97
      98
      99
      100
      101
      102
      103
      104
      105
      106
      107
      108
      109
      110
      111
      112
      113
      114
      115
      116
      117
      118
      119
      120
      121
      122
      123
      124
      125
      126
      127
      128
      129
      130
      131
      132
      133
      134
      135
      136
      137
      138
      139
      140
      141
      142
      143
      144
      145
      146
      147
      148
      149
      150
      151
      152
      153
      154
      155
      156
      157
      158
      159
      160
      161
      162
      163
      164
      165
      166
      167
      168
      169
      170
      171
      172
      173
      174
      175
      176
      177
      178
      179
      180
      181
      182
      183
      184
      185
      186
      187
      188
      189
      190
      191
      192
      193
      194
      195
      196
      197
      198
      199
      200
      201
      202
      203
      204
      205
      local &off
      if os.file.size("SYS_MINI_RDUMP")<=0x2000
      (
       dialog
       (
       header "File is incomplete"
       pos 0. 0. 26. 1.
       text "SYS_MINI_RDUMP is incomplete."
       pos 1. 3. 22. 1.
       defbutton "OK" "quit"
       close "quit"
       )
       enddo
      )
      do ~~/t32.cmm
      system.reset
      d.load.binary SYS_MINI_RDUMP VM:0--0x2000
      if d.word(VM:0x12)==0xb7
      (
       system.cpu CortexA53
      )
      if d.word(VM:0x12)==0x28
      (
       system.cpu CortexA7
      )
      system.up
      d.load.elf symbols\vmlinux /nc
      d.load.elf SYS_MINI_RDUMP /nc /nosymbol /logload
      if d.word(VM:0x12)==0xb7
      (
       &off=d.quad(VM:0x48)
       &off=&off+0xc+((d.long(VM:&off)+3)&~3)+((d.long(VM:(&off+4))+3)&~3)
       &off=&off+0xc+((d.long(VM:&off)+3)&~3)+0x70
       r.s CPSR d.quad(VM:(&off+0x108))
       r.s X0 d.quad(VM:(&off+0x00))
       r.s X1 d.quad(VM:(&off+0x08))
       r.s X2 d.quad(VM:(&off+0x10))
       r.s X3 d.quad(VM:(&off+0x18))
       r.s X4 d.quad(VM:(&off+0x20))
       r.s X5 d.quad(VM:(&off+0x28))
       r.s X6 d.quad(VM:(&off+0x30))
       r.s X7 d.quad(VM:(&off+0x38))
       r.s X8 d.quad(VM:(&off+0x40))
       r.s X9 d.quad(VM:(&off+0x48))
       r.s X10 d.quad(VM:(&off+0x50))
       r.s X11 d.quad(VM:(&off+0x58))
       r.s X12 d.quad(VM:(&off+0x60))
       r.s X13 d.quad(VM:(&off+0x68))
       r.s X14 d.quad(VM:(&off+0x70))
       r.s X15 d.quad(VM:(&off+0x78))
       r.s X16 d.quad(VM:(&off+0x80))
       r.s X17 d.quad(VM:(&off+0x88))
       r.s X18 d.quad(VM:(&off+0x90))
       r.s X19 d.quad(VM:(&off+0x98))
       r.s X20 d.quad(VM:(&off+0xA0))
       r.s X21 d.quad(VM:(&off+0xA8))
       r.s X22 d.quad(VM:(&off+0xB0))
       r.s X23 d.quad(VM:(&off+0xB8))
       r.s X24 d.quad(VM:(&off+0xC0))
       r.s X25 d.quad(VM:(&off+0xC8))
       r.s X26 d.quad(VM:(&off+0xD0))
       r.s X27 d.quad(VM:(&off+0xD8))
       r.s X28 d.quad(VM:(&off+0xE0))
       r.s X29 d.quad(VM:(&off+0xE8))
       r.s X30 d.quad(VM:(&off+0xF0))
       r.s SP d.quad(VM:(&off+0xF8))
       r.s PC d.quad(VM:(&off+0x100))
      )
      if d.word(VM:0x12)==0x28
      (
       &off=d.long(VM:0x38)
       &off=&off+0xc+((d.long(VM:&off)+3)&~3)+((d.long(VM:(&off+4))+3)&~3)
       &off=&off+0xc+((d.long(VM:&off)+3)&~3)+0x48
       r.s CPSR d.long(VM:(&off+0x40))
       r.s R0 d.long(VM:(&off+0x00))
       r.s R1 d.long(VM:(&off+0x04))
       r.s R2 d.long(VM:(&off+0x08))
       r.s R3 d.long(VM:(&off+0x0c))
       r.s R4 d.long(VM:(&off+0x10))
       r.s R5 d.long(VM:(&off+0x14))
       r.s R6 d.long(VM:(&off+0x18))
       r.s R7 d.long(VM:(&off+0x1c))
       r.s R8 d.long(VM:(&off+0x20))
       r.s R9 d.long(VM:(&off+0x24))
       r.s R10 d.long(VM:(&off+0x28))
       r.s R11 d.long(VM:(&off+0x2c))
       r.s R12 d.long(VM:(&off+0x30))
       r.s R13 d.long(VM:(&off+0x34))
       r.s R14 d.long(VM:(&off+0x38))
       r.s R15 d.long(VM:(&off+0x3c))
      )
      setup.v %hex.on %string.on
      winclear
      winpos 0% 0% 50% 100%
      w.v.f /a /l
      winpos 50% 0%
      w.r
      winpos 50% 30%
      d.l

    • 然后用Trace32加载debug.cmm,如果是32位的,需要用ARM32的trace32加载,如果是64位的则是ARM64的trace32加载。
2. 存在SYS_COREDUMP(该文件是否存在请看[FAQ13784]ramdump介绍)
  • 使用gdb分析

    • linux下,使用crash,crash搭建请看FAQ13939。
    • 将vmlinux和SYS_CORE_DUMP放到crash所在的目录中,直接输入:crash vmlinux SYS_COREDUMP即可进入crash命令行:
      • bt
    • bt是查看当前的调用栈,其他命令的话,直接到官方网站看手册即可。
  • 使用trace32分析
    • 将匹配的vmlinux放入db解开的目录中,将以下内容保存成debug.cmm:
    • [XML]hide
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      71
      72
      73
      74
      75
      76
      77
      78
      79
      80
      81
      82
      83
      84
      85
      86
      87
      88
      89
      90
      91
      92
      93
      94
      95
      96
      97
      98
      99
      100
      101
      102
      103
      104
      105
      106
      107
      108
      109
      110
      111
      112
      113
      114
      115
      116
      117
      118
      119
      120
      121
      122
      123
      124
      125
      126
      127
      128
      129
      130
      131
      132
      133
      134
      135
      136
      137
      138
      139
      140
      141
      142
      143
      144
      145
      146
      147
      148
      149
      150
      151
      152
      153
      154
      155
      156
      157
      158
      159
      160
      161
      162
      163
      164
      165
      166
      167
      168
      169
      170
      171
      172
      173
      174
      175
      176
      177
      178
      179
      180
      181
      182
      183
      184
      185
      186
      187
      188
      189
      190
      191
      192
      193
      194
      195
      196
      197
      198
      199
      200
      201
      202
      203
      204
      205
      206
      207
      208
      209
      210
      211
      212
      213
      214
      215
      216
      217
      218
      219
      220
      221
      222
      223
      224
      225
      226
      227
      228
      229
      230
      231
      232
      233
      234
      235
      236
      237
      238
      239
      240
      241
      242
      243
      244
      245
      246
      247
      248
      249
      250
      251
      252
      253
      254
      255
      256
      257
      258
      259
      260
      261
      262
      263
      264
      265
      266
      267
      local &off
      if os.file.size("SYS_COREDUMP")<=0x2000
      (
       dialog
       (
       header "File is incomplete"
       pos 0. 0. 26. 1.
       text "SYS_COREDUMP is incomplete."
       text "May be HW reboot db?"
       pos 2. 3. 22. 1.
       defbutton "OK" "quit"
       close "quit"
       )
       enddo
      )
      do ~~/t32.cmm
      system.reset
      d.load.binary SYS_COREDUMP VM:0--0x2000
      if d.word(VM:0x12)==0xb7
      (
       system.cpu CortexA53
      )
      if d.word(VM:0x12)==0x28
      (
       system.cpu CortexA7
      )
      system.option mmuspaces on
      system.up
      d.load.elf symbols\vmlinux /nc
      d.load.elf SYS_COREDUMP /nc /nosymbol /physload
      if d.word(VM:0x12)==0xb7
      (
       &off=d.quad(VM:0x48)
       &off=&off+0xc+((d.long(VM:&off)+3)&~3)+((d.long(VM:(&off+4))+3)&~3)
       &off=&off+0xc+((d.long(VM:&off)+3)&~3)+((d.long(VM:(&off+4))+3)&~3)
       &off=&off+0xc+((d.long(VM:&off)+3)&~3)+0x70
       r.s CPSR d.quad(VM:(&off+0x108))
       r.s X0 d.quad(VM:(&off+0x00))
       r.s X1 d.quad(VM:(&off+0x08))
       r.s X2 d.quad(VM:(&off+0x10))
       r.s X3 d.quad(VM:(&off+0x18))
       r.s X4 d.quad(VM:(&off+0x20))
       r.s X5 d.quad(VM:(&off+0x28))
       r.s X6 d.quad(VM:(&off+0x30))
       r.s X7 d.quad(VM:(&off+0x38))
       r.s X8 d.quad(VM:(&off+0x40))
       r.s X9 d.quad(VM:(&off+0x48))
       r.s X10 d.quad(VM:(&off+0x50))
       r.s X11 d.quad(VM:(&off+0x58))
       r.s X12 d.quad(VM:(&off+0x60))
       r.s X13 d.quad(VM:(&off+0x68))
       r.s X14 d.quad(VM:(&off+0x70))
       r.s X15 d.quad(VM:(&off+0x78))
       r.s X16 d.quad(VM:(&off+0x80))
       r.s X17 d.quad(VM:(&off+0x88))
       r.s X18 d.quad(VM:(&off+0x90))
       r.s X19 d.quad(VM:(&off+0x98))
       r.s X20 d.quad(VM:(&off+0xA0))
       r.s X21 d.quad(VM:(&off+0xA8))
       r.s X22 d.quad(VM:(&off+0xB0))
       r.s X23 d.quad(VM:(&off+0xB8))
       r.s X24 d.quad(VM:(&off+0xC0))
       r.s X25 d.quad(VM:(&off+0xC8))
       r.s X26 d.quad(VM:(&off+0xD0))
       r.s X27 d.quad(VM:(&off+0xD8))
       r.s X28 d.quad(VM:(&off+0xE0))
       r.s X29 d.quad(VM:(&off+0xE8))
       r.s X30 d.quad(VM:(&off+0xF0))
       r.s SP d.quad(VM:(&off+0xF8))
       r.s PC d.quad(VM:(&off+0x100))
       per.s spr:0x30201 %quad d.quad(VM:0x90)+0x7d000
       per.s spr:0x30202 %quad 0x00000032B5193519
       per.s spr:0x30100 %quad 0x0000000004C5D93D
       trans.common 0xFFFFFF8000000000--0xFFFFFFFFFFFFFFFF
       task.config "~~/demo/arm64/kernel/linux/linux-3.x/linux3"
       menu.rp "~~/demo/arm64/kernel/linux/linux-3.x/linux"
       task.setdir "~~/demo/arm64/kernel/linux/linux-3.x/"
       y.autoload.checklinux "do ~~/demo/arm64/kernel/linux/linux-3.x/autoload "
      )
      if d.word(VM:0x12)==0x28
      (
       &off=d.long(VM:0x38)
       &off=&off+0xc+((d.long(VM:&off)+3)&~3)+((d.long(VM:(&off+4))+3)&~3)
       &off=&off+0xc+((d.long(VM:&off)+3)&~3)+((d.long(VM:(&off+4))+3)&~3)
       &off=&off+0xc+((d.long(VM:&off)+3)&~3)+0x48
       r.s CPSR d.long(VM:(&off+0x40))
       r.s R0 d.long(VM:(&off+0x00))
       r.s R1 d.long(VM:(&off+0x04))
       r.s R2 d.long(VM:(&off+0x08))
       r.s R3 d.long(VM:(&off+0x0c))
       r.s R4 d.long(VM:(&off+0x10))
       r.s R5 d.long(VM:(&off+0x14))
       r.s R6 d.long(VM:(&off+0x18))
       r.s R7 d.long(VM:(&off+0x1c))
       r.s R8 d.long(VM:(&off+0x20))
       r.s R9 d.long(VM:(&off+0x24))
       r.s R10 d.long(VM:(&off+0x28))
       r.s R11 d.long(VM:(&off+0x2c))
       r.s R12 d.long(VM:(&off+0x30))
       r.s R13 d.long(VM:(&off+0x34))
       r.s R14 d.long(VM:(&off+0x38))
       r.s R15 d.long(VM:(&off+0x3c))
       per.s c15:0x2 %long d.long(VM:0x60)+0x4000
       per.s c15:0x1 %long 1
       trans.common 0xBF000000--0xFFFFFFFF
       task.config "~~/demo/arm/kernel/linux/linux.t32"
       menu.rp "~~/demo/arm/kernel/linux/linux.men"
       task.setdir "~~/demo/arm/kernel/linux/"
       y.autoload.checklinux "do ~~/demo/arm/kernel/linux/autoload "
      )
      trans.tablewalk on
      trans.on
      mmu.scan
      help.filter.add rtoslinux
      task.y.o mmuscan off
      task.y.o rootpath "./"
      task.y.o al m
      task.y.o al cl
      task.y.o al vm
      task.o nm arg0comm
      y.autoload.check
      task.check
      setup.v %hex.on %string.on
      winclear
      winpos 0% 0% 50% 100%
      w.v.f /a /l
      winpos 50% 0%
      w.r
      winpos 50% 30%
      d.l

    • 然后用Trace32加载debug.cmm,如果是32位的,需要用ARM32的trace32加载,如果是64位的则是ARM64的trace32加载。

12 如何分析kernel panic?相关推荐

  1. <2012 12 17> “Kernel panic - not syncing” 问题的解决

    <2012 12 17> "Kernel panic - not syncing" 问题的解决 参考文章: (1)<2012 12 17> "Ke ...

  2. [crash分析]“Kernel panic - not syncing: Aiee, killing interrupt handler”“BUG: scheduling while atomic“

    crash的直接提示信息"Kernel panic - not syncing: Aiee, killing interrupt handler!",不太常见.crash栈也没太多 ...

  3. [crash分析]Kernel panic - not syncing: Aiee, killing interrupt handler!

    公司产品升级后,测试发现下发某个配置失败时会导致系统crash. crash查看栈显示如下,没有有用信息. crash> bt PID: 3348 TASK: ffff880175034e70 ...

  4. linux oops产生原理,kernel panic , Oops 等cpu异常的分析与定位

    一.kernel panic 二.mips异常机制 三.linuxkernel 对mips异常的处理 四.kernel panic 实例分析 Kernel  panic 内核代码,相比用户层代码更难以 ...

  5. Linux kernel Panic后自动重启机器的设置

    Linux kernel Panic后自动重启机器的设置 方法1:内核配置命令行加入这句,崩溃后3秒重启: panic=3 make menuconfig 设置kernel系统参数: 方法2: vi ...

  6. Linux kernel panic 问题解决方案

    ===================================================== arm linux系统启动相关文章列表: arm linux系统启动流程 http://bl ...

  7. Kernel Panic 介绍

    https://wiki.deepin.org/?title=Linux_kernel_panic 简介 内核错误就像名字所暗示的那样,它表示Linux kernel走到了一个不知道该怎么走下一步的状 ...

  8. Linux kernel panic问题解决方法

    kernel panic错误表现 kernel panic 主要有以下几个出错提示: Kernel panic-not syncing fatal exception in interrupt ker ...

  9. Linux kernel panic解决方法

    Linux kernel panic解决方法 kernel panic错误表现 kernel panic 主要有以下几个出错提示: Kernel panic-not syncing fatal exc ...

  10. Linux内核Kernel panic常见问题(详细)总结

    目录 一.简介 1.1 hard panic 1.2 soft panic 二.常见问题 2.1 源码分析 2.2 硬件问题 2.3 系统过热 2.4 文件系统引起 2.5 内核更新 2.6 处理pa ...

最新文章

  1. SSH框架整合(代码加文字解释)
  2. figma导出android切图,谁再说Figma没办法导出标注和切图,你把这个插件转发给他...
  3. MyBatis中针对if-test的参数为指定值的xml写法
  4. HTTP 状态码常用对照表
  5. 单体系统如何拆分为微服务
  6. matlab求递归问题,matlab利用递归求解差分方程
  7. centos7 vsftpd默认端口修改
  8. [互联网]互联网公司的种类
  9. 企业SOA平台 JBoss SOA
  10. 操作系统-信号量机制;用信号量机制实现进程互斥、同步、前驱关系
  11. 计算机获得超级管理员,怎么获得Win7超级管理员权限
  12. 京东,想说爱你,并不容易!
  13. 连接git仓库失败解决办法
  14. 《水浒传》读后(5) 其它人物
  15. vue实现动态添加表单
  16. 英雄联盟 LCUAPI
  17. 图形图像处理案例3——爱心螺旋画,双心螺旋画
  18. selvert 小解
  19. 金融科技大数据产品推荐:百融信贷决策审批系统
  20. 使用pandas库读取数据

热门文章

  1. 华为首款鸿蒙平板发布,华为MatePad Pro发布亮相!华为首款鸿蒙平板全新体验!...
  2. 嵌入式开发培训多长时间?嵌入式课程怎么学?
  3. 2203-python跳转,窗口图标,提示框,消息盒子
  4. 流媒体播放器VLC media player
  5. Android重力感应器入门介绍
  6. 五 常见的计算机故障有哪些,六大常见的电脑故障原因
  7. 骇客基础知识:第3部分
  8. Ubuntu安装bluefish2.0.最新版本方法
  9. 《Celeste》 开发者是如何精心制作“冲刺”的
  10. 生活娱乐 如何像印度人学英语