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
相关文章
|
11天前
|
Linux Shell 网络安全
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
本指南介绍如何利用 HTA 文件和 Metasploit 框架进行渗透测试。通过创建反向 shell、生成 HTA 文件、设置 HTTP 服务器和发送文件,最终实现对目标系统的控制。适用于教育目的,需合法授权。
45 9
Kali Linux系统Metasploit框架利用 HTA 文件进行渗透测试实验
|
1月前
|
Linux 开发工具 Perl
在Linux中,有一个文件,如何删除包含“www“字样的字符?
在Linux中,如果你想删除一个文件中包含特定字样(如“www”)的所有字符或行,你可以使用多种文本处理工具来实现。以下是一些常见的方法:
41 5
|
1月前
|
安全 Linux 数据安全/隐私保护
在 Linux 系统中,查找文件所有者是系统管理和安全审计的重要技能。
在 Linux 系统中,查找文件所有者是系统管理和安全审计的重要技能。本文介绍了使用 `ls -l` 和 `stat` 命令查找文件所有者的基本方法,以及通过文件路径、通配符和结合其他命令的高级技巧。还提供了实际案例分析和注意事项,帮助读者更好地掌握这一操作。
51 6
|
1月前
|
Linux
在 Linux 系统中,`find` 命令是一个强大的文件查找工具
在 Linux 系统中,`find` 命令是一个强大的文件查找工具。本文详细介绍了 `find` 命令的基本语法、常用选项和具体应用示例,帮助用户快速掌握如何根据文件名、类型、大小、修改时间等条件查找文件,并展示了如何结合逻辑运算符、正则表达式和排除特定目录等高级用法。
101 6
|
1月前
|
监控 Linux Perl
Linux 命令小技巧:显示文件指定行的内容
在 Linux 系统中,处理文本文件是一项常见任务。本文介绍了如何使用 head、tail、sed 和 awk 等命令快速显示文件中的指定行内容,帮助你高效处理文本文件。通过实际应用场景和案例分析,展示了这些命令在代码审查、日志分析和文本处理中的具体用途。同时,还提供了注意事项和技巧,帮助你更好地掌握这些命令。
86 4
|
1月前
|
监控 Oracle 关系型数据库
Linux平台Oracle开机自启动设置
【11月更文挑战第8天】在 Linux 平台设置 Oracle 开机自启动有多种方法,本文以 CentOS 为例,介绍了两种常见方法:使用 `rc.local` 文件(较简单但不推荐用于生产环境)和使用 `systemd` 服务(推荐)。具体步骤包括编写启动脚本、赋予执行权限、配置 `rc.local` 或创建 `systemd` 服务单元文件,并设置开机自启动。通过 `systemd` 方式可以更好地与系统启动过程集成,更规范和可靠。
110 2
|
1月前
|
Oracle Ubuntu 关系型数据库
Linux平台Oracle开机自启动设置
【11月更文挑战第7天】本文介绍了 Linux 系统中服务管理机制,并详细说明了如何在使用 systemd 和 System V 的系统上设置 Oracle 数据库的开机自启动。包括创建服务单元文件、编辑启动脚本、设置开机自启动和启动服务的具体步骤。最后建议重启系统验证设置是否成功。
|
1月前
|
缓存 监控 Linux
|
NoSQL Linux Unix
Linux生成core文件、core文件路径设置
在Linux下产生并调试core文件 先看看我用的是个什么机器: $ uname -aLinux 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文件了。
1218 0
|
1月前
|
Linux 网络安全 数据安全/隐私保护
Linux 超级强大的十六进制 dump 工具:XXD 命令,我教你应该如何使用!
在 Linux 系统中,xxd 命令是一个强大的十六进制 dump 工具,可以将文件或数据以十六进制和 ASCII 字符形式显示,帮助用户深入了解和分析数据。本文详细介绍了 xxd 命令的基本用法、高级功能及实际应用案例,包括查看文件内容、指定输出格式、写入文件、数据比较、数据提取、数据转换和数据加密解密等。通过掌握这些技巧,用户可以更高效地处理各种数据问题。
102 8