程序异常推出时,内核会生成一个core文件(是内存映像以及调试信息)。可以通过使用gdb来查看core文件,指示出导致程序出错的代码所在的文件和行数。

1、查看系统中core文件生成的开关是否打开

1)使用ulimit -c命令可查看core文件的生成开关,若结果为0,则便是关闭了此功能,不会生成core文件。

2、设置core文件生成

1)使用命令ulimit -c filesize命令

若ulimit -c unlimited 则标识此core文件的大小不受限制

若指定filesize,如果生成的信息超过此大小,将会被裁剪,最终生成一个不完整的core文件,在调

试此core文件时,gdb会提示错误。

2)但是若想整个系统中生效则在shell里面设置是不行的,方法如下:

(1)编辑/root/.bash_profile文件,在其中加入ulitmit -S -c unlimited

(2)source /root/.bash_profile

3、core文件的设置

1)/proc/sys/kernel/core_uses_pid可以控制core文件的问价名是否添加PID作为扩展,文件的内容为1,

标识添加PID作为扩展,生成的core文件格式为core.XXXX;为0则表示生成的core文件统一命名为

core;可通过一下命令修改此文件:

echo "1" > /proc/sys/kernel/core_uses_pid

2)core文件的保存位置和文件名格式

echo "/corefile/core-%e-%p-%t" > core_pattern,可以将core文件统一生成到/corefile目录

下,产生的文件名为core-命令名-pid-时间戳

以下是参数列表:

%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 添加命令名

3.core文件的查看

core文件需要使用gdb来查看。

gdb ./a.out

core-file core.xxxx

使用bt命令即可看到程序出错的地方。

以下两种命令方式具有相同的效果,但是在有些环境下不生效,所以推荐使用上面的命令。

1)gdb -core=core.xxxx

file ./a.out

bt

2)gdb -c core.xxxx

file ./a.out

bt

也可以通过gdb 程序名 core文件名

如:gdb test core.8482

然后通过bt或者where查看程序崩溃时的堆栈信息

注意:在编译程序的时候要加入选项-g。

在linux环境下调试多线程,总觉得不像.NET那么方便。这几天就为找一个死锁的bug折腾好久,介绍一下用过的方法吧。

多线程如果dump,多为段错误,一般都涉及内存非法读写。可以这样处理,使用下面的命令打开系统开关,让其可以在死掉的时候生成core文件。

ulimit -c unlimited

这样的话死掉的时候就可以在当前目录看到core.pid(pid为进程号)的文件。接着使用gdb:

gdb ./bin ./core.pid

进去后,使用bt查看死掉时栈的情况,在使用frame命令。

还有就是里面某个线程停住,也没死,这种情况一般就是死锁或者涉及消息接受的超时问题(听人说的,没有遇到过)。遇到这种情况,可以使用:

gcore pid(调试进程的pid号)

手动生成core文件,在使用pstack(linux下好像不好使)查看堆栈的情况。如果都看不出来,就仔细查看代码,看看是不是在if,return,break,continue这种语句操作是忘记解锁,还有嵌套锁的问题,都需要分析清楚了。

最后,说一句,静心看代码,捶胸顿足是没有用的。

---------------------------------------------------------------

使用C/C++语言开发程序时,当程序crash的时候产生core dump文件对于调试程序是很有帮助的。在Redhat Linux系统中默认是不生成core dump文件的,这是因为在/etc/profile文件中有这样一行

ulimit -S -c 0 > /dev/null 2>&1

如何打开core dump呢?最简单的方法是用户在自己的~/.bash_profile中加入ulimit -S -c unlimited > /dev/null 2>&1,这样设置后允许当前用户生成没有大小限制的core dump文件。此外还有两种系统级修改生成core dump的方法。

第一种方法是修改/etc/profile,把ulimit那一行改为

ulimit -S -c unlimited > /dev/null 2>&1

这样设置后系统允许所有用户生成没有大小限制的core dump文件。这样做的优点是不需要重起系统,缺点是无法控制只让某些用户生成core dump文件。

第二种方法是修改/etc/security/limits.conf文件。很多系统上限都可以通过修改这个文件改变,如最大子进程个数,最大打开文件数等等。这个文件有详细的注释,对如何修改这个文件做了说明。如果想对所有用户打开core dump,可以加入一行

* soft core 0

如果只想对某些用户或用户组打开core dump,可以加入

user soft core 0或@group soft core 0

注意如果通过修改/etc/security/limits.conf文件打开core dump,还需要注释掉/etc/profile中的ulmit那一行

#ulimit -S -c 0 > /dev/null 2>&1

这样修改的优点是可以针对特定用户或特定组打开core dump文件,缺点是需要重起系统。

