inux 作为广泛使用的运行平台,在程序运行崩溃时能及时记录 错误信息,是很方便的查询问题的方式,这里对怎么使用 Linux下的 错误信息记录 core文件,进行总结介绍。
引言
在Linux系统开发中,当程序发生崩溃时,生成的core文件对于开发者来说是一个宝贵的资源。它记录了程序崩溃时的内存映像和寄存器状态,是调试程序的关键。本文将深入探讨如何在Linux系统下生成core文件,并自定义其命名和存储规则。
编译时添加 -g
指令
编译器选项
在编译程序时,使用 -g
选项可以保留调试信息。这对于生成core文件至关重要,因为调试信息允许调试器(如gdb)正确地解释core文件中的数据。
Makefile 示例
以下是一个包含 -g
选项的Makefile示例:
CC=gcc CFLAGS=-g -Wall -O0 # 添加-g以包含调试信息,-O0禁用优化 TARGET=my_program all: $(TARGET) $(TARGET): main.o utils.o $(CC) $(CFLAGS) -o $@ $^ main.o: main.c $(CC) $(CFLAGS) -c $< utils.o: utils.c $(CC) $(CFLAGS) -c $<
CMakeLists.txt 示例
在使用CMake构建系统时,可以在CMakeLists.txt文件中设置编译选项:
cmake_minimum_required(VERSION 3.10) project(MyProgram) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) add_executable(MyProgram main.cpp utils.cpp) target_compile_options(MyProgram PRIVATE -g -O0) # 添加-g和-O0
ulimit
设置启用 core 文件记录
ulimit
是一个用来控制shell启动进程的资源限制的工具。要启用core文件的生成,可以使用以下命令:
ulimit -c unlimited
ulimit
设置启用 core 文件记录
ulimit
是一个用来控制shell启动进程的资源限制的工具。要启用core文件的生成,可以使用以下命令:
ulimit -c unlimited
ulimit
设置启用 core 文件记录
ulimit
是一个用来控制shell启动进程的资源限制的工具。要启用core文件的生成,可以使用以下命令:
ulimit -c unlimited
要临时设置core文件的生成规则,可以使用以下命令:
sysctl -w kernel.core_pattern="/core_dumps/core_%e_%p_%t"
这将把core文件存储到/core_dumps
目录下,文件名包含程序名、进程ID和时间戳。
永久设置示例
为了永久设置core文件的命名规则,需要编辑/etc/sysctl.conf
文件,并添加或修改以下行:
kernel.core_pattern = /core_dumps/core_%e_%p_%t
修改后,运行以下命令来应用更改:
sysctl -p /etc/sysctl.conf
其他 sysctl
参数
除了kernel.core_pattern
,还有一些其他的sysctl
参数可以控制core文件的行为:
fs.inotify.max_user_watches
:设置用户可以监视的文件数量的最大值。
kernel.core_uses_pid
:设置是否在core文件名中包含进程ID。
调试崩溃程序
一旦core文件生成,可以使用gdb调试器来分析:
gdb /path/to/program /path/to/core
结论
通过本文的介绍,你应该对如何在Linux系统下生成和自定义core文件有了更深入的理解。正确地设置编译选项和系统参数,可以大大简化程序崩溃后的调试过程。记得在生产环境中谨慎使用,以避免潜在的安全风险和性能问题。
扩展阅读
- 深入理解Linux内核
- gdb用户手册
- CMake文档
分享一个有趣的 学习链接