我是靠谱客的博主 落寞茉莉,最近开发中收集的这篇文章主要介绍core文件生成及使用gdb调试,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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是参数,含义如下:

参数含义
%pinsert pid into filename 添加 pid
%uinsert current uid into filename 添加当前 uid
%ginsert current gid into filename 添加当前 gid
%sinsert signal that caused the coredump into the filename 添加导致产生 core 的信号
%tinsert UNIX time that the coredump occurred into filename 添加 core 文件生成时的 unix 时间
%hinsert hostname where the coredump happened into filename 添加主机名
%einsert coredumping executable name into filename 添加命令名

3. 编译链接程序,并执行可执行文件

       如图3-1所示,程序有一个warning,执行后产生了段错误
图3-1

4. 查看core文件

       如图4-1所示,cd到coredumo文件下,使用ls查看文件,可以看到生成的core文件,将可执行文件拷到该路径下,如图4-2所示,便可以开始调试。
图4-1
图4-2

5. 开始调试

(1) 使用gdb test core.test.3984开始调试,如图5-1所示,显示testcore.cpp的11行出错。
图5-1
(2) 使用bt查看堆栈信息,如图5-2所示,显示了两层堆栈信息,因为在main函数中我只调用了test函数,因此只有它们的堆栈信息。
图5-2
(3) 使用where命令可以看到具体的出错位置,如图5-3所示。
图5-3
(4) 使用f(n)命令切换堆栈的层数,如图5-4所示,f(1)会显示出第一层的堆栈信息,即main函数,因为只有2层,所以f(2)没有信息。
图5-4
(5) 最后,可以打印出变量的值,如图5-5所示,print p 命令会显示p变量的信息。
图5-5

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调试所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(37)

评论列表共有 0 条评论

立即
投稿
返回
顶部