1.需求的产生
写程序难免会出现段错误的情况,这时候很想知道,到底在什么地方崩溃了,对于代码很少,或者你很有把握的时候,或许用二分法配合printf就可以搞定了;而对于非常复杂的代码,比如像Xserver这样的程序,可能就不太好定位了;
(本文讨论的情况都是针对arm环境,并且gdb不方便使用的情况)
2. 解决思路
思路其实很简单,对于用户态段错误的原因,大约可以分为两种,
a) 没有权限访问这个地址;
b) 访问的地址没有映射,比如NULL地址;
当出现这两种情况的时候,linux内核都会向用户态的程序发送SIGSEGV的信号,于是程序执行默认的信号处理函数,就退出了;
所以有两个解决办法:
A) 在内核里面把这些寄存器打印出来;
B) 在上层程序里面把寄存器打印出来;
下面来分别说明:
3. 内核信息打印
内核的执行路径如下:

我们只需要在__do_user_fault的时候把打印信息打开就可以了,如下:
#ifdef CONFIG_DEBUG_USER
if (user_debug & UDBG_SEGV) {
printk(KERN_DEBUG "%s: unhandled page fault (%d) at 0x%08lx, code 0x%03x\n",
tsk->comm, sig, addr, fsr);
show_pte(tsk->mm, addr);
show_regs(regs);
}
#endi

本文针对ARM环境且GDB不便使用的情况,探讨复杂代码段错误的定位方法。用户态段错误原因主要有两种,对应内核和上层程序两种解决办法,分别介绍了内核信息和用户态信息的打印方法,并对输出信息进行分析,最后给出使用注意事项。
最低0.47元/天 解锁文章
718

被折叠的 条评论
为什么被折叠?



