非Root用户编译C程序如何生成Core文件
- 一.生成core文件的步骤
- 1.设置核心转储文件大小为不限制
- 2.**修改核心转储文件生成路径**
- 3.指定core的生成目录为当前目录下
- 4.测试程序
- 二.核心转储相关设置文件
一.生成core文件的步骤
1.设置核心转储文件大小为不限制
#查询生成core文件限制:
$ ulimit -c
0 #--->0表示无法生成core文件
# 不设置大小限制
$ ulimit -c unlimited
2.修改核心转储文件生成路径
编辑文件/proc/sys/kernel/core_pattern,,实际上这个文件显示的是当前系统所使用的核心转储文件生成模式。修改这个文件仅在临时情况下起作用。
3.指定core的生成目录为当前目录下
修改文件/proc/sys/kernel/core_pattern内容为core
# 非root用户情况
# 提前备份一下
$ cp /proc/sys/kernel/core_pattern ~/core_pattern_bak
$ sudo bash -c 'echo "core" > /proc/sys/kernel/core_pattern'
4.测试程序
segfault_example.c
#include <stdio.h>
int main() {
int *ptr = NULL;
printf("Attempting to dereference a null pointer...\n");
*ptr = 42; // 尝试解引用空指针
return 0;
}
gcc -g segfault_example.c -o segfault_example
ulimit -c unlimited # 设置生成无限制的核心文件大小
编译程序
$ ./segfault_example
Attempting to dereference a null pointer...
段错误 (核心已转储)
$ ls
core.75784 segfault_example segfault_example.c
使用 gdb
工具可以分析生成的核心转储文件。运行以下命令:
$ gdb ./segfault_example core
这将启动 gdb
并加载程序和生成的核心文件,允许你查看导致段错误的情况。
二.核心转储相关设置文件
在系统的 /proc/sys/kernel/
目录下有三个与核心转储相关的文件:core_pattern
、core_pipe_limit
和 core_uses_pid
。这里是它们各自的作用和区别:
- core_pattern:
- 作用:
core_pattern
文件定义了生成核心转储文件的模式或路径。它指定何时以及如何产生核心转储文件,可以包含文件路径、文件名模式以及格式转换说明符。 - 设置示例:例如,
|/path/to/some_program %p %u %g
可以用来定义核心文件的路径及其命名方式。 - 默认值:默认情况下,其值通常为
core
,表示核心文件将在当前目录下生成一个名为core
的文件。如果是/home/core,就是在/home下生成core文件。
- core_pipe_limit:
- 作用:
core_pipe_limit
文件定义核心转储的管道限制。这个限制指定了核心转储管道的大小限制,用于确定核心文件传输时的大小限制。 - 设置示例:一般设置为系统内存大小的一部分,以确保适当但受控制的核心转储。
- 默认值:默认情况下,其值取决于系统的内存设置。
- core_uses_pid:
-
作用:
core_uses_pid
文件指示是否在生成核心转储文件时使用进程 ID(PID)作为文件的一部分。这样可以帮助将核心转储文件与其生成的进程相关联。 -
设置示例:值为
1
表示使用进程 ID,值为0
表示不使用进程 ID。 -
默认值:一般情况下,默认值为
1
,表示使用进程 ID。
区别: -
core_pattern
确定了核心转储文件的名称和路径。 -
core_pipe_limit
确定了核心转储管道的大小限制。 -
core_uses_pid
确定了是否在生成的核心转储文件中包含进程 ID。
这三个文件一起提供了对系统核心转储行为的控制,允许管理员根据需求进行配置和调整以满足系统的要求。对这些文件的设置需要谨慎,以确保系统的稳定性和安全性。