前言 

最近在项目中遇到大型程序出现SIGSEGV ,一直不知道用core dump工具来调试程序,花了近一周的时间,才定位问题,老大很生气,后果很严重,呵呵,事后仔细学习了这块的知识,了解一点core dump的知识。

在使用半导体作为内存的材料前,人类是利用线圈当作内存的材料(发明者为王安),线圈就叫作core ,用线圈做的内存就叫作“core memory”。(线圈的单词应该是coil,呵呵)如今,半导体工业澎勃发展,已经没有人用线圈当内存了,不过,在许多情况下,人们还是把内存叫作“core”。 所以注意了:这里的core不是核心,而是内存。不过结合实际来看,好像也有点“内核所占内存”的意思。

core dump又是什么东东? 我们在开发(或使用)一个程序时,最怕的就是程序莫明其妙地挂掉。虽然系统没事,但我们下次仍可能遇到相同的问题。于是,这时操作系统就会把程序挂掉时的 内存内容写入一个叫做core的文件里(这个写入的动作就叫dump,dump的英语意思是垃圾、倾倒。从这里来看,这些内存的内容是程序错误运行的结果,所以算是垃圾,把他弄出来就好比从大的内存池里“倾倒”。),以便于我们调试。这个过程,因此叫做core dump.在嵌入式系统中,有时core dump直接从串口打印出来,结合objdump查找ra和epa地址,运用栈回溯,可以找到程序出错的地方。

如何产生core dump文件

在一般Linux系统中,默认是不会产生core dump文件的,通过ulimit -c来查看core dump文件的大小,一般开始是0,可以设置core文件大小,ulimit -c 1024(kbytes单位)或者ulimit -c unlimited。

core dump文件输出设置

一般默认是当前目录,可以在/proc/sys/kernel中找到core-user-pid,通过

1.使core文件名加上pid号

echo "1" > /proc/sys/kernel/core-user-pid

2.控制core文件保存位置和文件名格式

mkdir -p /root/corefileecho "/root/corefile/core-%e-%p-%t" > /proc/sys/kernel/core-pattern

  以下是参数列表:
    %p - insert pid into filename 添加pid
    %u - insert current uid into filename 添加当前uid
    %g - insert current gid into filename 添加当前gid
    %s - insert signal that caused the coredump into the filename 添加导致产生core的信号
    %t - insert UNIX time that the coredump occurred into filename 添加core文件生成时的unix时间
    %h - insert hostname where the coredump happened into filename 添加主机名
    %e - insert coredumping executable name into filename 添加命令名

用gdb查看core文件


下面我们可以在发生运行时信号引起的错误时发生core dump了.编译时加上-g
发生core dump之后, 用gdb进行查看core文件的内容, 以定位文件中引发core dump的行.

gdb [exec file] [core file]

如:

gdb ./test test.core

在进入gdb后, 用bt命令查看backtrace以检查发生程序运行到哪里, 来定位core dump的文件行.

实例讲解

//test.c

void a(){char *p = NULL;   printf("%d/n", *p);}

int main(){    a();return 0;}

编译

gcc -g -o test test.c

运行 ./test

报segmentation fault(core dump)

如果生成的是test.core.

gdb ./test test.core

转载于:https://www.cnblogs.com/ggjucheng/archive/2011/12/20/2294300.html