最后说一下生成core dump文件的位置,默认位置与可执行程序在同一目录下,文件名是core.***,其中***是一个数字。core dump文件名的模式保存在/proc/sys/kernel/core_pattern中,缺省值是core。通过以下命令可以更改core dump文件的位置(如希望生成到/tmp/cores目录下)

echo "/tmp/cores/core" > /proc/sys/kernel/core_pattern

linux打开core文件,[转载]linux下core文件设置与查看相关推荐

  1. Linux和Windows的遍历目录下所有文件的方法对比

    首先两者读取所有文件的方法都是采用迭代的方式,首先用函数A的返回值判断目录下是否有文件,然后返回值合法则在循环中用函数B直到函数B的返回值不合法为止.最后用函数C释放资源. 1.打开目录 #inclu ...

  2. linux空间支持伪静态,[转载]Linux下nginx支持.htaccess文件实现伪静态的方法

    方法如下: 1. 在需要使用.htaccess文件的目录下新建一个.htaccess文件, 如本人的一个Discuz论坛目录: vim /var/www/html/168pc/bbs/.htacces ...

  3. [Linux] Linux 客户端NFS挂载后目录下中文名文件乱码

    0x0 场景 服务端:Windows 2008R2 NFS共享目录D:/TEST 客户端:Linux/Centos 7.5 Centos 7.5 客户端NFS挂载 Windows2008R2 共享目录 ...

  4. linux spool目录 删除,Linux知识:/var/spool/clientmqueue 下垃圾文件删除

    Linux操作系统中的/var/spool/clientmqueue/目录下存在大量文件. 原因分析:系统中有用户开启了 cron,而cron中执行的程序有输出内容,输出内容会以邮件形式发给cron的 ...

  5. linux批量下载数据,[转载]linux shell批量下载IGS或CORS网FTP数据

    最近用迅雷FTP探测器下载数据,下载好之后发现漏下了好多数据,所以使用linux wget命令来实现FTP数据批量下载 关于wget命令可以 用wget --help 查看帮助,简单说明一下: wge ...

  6. linux打开端口_在Linux上打开端口

    linux打开端口 Before we learn about opening a port on Linux, let's understand what network ports are. A ...

  7. cmd如何打开某一盘符下的文件

    方法一: 在Win+R运行框里输入com,就可以直接进入到控制台 就比如你进入D盘下 查看D盘下的目录输入dir可以查看D盘下的文件 打开D盘的某个文件即输入cd 文件夹名字即可 方法二: 进入我的电 ...

  8. linux打开word乱码,解决linux下openoffice word文件转PDF中文乱码的问题

    网上很多介绍是由于jdk中的没有字体导致乱码,而我遇到的是转换过程并未报错,但转换后的PDF中是乱码,尝试在jre/lib/fonts/中增加字体,还是不能解决问题,因此可以判断非jre字体问题,是l ...

  9. 查看linux驱动使用的头文件,[转载]linux下usb驱动头文件的usb.h(二)

    #define URB_NO_FSBR 0x0020 /* UHCI-specific */ #define URB_ZERO_PACKET 0x0040 /* 完成大块分解成小包输出 #define ...

最新文章

  1. centos6一键安装vsftpd脚本
  2. maven 笔记,概念
  3. java8函数式编程 视频_快速掌握Java8 Stream函数式编程技巧
  4. android SQLite查询并显示用户输入的选择信息
  5. tensor也可以作为索引
  6. 从数据仓库系统对比看Hive发展前景
  7. 实践篇(1)--QPG之“打狗棍法”
  8. c语言中的makefile编写步骤详解
  9. 基于python的图像处理的毕业论文_图像处理毕业论文 精品
  10. 江天数据220kV变电站开建 实现更高电能质量和电力可靠性
  11. 此时墨迹在计算机上不起作用,win7系统自带截图工具不见了怎么找回
  12. 国外3个设计师插画等必备PNG免扣素材网站分享
  13. unity算法-斜抛运动(变种)
  14. 1004. 伊甸园日历游戏
  15. 有赞实时数仓建设实践与经验
  16. 2022年第七届IEEE云计算与大数据分析国际会议
  17. SFDC common errors
  18. 阿里云中mysql数据库被攻击了,最终数据找回来了
  19. 2022国赛中职网搭 windows组策略
  20. 微信小程序支付功能用服务器吗,微信小程序 支付功能 服务器端(TP5.1)实现...

热门文章

  1. CCNA之单臂路由实验
  2. 【学习记录】第一章 数据库设计-《SQL Server数据库设计和开发基础篇视频课程》...
  3. SSIS - 7.发邮件任务
  4. 大数据时代了解一些问题
  5. 内存管理, 对象的生命周期
  6. 2016年1月20日总结
  7. 冬季宝宝不着凉有绝招
  8. Kotlin协程入门初级篇
  9. Ubuntu 11.04下编译kernel
  10. 软考信息系统项目管理师_管理科学(运筹学)---软考高级之信息系统项目管理师033