linux生成core文件,core文件路径设置

简介:

转自:http://blog.csdn.net/u010066903/article/details/52717267

在Linux下产生并调试core文件 先看看我用的是个什么机器:

1
2
uname  -a
  Linux dev 2.4.21-9.30AXsmp  #1 SMP Wed May 26 23:37:09 EDT 2004 i686 i686 i386 GNU/Linux

再看看默认的一些参数,注意core file size是个0,程序出错时不会产生core文件了。

1
2
3
4
5
6
7
8
9
10
11
12
ulimit  -a
  core  file  size (blocks, -c) 0
  data seg size (kbytes, -d) unlimited
  file  size (blocks, -f) unlimited
  max locked memory (kbytes, -l) 4
  max memory size (kbytes, -m) unlimited
  open  files (-n) 2048
  pipe size (512 bytes, -p) 8
  stack size (kbytes, -s) 10240
  cpu  time  (seconds, -t) unlimited
  max user processes (-u) 7168
  virtual memory (kbytes, - v ) unlimited

写个简单的程序,看看core文件是不是会被产生。

1
2
3
4
5
6
7
8
more  foo.c
#include
static void sub(void);
int main(void) { sub();  return  0; }
static void sub(void) { int *p = NULL;
/* derefernce a null pointer, expect core dump. */  printf ( "%d" , *p); }
$ gcc -Wall -g foo.c $ . /a .out Segmentation fault
ls  -l core.*  ls : core.*: No such  file  or directory

没有找到core文件,我们改改ulimit的设置,让它产生。1024是随便取的,要是core文件大于1024个块,就产生不出来了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
ulimit  -c 1024
ulimit  -a 
 
core  file  size (blocks, -c) 1024
data seg size (kbytes, -d) unlimited 
file  size (blocks, -f) unlimited 
max locked memory (kbytes, -l) 4 
max memory size (kbytes, -m) unlimited 
open  files (-n) 2048 
pipe size (512 bytes, -p) 8 
stack size (kbytes, -s) 10240 
cpu  time  (seconds, -t) unlimited 
max user processes (-u) 7168 
virtual memory (kbytes, - v ) unlimited
 
$ . /a .out 
Segmentation fault (core dumped) 
ls  -l core.* 
-rw------- 1 uniware uniware 53248 Jun 30 17:10 core.9128