学会用core dump调试程序错误(转)相关推荐

  1. 学会用core dump调试程序错误

    最来在项目中遇到大型程序出现SIGSEGV ,一直不知道用core dump工具来调试程序,花了近一周的时间,才定位问题,老大很生气,后果很严重,呵呵,事后仔细学习了这块的知识,了解一点core du ...

  2. 什么是core dump linux下用core和gdb查询出现段错误的地方

    什么是core dump   linux下用core和gdb查询出现"段错误"的地方 http://blog.chinaunix.net/uid-26833883-id-31932 ...

  3. Linux下如何生成core dump 文件(解决segment fault段错误的问题)

    Linux下如何生成core dump 文件(解决segment fault段错误的问题) 参考文章: (1)Linux下如何生成core dump 文件(解决segment fault段错误的问题) ...

  4. linux下gdb使用core文件调试程序,解决“段错误核心已转储“的问题

    一.core文件介绍以及用途: 1.core文件是什么? core文件包含了程序运行时的内存状态.寄存器状态.堆栈指针.内存管理信息以及各个函数使用堆栈信息等等: 当程序运行过程中出现段错误(Segm ...

  5. 段错误调试神器 - Core Dump详解

    一.前言: 有的程序可以通过编译, 但在运行时会出现Segment fault(段错误). 这通常都是指针错误引起的. 但这不像编译错误一样会提示到文件某一行, 而是没有任何信息, 使得我们的调试变得 ...

  6. 使用gdb和core dump迅速定位段错误

    使用gdb和core dump迅速定位段错误 关键字:gdb.段错误.core dump 一.什么是core dump core:内存.核心的意思: dump:抛出,扔出: core dump:前提: ...

  7. No core dump will be written. Minidumps are not enabled by default on client versions of Windows错误

    标题:No core dump will be written. Minidumps are not enabled by default on client versions of Windows错 ...

  8. linux 捕获sigsegv信息如何生成core文件,[转]Linux下的段错误产生的原因及调试方法Core Dump...

    简而言之,产生段错误就是访问了错误的内存段,一般是你没有权限,或者根本就不存在对应的物理内存,尤其常见的是访问0地址. 一般来说,段错误就是指访问的内存超出了系统所给这个程序的内存空间,通常这个值是由 ...

  9. Core Dump核心转储

    核心转储(core dump),在汉语中有时戏称为吐核,是操作系统在进程收到某些信号而终止运行时,将此时进程地址空间的内容以及有关进程状态的其他信息写出的一个磁盘文件.这种信息往往用于调试. 概述 编 ...

最新文章

  1. linux send 失败_linux高性能网络编程之tcp连接的内存使用
  2. [转载] 数据库分析手记 —— InnoDB锁机制分析
  3. Java 程序员必备的 Intellij IDEA 插件
  4. cos html cache插件,关于Cos-Html-Cache插件不能创建首页缓存的解决办法
  5. esp32 怎么分配freertos 堆栈大小_嵌入式开发入门-从STM32CudeMX、FreeRtos、Proteu仿真开始...
  6. 【Python科学计算系列】矩阵
  7. java mvc 导出excel_Java springMVC POI 导出 EXCEL
  8. 设计灵感案例|教你图像在海报中可以如何摆放!
  9. Python中在脚本中引用其他文件函数的方法
  10. 深度强化学习之演员—评论家(Actor—Critic)
  11. 多家多平台拿走的AD封装库Altium-3D封装库+超全原理图库含51+STM32库
  12. Excel表格样式CellStyle的DataFormat可选值
  13. c语言抠图程序蓝屏,一种蓝屏抠图方法
  14. win10开机就卡死在桌面上怎么解决
  15. 再说for in循环
  16. 国内9大免费CDN汇总,除了加速乐,你还用过哪些?
  17. 【区块链技术工坊29期实录】小包总:SERO基于零知识证明的隐私保护公链解决方案
  18. java版破解淘宝客加密推广链接
  19. 复习JavaEE笔记
  20. 阿里云RPA机器人流程自动化快速入门

热门文章

  1. sql语句中的 inner join 、 left join 、 right join、 full join 的区别
  2. Git常用命令和Github协同流程
  3. tomcat环境配置
  4. 前台特效(6) 折叠栏目(动画效果)
  5. Objective-C:GCC+GNUstep配置
  6. linux下网卡安装
  7. Delphi 2009 泛型容器单元(Generics.Collections)[1]: TListT
  8. 究竟该不该“勃”!!!
  9. 互联网协议 — TCP — 拥塞控制(网络质量保障)
  10. 云原生思想 — 云原生的 DevOps