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
相关文章
|
2天前
|
Linux
Linux下使用ls查看文件颜色全部为白色的解决方法,以及Linux中文件颜色介绍
Linux下使用ls查看文件颜色全部为白色的解决方法,以及Linux中文件颜色介绍
15 2
|
3天前
|
Linux
Linux 服务器下载百度网盘文件
本教程指导如何使用 `bypy` 库从百度网盘下载文件。首先通过 `pip install bypy` 安装库,接着运行 `bypy info` 获取登录链接并完成授权,最后将文件置于指定目录并通过 `bypy downdir /Ziya-13b-v1` 命令下载至本地。
14 1
Linux 服务器下载百度网盘文件
|
6天前
|
Linux
linux 删除乱码文件名的文件
【8月更文挑战第26天】当遇到文件名显示为乱码,导致无法正常通过键盘输入文件名进行删除操作时,可以利用鼠标的复制功能配合`rm`命令实现删除。对于文件夹的删除,可使用`rm -rf 目录名`。然而,有时这种方式仍无法删除某些特殊乱码文件,这时可以通过获取文件的i节点号(使用`ls -i`或`ll -i`命令查看)并执行`find -inum [节点号] -delete`来进行删除。这种方法特别适用于处理那些因文件名问题而难以删除的情况。
38 2
|
7天前
|
JSON Linux 网络安全
【Azure 应用服务】如何从App Service for Linux 的环境中下载Container中非Home目录下的文件呢?
【Azure 应用服务】如何从App Service for Linux 的环境中下载Container中非Home目录下的文件呢?
|
2天前
|
JavaScript Linux
Linux中和文件相关的操作
Linux中和文件相关的操作
8 0
|
5天前
|
Linux
Linux0.11 文件打开open函数(五)
Linux0.11 文件打开open函数(五)
14 0
|
7天前
|
前端开发 JavaScript Linux
【Azure 应用服务】在Azure App Service for Linux环境中,部署的Django应用,出现加载css、js等静态资源文件失败
【Azure 应用服务】在Azure App Service for Linux环境中,部署的Django应用,出现加载css、js等静态资源文件失败
|
应用服务中间件 Linux 网络安全
|
2天前
|
Linux 网络安全 Python
linux后台运行命令screen的使用
linux后台运行命令screen的使用
14 2
linux后台运行命令screen的使用
|
2天前
|
Ubuntu Linux
查看Linux系统架构的命令,查看linux系统是哪种架构:AMD、ARM、x86、x86_64、pcc 或 查看Ubuntu的版本号
查看Linux系统架构的命令,查看linux系统是哪种架构:AMD、ARM、x86、x86_64、pcc 或 查看Ubuntu的版本号
23 3
下一篇
云函数