注意看上述的输出信息,多了个(core dumped)。确实产生了一个core文件,9128是该进程的PID。我们用GDB来看看这个core。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ gdb --core=core.9128
  GNU gdb Asianux (6.0post-0.20040223.17.1AX)
  Copyright 2004 Free Software Foundation, Inc.
  GDB is  free  software, covered by the GNU General Public License, and you are
  welcome to change it and /or  distribute copies of it under certain conditions.
  Type  "show copying"  to see the conditions.
  There is absolutely no warranty  for  GDB. Type  "show warranty"  for  details.
  This GDB was configured as  "i386-asianux-linux-gnu" .
  Core was generated by `. /a .out'.
  Program terminated with signal 11, Segmentation fault.
  #0 0x08048373 in ?? ()
  (gdb) bt
  #0 0x08048373 in ?? ()
  #1 0xbfffd8f8 in ?? ()
  #2 0x0804839e in ?? ()
  #3 0xb74cc6b3 in ?? ()
  #4 0x00000000 in ?? ()

此时用bt看不到backtrace,也就是调用堆栈,原来GDB还不知道符号信息在哪里。我们告诉它一下:

1
2
3
4
5
6
(gdb)  file  . /a .out
  Reading symbols from . /a .out... done .
  Using host libthread_db library  "/lib/tls/libthread_db.so.1" .
  (gdb) bt
  #0 0x08048373 in sub () at foo.c:17
  #1 0x08048359 in main () at foo.c:8

此时backtrace出来了。

1
2
3
4
5
6
7
8
9
10
11
12
(gdb) l
  8 sub();
  return  0;
  10 }
  11
  12 static void sub(void)
  13 {
  14 int *p = NULL;
  15
  16 /* derefernce a null pointer, expect core dump. */
  17  printf ( "%d" , *p);
  (gdb)

在程序不寻常退出时,内核会在当前工作目录下生成一个core文件(是一个内存映像,同时加上调试信息)。使用gdb来查看core文件,可以指示出导致程序出错的代码所在文件和行数。

1.core文件的生成开关和大小限制
---------------------------------
1)使用ulimit -c命令可查看core文件的生成开关。若结果为0,则表示关闭了此功能,不会生成core文件。
2)使用ulimit -c filesize命令,可以限制core文件的大小(filesize的单位为kbyte)。若ulimit -c unlimited,则表示core文件的大小不受限制。如果生成的信息超过此大小,将会被裁剪,最终生成一个不完整的core文件。在调试此core文件的时候,gdb会提示错误。

2.core文件的名称和生成路径
----------------------------
core文件生成路径:
输入可执行文件运行命令的同一路径下。
若系统生成的core文件不带其他任何扩展名称,则全部命名为core。新的core文件生成将覆盖原来的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)proc/sys/kernel/core_pattern可以控制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来查看。

1
2
gdb . /a .out
  core- file  core.xxxx

使用bt命令即可看到程序出错的地方。
以下两种命令方式具有相同的效果,但是在有些环境下不生效,所以推荐使用上面的命令。

1
2
3
4
5
6
1)gdb -core=core.xxxx
  file  . /a .out
  bt
  2)gdb -c core.xxxx
  file  . /a .out
  bt

4.开发板上使用core文件调试
-----------------------------
如果开发板的操作系统也是linux,core调试方法依然适用。如果开发板上不支持gdb,可将开发板的环境(依赖库)、可执行文件和core文件拷贝到PC的linux下。
在 PC上调试开发板上产生的core文件,需要使用交叉编译器自带的gdb,并且需要在gdb中指定solib-absolute-prefix和 solib-search-path两个变量以保证gdb能够找到可执行程序的依赖库路径。有一种建立配置文件的方法,不需要每次启动gdb都配置以上变量,即:在待运行gdb的路径下建立.gdbinit。
配置文件内容:

1
2
3
4
set  solib-absolute-prefix YOUR_CROSS_COMPILE_PATH
  set  solib-search-path YOUR_CROSS_COMPILE_PATH
  set  solib-search-path YOUR_DEVELOPER_TOOLS_LIB_PATH
  handle SIG32 nostop noprint pass
相关实践学习
阿里云图数据库GDB入门与应用
图数据库(Graph Database,简称GDB)是一种支持Property Graph图模型、用于处理高度连接数据查询与存储的实时、可靠的在线数据库服务。它支持Apache TinkerPop Gremlin查询语言,可以帮您快速构建基于高度连接的数据集的应用程序。GDB非常适合社交网络、欺诈检测、推荐引擎、实时图谱、网络/IT运营这类高度互连数据集的场景。 GDB由阿里云自主研发,具备如下优势: 标准图查询语言:支持属性图,高度兼容Gremlin图查询语言。 高度优化的自研引擎:高度优化的自研图计算层和存储层,云盘多副本保障数据超高可靠,支持ACID事务。 服务高可用:支持高可用实例,节点故障迅速转移,保障业务连续性。 易运维:提供备份恢复、自动升级、监控告警、故障切换等丰富的运维功能,大幅降低运维成本。 产品主页:https://www.aliyun.com/product/gdb
相关文章
|
4天前
|
Linux API C语言
C语言读写BMP文件-EasyBmp【 linux 平台】
**EasyBmp** 是一个49KB的轻量级C++图像处理库,专注于BMP格式,提供简单易用的API。它的特点是小巧、开源、易于理解和高度定制。通过示例代码展示了如何轻松读取、缩放和保存BMP图像。适合需要高效处理BMP图像的开发者。
|
5天前
|
Linux Shell
蓝易云 - Linux下查看文件和文件夹大小
这两个命令是查看Linux系统中文件和文件夹大小的基本工具,可以根据需要进行组合使用。
6 0
|
5天前
|
应用服务中间件 Linux nginx
蓝易云 - Linux使用pid文件结束nginx
以上就是使用pid文件结束nginx进程的方法。
7 0
|
6天前
|
缓存 Linux Windows
初识Linux操作系统(根目录下的重要文件)(命令提示符的含义)
Linux系统基于"一切皆文件"的理念,重要文件分布在如/root(root用户目录)、/home(普通用户目录)、/etc(应用配置)、/dev(设备文件)、/boot(内核及启动文件)、/proc(动态系统信息)、/lib64(库文件)、/opt(软件存放)、/tmp(临时文件)。"[root@localhost ~]#"代表管理员在root目录,"$"代表普通用户。创建新用户用`useradd`命令。调节终端字体大小:Ctrl+Shift++增大,Ctrl+减号缩小。绝对路径从根目录开始,相对路径从当前目录开始。
|
8天前
|
存储 缓存 Unix
【嵌入式软件工程师面经】Linux文件IO
【嵌入式软件工程师面经】Linux文件IO
13 1
|
8天前
|
Linux Python
在 Linux 中查看目录文件数的方法
【6月更文挑战第7天】在 Linux 中查看目录文件数的方法包括:使用 `ls` 命令结合 `wc -l`,`find` 命令,`tree` 命令,以及编程方式(如 Python)。`ls` 和 `find` 命令通过管道传递给 `wc -l` 统计行数,而 `tree` 命令提供树状视图并显示文件数。编程方式则允许自定义实现,例如 Python 中的 `os.walk()`。注意权限、效率和场景适用性,选择合适的方法以提高 Linux 操作效率。
28 3
|
8天前
|
监控 Linux Perl
在 Linux 中显示文件指定行内容的方法和技巧
【6月更文挑战第7天】在 Linux 中查看文本文件指定行,可使用 head/tail 显示文件头/尾部行,sed 的行号指定功能或 awk 进行处理。在代码审查、日志分析和文本处理等场景下,这些命令能提升效率。注意文件编码、行号准确性,并组合使用命令以实现更多功能。通过练习,能更好地掌握这些工具。
34 0
|
8天前
|
存储 数据挖掘 Linux
在 Linux 中找目录中最大文件
【6月更文挑战第7天】在 Linux 中找目录中最大文件:使用 `du` 加 `sort` 命令 (`du -a /path | sort -nr | head -n 1`),`find` 加 `xargs` 和 `sort` (`find /path -type f -print0 | xargs -0 du -h | sort -nr | head -n 1`) 或编写 Python 脚本。适用于服务器管理、数据分析和文件清理,注意文件权限、目录深度和文件系统类型。结合其他命令可提升效率。
22 0
|
8天前
|
Linux
蓝易云 - 修改linux文件权限命令:chmod
例如,`chmod 755 文件名`将给文件设置读/写/执行权限给所有者,读/执行权限给组用户和其他用户。
11 0
|
9天前
|
Linux C++
Linux C/C++目录和文件的更多操作
Linux C/C++目录和文件的更多操作