Coredump是Linux下的一种调试非常方便的机制,当服务运行故障时,可以将运行状态、内存、CPU寄存器等信息进行快照留存,使用GDB能轻松知道出现问题时服务的状态情况。在OpenWrt上使用也挺简单
busybox编译配置
base system->busybox->configuration->init utiltiles

kernel配置
general setup -> configure standard kernel feature

打开GDB
Utilities

这样既可编译出支持coredump以及包含gdb的固件,当固件起来后需要进行coredump的使能
root@OpenWrt:~# touch /.init_enable_coreroot@OpenWrt:~# sysctl -w "kernel.core_pattern=/tmp/%e.%p.%s.%t.core"kernel.core_pattern = /tmp/%e.%p.%s.%t.coreroot@OpenWrt:~# ulimit -c unlimited
%e:进程可执行文件名
%p:进程PID
%s:信号号
%t:时间,从1970-01-01 零点零分零秒到当时的秒数
测试

测试程序对空指针赋值,一定产生内存访问错误

使用gdb进行调试
gdb 可执行文件 core文件

在进程编译时有-g选项的情况下可以直接打出对应的函数位置
思考
通过上面的测试可以发现,coredump能够很方便的对运行时出问题的状态进行调试,不过,同时也存在一个问题,core文件会随着进程对内存使用的增大而增加,对于小存储空间的设备是个问题。
上面才几条语句的测试程序产生的core文件已达200K,主要还是源自于对内存状态的保存。而对于程序调试来说,最关键信息是CPU关键寄存器以及栈的回溯情况,因此,对于小存储空间的设备可以考虑实现一个简单的core,如同内核的dump stack一样。
要实现dump stack需要对当前所使用的体系结构有所了解,在无线路由固件里,mips体系架构较为主流,后面有机会的话进行mips下进程dump stack实现的分享
文章转载自han码录,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




