免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2437 | 回复: 2
打印 上一主题 下一主题

[其他] [空指针]如何debug? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-09-30 09:25 |只看该作者 |倒序浏览
经常会碰到空指针,又没有dump_stack 信息,那如何从SP 指针处的内存内容中着手debug呢?
请高手指教!!!

如下: SP 寄存器的内容是 0xde881ff8, 而 从0xde881f78开始处的内容有印出来,能否根据这些information 找到空指针的位置呢?

[   72.016245] [5] Unable to handle kernel NULL pointer dereference at virtual address 00000000
[   72.024411] [5] pgd = ddf64000
[   72.027362] [5] [00000000] *pgd=3e366831, *pte=00000000, *ppte=00000000
[   72.033964] [5] Internal error: Oops: 80000007 [#1] PREEMPT SMP ARM
[   72.040250] [5] Modules linked in:
[   72.043594] [5] CPU: 5    Not tainted  (3.4.39-svn40 #9)
[   72.048932] [5] PC is at 0x0
[   72.051750] [5] LR is at 0x0
[   72.054616] [5] pc : [<00000000>]    lr : [<00000000>]    psr: 00000013
[   72.054622] [5] sp : de881ff8  ip : 00000000  fp : 00000000
[   72.066767] [5] r10: 00000000  r9 : 00000000  r8 : 00000000
[   72.072366] [5] r7 : 00000000  r6 : 00000000  r5 : 00000000  r4 : 00000000
[   72.079179] [5] r3 : 00000000  r2 : 00000000  r1 : 00000000  r0 : 00000000
[   72.086083] [5] Flags: nzcv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment user
[   72.093550] [5] Control: 10c5387d  Table: 3df6406a  DAC: 00000015
[   72.099578] [5] CPU 1 / CLUSTER 0
[   72.102920] [5] DFSR: 00000017, ADFSR: 00000000, IFSR: 00000007, AIFSR: 00000000
[   72.110254] [5] CPUMERRSR: 00000000_00000000, L2MERRSR: 00000000_00000000
[   72.117071] [5] CPUFREQ: 1200000 KHz
[   72.120583] [5]
[   72.120586] [5] SP: 0xde881f78:
[   72.125573] [5] 1f78  c07cc2b8 c081b958 de881f9c de881f90 c05a41ec c0012e6c 00000000 00000013
[   72.134037] [5] 1f98  ffffffff de881fe4 00000000 de881fb0 c000ecf8 c0008448 00000000 00000000
[   72.142543] [5] 1fb8  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

论坛徽章:
0
2 [报告]
发表于 2014-09-30 16:05 |只看该作者
使用addr2line工具:将函数地址解析为函数名

Addr2line 工具(它是标准的 GNU Binutils 中的一部分)是一个可以将指令的地址和可执行映像转换成文件名、函数名和源代码行数的工具。这种功能对于将跟踪地址转换成更有意义的内容来说简直是太棒了。………………具体就不介绍了

针对你的问题,在源码目录下,输入:addr2line -e vmlinux的路径 0xde881ff8

我是雷锋,不用感谢!

论坛徽章:
0
3 [报告]
发表于 2014-10-02 19:11 |只看该作者
非常感谢,此处stack 信息完全被**了,所以arm-eabi-addr2line没有太多的参考价值。

只好通过新旧版本分别try run对比,发现问题点在arch/arm/kernel/sys_arm.c 中的 kernel_execve()@linux3.4.39


    /*
     * We were successful.  We won't be returning to our caller, but
     * instead to user space by manipulating the kernel stack.
     */
    asm(    "add    r0, %0, %1\n\t"
        "mov    r1, %2\n\t"
        "mov    r2, %3\n\t"
        "bl memmove\n\t"    /* copy regs to top of stack */
        "mov    r8, #0\n\t" /* not a syscall */
        "mov    r9, %0\n\t" /* thread structure */
        "mov    sp, r0\n\t" /* reposition stack pointer */
        "b  ret_to_user"
        :
        : "r" (current_thread_info()),
          "Ir" (THREAD_START_SP - sizeof(regs)),
          "r" (&regs),
          "Ir" (sizeof(regs))
        : "r0", "r1", "r2", "r3", "r8", "r9", "ip", "lr", "memory");



arm-eabi-addr2line -e vmlinux de878540
??:0
arm-eabi-addr2line -e vmlinux c0875300
reciprocal_div.c:0
arm-eabi-addr2line -e vmlinux 00000002
??:0
arm-eabi-addr2line -e vmlinux 00000015
??:0
arm-eabi-addr2line -e vmlinux de878540
??:0
arm-eabi-addr2line -e vmlinux c1c82900
??:0
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP