当前在Linux环境开发中gdb是经常使用到的工具,在进行代码调试,以及出现异常退出对于core文件的调试有很大的帮助。
1、介绍core文件
core文件的作用:当程序异常退出时,会在指定的目录下生成一个core文件,core文件是当时内存的一个映像,通过则个可以对当时环境进行分析。
Linux命令行下core文件的查看:在Linux环境下可以通过ulimit查看当前的core文件是否开启:ulimit -a 来进行查看
Linux命令行下core文件的大小设置:通ulimit -c 来指定core文件的大小,如果超过这个大小的core文件将产生不了。此设定只是在当前窗口环境下有效,在其他窗口环境下会失效掉。
Linux命令行下core文件的存储目录:默认情况下不指定的情况下,core文件是产生在奔溃程序的相应目录下。
程序中通过getrlimit和setrlimit两个命令中,指定资源为RLIMIT_CORE来进行core文件的设定。在core文件设定时通过转换目录到指定目录下把core文件产生在指定的目录下。
2、产生core文件
代码:core.c
-
#include <stdio.h>
-
#include <unistd.h>
-
#include <sys/resource.h>
-
-
static void sub(void);
-
-
int main(void)
-
{
-
chdir("/tmp"); //设定core文件产生的路径
-
struct rlimit rlim;
-
struct rlimit rlim_new;
-
if (getrlimit(RLIMIT_CORE, &rlim) == 0) { //进行core文件的开启
-
rlim_new.rlim_cur = rlim_new.rlim_max = 1048576;
-
if (setrlimit(RLIMIT_CORE, &rlim_new)!= 0) {
-
rlim_new.rlim_cur = rlim_new.rlim_max = rlim.rlim_max;
-
(void)setrlimit(RLIMIT_CORE, &rlim_new);
-
}
-
}
-
sub();
-
return 0;
-
}
-
-
static void sub(void)
-
{
-
int *p = NULL;
-
printf("%d", *p);
-
}
编译:gcc -g core.c 此处要加-g 从而core文件里面才会加上debug的信息。
运行测试:运行a.out后提示Segmentation fault (core dumped)并且会在tmp目录下产生一个core文件
3、调试core文件
-
[root@tmp]# gdb --core=core.7762 -- core文件名字
-
warning: no loadable sections found in added symbol-file system-supplied DSO at 0x7fff9c1fd000
-
Core was generated by `./a.out'.
-
Program terminated with signal 11, Segmentation fault.
-
#0 0x00000000004005fc in ?? ()
-
(gdb) bt
-
#0 0x00000000004005fc in ?? ()
-
(gdb) file a.out --- 二进制文件
-
Reading symbols from /home/chenwc/learn/c/a.out...done.
-
(gdb) bt
-
#0 0x00000000004005fc in sub () at new_core.c:26
-
#1 0x00000000004005e1 in main () at new_core.c:19
-
(gdb) l ---- 此处如果要能够展示代码需要源码文件也要和二进制程序在同一个目录下
-
1 #include <stdio.h>
-
2 #include <unistd.h>
-
3 #include <sys/resource.h>
-
4
-
5 static void sub(void);
-
6
-
7 int main(void)
-
8 {
-
9 chdir("/tmp");
-
10 struct rlimit rlim;
-
(gdb)
4、gdb使用,具体的gdb使用大家网上找下,很多相关资料。
阅读(886) | 评论(0) | 转发(0) |