概述
1.生成core文件的设置
首先,linux下默认不生成core文件。
使用使用ulimit -c
命令可查看core文件的生成开关,如果为0则表示关闭此功能。
使用ulimit -c filesize
命令,可以限制core文件的大小(filesize的单位为kbyte)。
使用ulimit -c unlimited
,则表示core文件的大小不受限制。
有以下三种方法可以生成core文件:
1.永久生成core问件。将ulimit -c unlimited
写进系统配置里,即在/etc/profile
里面加上上述命令,这样重启后生效了。或者使用source命令使之马上生效。source /etc/profile
2.只在当前终端里打开。cd到程序目录,输入ulimit -c unlimited
,然后进行编译,也可以生成生成core文件。
3.在程序里使用setrlimit
函数设置生成core文件。包含#include<sys/resource.h>
,然后在程序里加上如下代码也可以生成core文件。
struct rlimit limit;
limit.rlim_cur = RLIM_INFINITY;
limit.rlim_max = RLIM_INFINITY;
if(setrlimit(RLIMIT_CORE, &limit))
{
cout<<"set limit failed/n"<<endl;
}
2. Core文件路径设置
第一次通过setrlimit函数设置core文件可生成后,程序崩溃后可执行文件所在目录并没有core文件,后来发现是我的core文件生成路径的问题,于是我在home/zh目录下新建了一个coredump文件夹,并使用如下命令设置它为core文件生成目录:
echo /home/zh/coredump/core.%e.%p> /proc/sys/kernel/core_pattern
生成的core文件会放在/home/zh/coredump
目录,core.%e.%p
是core文件的命名,%e和%p是参数,含义如下:
参数 | 含义 |
---|---|
%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. 编译链接程序,并执行可执行文件
如图3-1所示,程序有一个warning,执行后产生了段错误
4. 查看core文件
如图4-1所示,cd到coredumo文件下,使用ls查看文件,可以看到生成的core文件,将可执行文件拷到该路径下,如图4-2所示,便可以开始调试。
5. 开始调试
(1) 使用gdb test core.test.3984
开始调试,如图5-1所示,显示testcore.cpp的11行出错。
(2) 使用bt查看堆栈信息,如图5-2所示,显示了两层堆栈信息,因为在main函数中我只调用了test函数,因此只有它们的堆栈信息。
(3) 使用where命令可以看到具体的出错位置,如图5-3所示。
(4) 使用f(n)命令切换堆栈的层数,如图5-4所示,f(1)会显示出第一层的堆栈信息,即main函数,因为只有2层,所以f(2)没有信息。
(5) 最后,可以打印出变量的值,如图5-5所示,print p 命令会显示p变量的信息。
6.测试代码
#include <iostream>
#include <stdio.h>
#include<sys/time.h>
#include<sys/resource.h>
#include<unistd.h>
using namespace std;
void test()
{
char* p="zhanghan";
p[3]='w';
cout<<*p<<endl;
}
int main()
{
struct rlimit limit;
limit.rlim_cur = RLIM_INFINITY;
limit.rlim_max = RLIM_INFINITY;
if(setrlimit(RLIMIT_CORE, &limit))
{
cout<<"set limit failed/n"<<endl;
}
test();
return 0;
}
最后
以上就是落寞茉莉为你收集整理的core文件生成及使用gdb调试的全部内容,希望文章能够帮你解决core文件生成及使用gdb调试所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复