小伙伴们在 Linux 系统中遇到程序异常结束,想要查出什么原因造成的,都是用什么方法呢?这篇文章给大家介绍一种方法,对开发者和运维的小伙伴们查找定位问题很有帮助~咱们平时开发的程序在运行过程中异常终止或崩溃时,操作系统会将程序当时的内存状态记录并保存到一个文件中,这个过程称为 Core Dump(中文常翻译为“核心转储”)。我们可以把 core dump 看作是"内存快照",但实际上,它不仅包含内存信息,还记录了一些关键的程序运行状态,如寄存器信息(包括程序指针、栈指针等)、内存管理信息以及其他处理器和操作系统的状态。这些 core dump 文件对于程序员诊断和调试程序非常有帮助,因为某些错误(例如指针异常)可能难以重现,而 core dump 文件能够准确再现程序出错时的情境。通过分析 core 文件,可以帮助开发和运维的小伙伴定位崩溃原因。使用 ulimit 命令来控制 core 文件的最大大小:- 设置特定的 core 文件大小限制(例如 100 MB):
提示:要使这些设置在每次登录时生效,可以将上述命令添加到用户的 shell 配置文件(如 ~/.bashrc 或 ~/.bash_profile)中。通过 /proc/sys/kernel/core_pattern 文件配置 core 文件的命名和存储位置。cat /proc/sys/kernel/core_pattern
echo "/tmp/core-%e-%s-%u-%g-%p-%t" | sudo tee /proc/sys/kernel/core_pattern
保存路径可以自行设置,注意权限问题,我设置的是/tmp。为了确保配置在系统重启后依然有效,可以将 core_pattern 设置写入 /etc/sysctl.conf:echo "kernel.core_pattern=/tmp/core-%e-%s-%u-%g-%p-%t" | sudo tee -a /etc/sysctl.conf
确保运行程序的用户对指定的 core 文件目录(如 /tmp)具有写权限。如果没有权限,core 文件将无法生成。以下是完整的示例,展示如何设置 core 文件生成:# 1. 允许生成无限大小的 core 文件ulimit -c unlimited# 2. 设置 core 文件的命名格式和路径echo "/tmp/core.%e.%p" | sudo tee /proc/sys/kernel/core_pattern# 3. 验证当前 core 文件模式cat /proc/sys/kernel/core_pattern# 4. 持久化设置echo "kernel.core_pattern=/tmp/core-%e-%s-%u-%g-%p-%t" | sudo tee -a /etc/sysctl.confsudo sysctl -p
生成 core 文件后,可以使用 gdb 等调试工具进行分析。例如:gdb ./test /tmp/core.test.进程ID...
在 GDB 中,可以使用 bt 命令打印堆栈跟踪,以帮助找到崩溃原因。#include<stdio.h>intmain(){ int *p = NULL; *p = 123;//测试非法内存 return 0;}
生成可执行程序test,然后运行,就会在/tmp目录下看到core文件。- 页面大小:Core 文件可能很大,确保磁盘空间充足。
- 安全性:避免将 core 文件存储在公共目录,以防泄露敏感信息。
- 监控:定期检查和清理旧的 core 文件,以免占用过多磁盘空间。