linux 调试系列(一)coredump环境配置

一、背景

linux 环境(嵌入式linux)下程序开发,遇到段错误等各种程序崩溃的情况,常用的调试手段是加打印模块逐步测试,在遇到非常大的工程,函数调用层次很深,非常多线程时候,这个手段就不好使了。
这个时候就可以使用coredump调试,当程序异常退出(发生段错误)时,会产生一个core文件,该文件记录了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息还有各种函数调用堆栈信息等,我们可以理解为是程序工作当前状态存储生成的一个文件,通过工具分析这个文件,我们可以定位到程序异常退出的时候对应的堆栈调用等信息,找出问题所在并进行及时解决。

Core就是内存的意思,这个词源自很早以前制造内存的材料,一直延用到现在,当程序运行过程中检测到异常程序异常退出时, 系统把程序当前的内存状况存储在一个core文件中, 叫core dumped,也就信息转储,操作系统检测到当前进程异常时将通过信号的方式通知目标进程相应的错误信息,常见的信号有SIGSEGV,SIGBUS等,默认情况下进程接收到相应的信号都有相应的处理机制。

二、打开coredump抓取功能

1. 查询配置

系统默认情况下,coredump一般都是关闭状态

  • 查询core文件小
$ $ ulimit -a | grep core
core file size          (blocks, -c) 0

core file size = 0表示coredump文件大小为零。

  • 查询coredump文件默认保存路径
$ cat /proc/sys/kernel/core_pattern
|/usr/share/apport/apport %p %s %c %d %P %E
//第二种方式
$ /sbin/sysctl kernel.core_pattern

默认Ubuntu有个错误上报服务,关掉并去掉自启

sudo service apport stop
sudo systemctl disable apport.service

2.临时打开

/* 将core文件大小设置为不限大小 */
ulimit  -c unlimited 

/* 设置core文件保存路径, 建议设置成程序运行同一目录 */
echo $PWD/core.%e.%p> /proc/sys/kernel/core_pattern
/* ps: 如果权限不允许,请先sudo -i切换到root用户 */

上条命令指定了程序名的,pid。
core文件命名规则:
%p 转储过程的PID
%u (数字)转储进程的实际UID
%G (数字)转储过程的实际GID
%s 引起转储的信号数
%t 转储时间,表示为自1970年1月1日00:00:00 +0000(UTC)以来的秒数
%H 主机名(与uname(2)返回的节点名相同)
%e 可执行文件名(无路径前缀)
%E 可执行文件的路径名,用斜杠(’/’)替换为感叹号(’!’)。
%C 崩溃过程的核心文件大小软资源限制(自Linux 2.6.24开始)

3.永久打开

如有需要,调试机可以设置为常开。

  • core文件大小配置
    打开/etc/security/limits.conf文件跳到末尾,去掉#* soft core unlimited前面注释#,改为不限大小。
$ vi /etc/security/limits.conf
 -               soft    core             unlimited
  • core文件路径配置
    找一个空间大的地方建一个core文件存放目录(core_file)。
/sbin/sysctl -w kernel.core_pattern=/XXX/core_file/%e.core.%p
//或者/etc/profile加一行
echo /XXX/core_file/core.%e.%p> /proc/sys/kernel/core_pattern

三、调试

经过上面操作,当程序挂掉的时候,就能在相应目录看到coredump文件了。
下一节详细讲调试。

参考

《Linux 下Coredump分析与配置》
《Linux下 生成coredump文件》

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值