【译】ARM:如何分析DAbt异常

http://www.keil.com/support/docs/3080.htm
ARM:如何分析DAbt异常
本文信息面向:

  • 任意版本ARM

问题:
我的ARM应用无法工作。当我在软件仿真器或者JTAG调试器中运行时,我注意到程序计数器(PC/R15)跳到了 DAbt_Handler标签。问:这意味着什么?我该如何找到我程序崩溃的位置?

回答:
这是默认的Data Abort异常处理(函数)。你的应用尝试读或写某个非法的内存位置。你可以通过把R14(链接寄存器LC)的值减去8的方式计算该非法内存位置。减8可以计算指令队列中产生本异常的指令地址。如:

  • R14的值是0x0000021E
  • 0x0000021E-8=0x00000216。引发本异常的指令就在地址0x00000216处。
  • 使用Unassemble调试命令反汇编该指令。本例中,在Command窗口(菜单:View - Command Window)中键入U 0x00000216

反汇编窗口显示该地址的为指令 STRB R3,[R1,#0x00],其中R1为0x000001BC。R1中的值指向一个片上Flash区域(LPC2000),该地址不可写。在汇编窗口,在当前行右键点击选择 Show Source Code for Current Address可以显示你的源代码。大概就是一个指针加载了一个错误的地址。





PS:
PRE-FETCH ABORT发生的情况
该异常在你尝试从一个不存在的存储区执行代码时产生。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unable to handle kernel paging request at virtual address 0000000200005401 [ 21.757454] Mem abort info: [ 21.760240] ESR = 0x96000004 [ 21.763286] Exception class = DABT (current EL), IL = 32 bits [ 21.769199] SET = 0, FnV = 0 [ 21.772245] EA = 0, S1PTW = 0 [ 21.775378] Data abort info: [ 21.778250] ISV = 0, ISS = 0x00000004 [ 21.782078] CM = 0, WnR = 0 [ 21.785038] [0000000200005401] user address but active_mm is swapper [ 21.791385] Internal error: Oops: 96000004 [#2] PREEMPT SMP [ 21.796951] Modules linked in: [ 21.800002] CPU: 0 PID: 1 Comm: swapper/0 Tainted: G S D 4.19.0-4.19.9-x100-0707+ #30 [ 21.808956] Hardware name: E2000Q TESTC DDR4 Board (DT) [ 21.814175] pstate: 20000085 (nzCv daIf -PAN -UAO) [ 21.818963] pc : __kmalloc+0xe8/0x248 [ 21.822618] lr : __kmalloc+0x48/0x248 [ 21.826272] sp : ffff000008003c50 [ 21.829580] x29: ffff000008003c50 x28: 0000000000000001 [ 21.834888] x27: ffff000009911158 x26: ffff000009c267cb [ 21.840196] x25: 0000000000000000 x24: 0000000000000001 [ 21.845504] x23: 0000000000016e00 x22: ffff000008733b0c [ 21.850812] x21: 0000000000480020 x20: 0000000200005401 [ 21.856120] x19: ffff8020ff803800 x18: ffffffffffffffff [ 21.861429] x17: 0000000000001800 x16: 0000000000000000 [ 21.866737] x15: ffff000009b696c8 x14: 0720072007200720 [ 21.872044] x13: 0720072007200720 x12: 0720072007200720 [ 21.877353] x11: 0720072007200720 x10: 0000000000000040 [ 21.882660] x9 : ffff000009b84f20 x8 : ffff8020ff400248 [ 21.887968] x7 : ffff8020ff4002b8 x6 : 0000000000000048 [ 21.893276] x5 : 00008020f6425000 x4 : 0000000000000000 [ 21.898584] x3 : ffff7e0083d67e00 x2 : 00008020f6425000 [ 21.903892] x1 : 0000000000000000 x0 : 0000000000000001 [ 21.909201] Process swapper/0 (pid: 1, stack limit = 0x(____ptrval____)) [ 21.915895] Call trace: [ 21.918335] __kmalloc+0xe8/0x248 [ 21.921646] __tty_buffer_request_room+0x7c/0x148 [ 21.926344] __tty_insert_flip_char+0x28/0x80 [ 21.930696] uart_insert_char+0xd4/0x140 [ 21.934613] pl011_fifo_to_tty+0x88/0x1b8 [ 21.938616] pl011_int+0x340/0x488分析一下这段内核报错
最新发布
07-12
根据内核报错的信息,可以分析出以下情况: 1. 报错信息中提到了一个数据异常(data abort),说明尝试访问的地址出现了问题。 2. 错误发生在 `__kmalloc+0xe8/0x248` 的位置,表明在执行 `__kmalloc` 函数时出现了问题。 3. 在调用栈中,可以看到一些与终端设备(tty)有关的函数,比如 `__tty_buffer_request_room`、`__tty_insert_flip_char`、`uart_insert_char` 和 `pl011_fifo_to_tty`。 根据这些分析,可能的原因和解决方法如下: 1. 可能是在终端设备相关的代码中,发生了内存分配错误。可能是由于分配超过了可用的地址空间或者分配大小超过了系统内存限制。 2. 可能是在终端设备的数据传输过程中,尝试访问了一个无效的地址。 3. 可能是与终端设备驱动程序相关的 bug 或者配置错误导致的问题。 为了进一步分析和解决这个问题,你可以尝试以下几个步骤: 1. 检查终端设备相关的代码,确保内存分配和地址访问的逻辑正确,并且没有超出系统限制的情况。 2. 检查终端设备驱动程序的配置和参数是否正确。 3. 查看系统日志中是否有其他相关的错误或警告信息。 4. 尝试使用调试工具,如 `kgdb` 或 `kdump`,对内核进行调试,以了解更多关于问题发生的上下文和原因。 希望以上信息对你有帮助,如果需要更详细的分析和解决方案,请提供更多的代码和上下文信息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值