在Unix系统下,应用程序崩溃,一般会产生core文件,如何根据core文件查找问题的所在,并做相应的分析和调试,是非常重要的。
1.core文件的简单介绍
Core的意思是内存, Dump的意思是扔出来, 堆出来.开发和使用Unix程序时, 有时程序莫名其妙的down了, 却没有任何的提示(有时候会提示core dumped). 这时候可以查看一下有没有形如core.进程号的
文件生成, 这个文件便是操作系统把程序down掉时的内存内容扔出来生成的, 它可以做为调试程序的参考.
core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core dump.
//---------------------------------------------------------------
在一个程序崩溃时,它一般会在指定目录下生成一个core文件。core文件仅仅是一个内存映象(同时加上调试信息),主要是用来调试的。
//---------------------------------------------------------------
2. 开启或关闭core文件的生成
//---------------------------------------------------------------
用以下命令来阻止系统生成core文件:
ulimit -c 0
下面的命令可以检查生成core文件的选项是否打开
ulimit -a
该命令将显示所有的用户定制,其中选项-a代表“all”。如果没有打开 输入ulimit -c 1
也可以修改系统文件来调整core选项
在/etc/profile通常会有这样一句话来禁止产生core文件,通常这种设置是合理的:
# No core files by default
ulimit -S -c 0 > /dev/null2>&1
但是在开发过程中有时为了调试问题,还是需要在特定的用户环境下打开core文件产生的设置
在用户的~/.bash_profile里加上 ulimit -c unlimited来让特定的用户可以产生core文件
如果ulimit -c 0 则也是禁止产生core文件,而ulimit -c1024则限制产生的core文件的大小不能超过1024kb
//---------------------------------------------------------------
3. 设置Core Dump的核心转储文件目录和命名规则
//---------------------------------------------------------------
/proc/sys/kernel/core_uses_pid可以控制产生的core文件的文件名中是否添加pid作为扩展,如果添加则文件内容为1,否则为0
proc/sys/kernel/core_pattern可以设置格式化的core文件保存位置或文件名,比如原来文件内容是core-%e
可以这样修改:
echo "/corefile/core-%e-%p-%t" >core_pattern
将会控制所产生的core文件会存放到/corefile目录下,产生的文件名为core-命令名-pid-时间戳
以下是参数列表:
%p - insertpid into filename 添加pid
%u - insertcurrent uid into filename 添加当前uid
%g - insertcurrent gid into filename 添加当前gid
%s - insertsignal that caused the coredump into the filename添加导致产生core的信号
%t - insertUNIX time that the coredump occurred into filename添加core文件生成时的unix时间
%h - inserthostname where the coredump happened into filename添加主机名
%e - insertcoredumping executable name into filename 添加命令名
//---------------------------------------------------------------
4. 写一个 带崩溃啊的程序
//---------------------------------------------------------------
#include <iostream>
using namespace std;
int main(int argc, char *argv[]) {
char *aa=(char *)1;
cout << "aa" <<aa<< endl;
return 0;
}
编译 g++ -g core.cc,运行a.out 产生core dump
//---------------------------------------------------------------
5. 使用 gdb 调试core文件
//---------------------------------------------------------------
在core文件所在目录下键入:
gdb -c core
它会启动GNU的调试器,来调试core文件,并且会显示生成此core文件的程序名,中止此程序的信号等等
如果你已经知道是由什么程序生成此core文件的,比如MyServer崩溃了生成core.12345,那么用此指令调试:
gdb -c core MyServer
以下怎么办就该去学习gdb的使用了
//---------------------------------------------------------------
6 调试命令
//---------------------------------------------------------------
然后输入bt或者where找到错误发生的位置和相应的堆栈信息。就可知道发生错误时的函数调用关系,然后可以使用up或者down查看上一条和下一条具体详细信息。这样便能对问题进行大概定位,然后看
源代码,进行分析。
Q7VLinux联
//---------------------------------------------------------------
7. 一个小方法来测试产生core文件
//---------------------------------------------------------------
直接输入指令:
kill -s SIGSEGV $$
1.core文件的简单介绍
Core的意思是内存, Dump的意思是扔出来, 堆出来.开发和使用Unix程序时, 有时程序莫名其妙的down了, 却没有任何的提示(有时候会提示core dumped). 这时候可以查看一下有没有形如core.进程号的
文件生成, 这个文件便是操作系统把程序down掉时的内存内容扔出来生成的, 它可以做为调试程序的参考.
core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core dump.
//---------------------------------------------------------------
在一个程序崩溃时,它一般会在指定目录下生成一个core文件。core文件仅仅是一个内存映象(同时加上调试信息),主要是用来调试的。
//---------------------------------------------------------------
2. 开启或关闭core文件的生成
//---------------------------------------------------------------
用以下命令来阻止系统生成core文件:
ulimit -c 0
下面的命令可以检查生成core文件的选项是否打开
ulimit -a
该命令将显示所有的用户定制,其中选项-a代表“all”。如果没有打开 输入ulimit -c 1
也可以修改系统文件来调整core选项
在/etc/profile通常会有这样一句话来禁止产生core文件,通常这种设置是合理的:
# No core files by default
ulimit -S -c 0 > /dev/null2>&1
但是在开发过程中有时为了调试问题,还是需要在特定的用户环境下打开core文件产生的设置
在用户的~/.bash_profile里加上 ulimit -c unlimited来让特定的用户可以产生core文件
如果ulimit -c 0 则也是禁止产生core文件,而ulimit -c1024则限制产生的core文件的大小不能超过1024kb
//---------------------------------------------------------------
3. 设置Core Dump的核心转储文件目录和命名规则
//---------------------------------------------------------------
/proc/sys/kernel/core_uses_pid可以控制产生的core文件的文件名中是否添加pid作为扩展,如果添加则文件内容为1,否则为0
proc/sys/kernel/core_pattern可以设置格式化的core文件保存位置或文件名,比如原来文件内容是core-%e
可以这样修改:
echo "/corefile/core-%e-%p-%t" >core_pattern
将会控制所产生的core文件会存放到/corefile目录下,产生的文件名为core-命令名-pid-时间戳
以下是参数列表:
%p - insertpid into filename 添加pid
%u - insertcurrent uid into filename 添加当前uid
%g - insertcurrent gid into filename 添加当前gid
%s - insertsignal that caused the coredump into the filename添加导致产生core的信号
%t - insertUNIX time that the coredump occurred into filename添加core文件生成时的unix时间
%h - inserthostname where the coredump happened into filename添加主机名
%e - insertcoredumping executable name into filename 添加命令名
//---------------------------------------------------------------
4. 写一个 带崩溃啊的程序
//---------------------------------------------------------------
#include <iostream>
using namespace std;
int main(int argc, char *argv[]) {
char *aa=(char *)1;
cout << "aa" <<aa<< endl;
return 0;
}
编译 g++ -g core.cc,运行a.out 产生core dump
//---------------------------------------------------------------
5. 使用 gdb 调试core文件
//---------------------------------------------------------------
在core文件所在目录下键入:
gdb -c core
它会启动GNU的调试器,来调试core文件,并且会显示生成此core文件的程序名,中止此程序的信号等等
如果你已经知道是由什么程序生成此core文件的,比如MyServer崩溃了生成core.12345,那么用此指令调试:
gdb -c core MyServer
以下怎么办就该去学习gdb的使用了
//---------------------------------------------------------------
6 调试命令
//---------------------------------------------------------------
然后输入bt或者where找到错误发生的位置和相应的堆栈信息。就可知道发生错误时的函数调用关系,然后可以使用up或者down查看上一条和下一条具体详细信息。这样便能对问题进行大概定位,然后看
源代码,进行分析。
Q7VLinux联
//---------------------------------------------------------------
7. 一个小方法来测试产生core文件
//---------------------------------------------------------------
直接输入指令:
kill -s SIGSEGV $$