linux程序崩溃(linux系统崩溃的原因汇总)

大家好,今天小编来为大家解答linux程序崩溃这个问题,linux系统崩溃的原因汇总很多人还不知道,现在让我们一起来看看吧!

Linux 打开程序崩溃时生成core文件

核心转储文件(core文件)在Linux系统中是调试程序崩溃问题的重要工具。当程序因错误而崩溃时,系统通常会生成一个核心转储文件,存储程序崩溃时的状态信息,便于开发者分析和解决问题。默认情况下,大多数Linux发行版已启用核心转储功能。要确保核心转储已启用,可检查/proc/sys/kernel/core_pattern文件的内容,如果其中包含类似"core"的字符串,则表明核心转储功能已启用。

若需手动启用核心转储,可使用如下命令进行配置。在该命令中,%e代表执行文件的文件名,%p是进程ID,%h是主机名,%t是核心文件生成时的Unix时间戳。根据需求调整核心转储文件的生成模式。

为了将核心转储文件存储在与进程文件相同的目录中,需要编写一个脚本以处理核心转储功能。此功能因/proc/sys/kernel/core_pattern仅支持简单的模式替换而受限,无法直接指定目录。以下是一个简单的脚本示例,用于在进程的工作目录中创建核心转储文件。

创建并保存此脚本(命名为set_core_pattern.sh),然后使其可执行,以实现指定目录下生成核心转储文件的目的。

Linux操作系统死机处理方法有哪些

Linux中,有如下几种方法来获取各种崩溃时产生的信息。

1.Core dump

Core dump通常用来调试应用程序错误,当某些应用程序运行出现异常崩溃时,可以开启系统的 core dump功能,来得到一个程序崩溃时的内存信息,用来分析崩溃原因:

在/etc/profile里加上(或者修改)一条:

ulimit-c 0

运行命令:sysctl-w"kernel.core_name_format=/coredump/%n.core"

该命令意思是指core文件放在/coredump目录下,文件名是进程名+.core

2.Diskdump

diskdump工具提供了在单机上创建和采集vmcore(kernel dump)的能力,而无须使用网络。当内核本身出现崩溃的时候,当前的内存和CPU状态以及相关的信息都会被保存到一个支持diskdump的磁盘上的保留分区上。在下一次重新启动的时候,当系统重新启动,diskdump的初始化脚本会从保留分区中读取保存的信息并创建一个vcore文件,然后这个文件被再次存放到/var/crash/目录下,文件名为127.0.0.1-

如下是一个配置 HP SCSI设备上启用 diskdump的过程,如果不是 HP SCSI设备(即设备名为/dev/sdX的形式),则无须执行第三、四两个步骤。但需要在第一步前先执行命令: modprobe

diskdump

第一步:编辑/etc/sysconfig/diskdump文件,将一个空白分区的设备名填入后保存退出,例如:

DEVICE=/dev/cciss/c0d0p2

第二步:初使化 dump设备

#service diskdump initialformat

警告:该分区的所以数据会丢失。

第三步:使用 cciss_dump模块替换当前的 cciss模块:

在/etc/modprobe.conf找到如下行:

alias scsi_hostadapter cciss

修改为:

alias scsi_hostadapter cciss_dump

再增加一行:

options cciss_dump dump_drive=1

注:假设diskdump文件中配置的为/dev/cciss/c0d[#a]p[#b],请设置为: options cciss_dump dump_drive=[#a]

第四步:重建 initrd文件:

#mv/boot/initrd-`uname-r`.img/boot/initrd-`uname-r`.img.old

#mkinitrd/boot/initrd-`uname-r`.img `uname-r`

第五步:设置 diskdump服务能够开机自启动:

# chkconfig diskdump on

3.Netdump

如果使用红旗DC4.0或 3.0版本系统,是不能支持 diskdump的,可以利用netdump来达到输出vmcore的目的。但是Netdump要求至少有一个服务器以及任意数目的客户端。服务器用来接收客户端死机时的信息,客户端是经常死机的机器。

(一)服务器配置:

(1).检验netdump服务器是否安装完毕:

rpm-q netdump-server

如果未安装,请在光盘 RedFlag/RPMS/目录中找到 netdump-server打头的软件包,执行命令:

rpm-ivh netdump-server-x.x.x.rpm(x为版本号)

进行安装。

(2).服务器包安装后,用命令:

passwd netdump

更改用户的密码.

(3).打开服务:

chkconfig netdump-server on

(4).运行服务器:

service netdump-server start

(二)客户端配置:

(1).校验客户端是否已安装

rpm-q netdump

如果未安装,在光盘 RedFlag/RPMS/目录中找到 netdum打头的软件包,执行命令:

rpm-ivh netdump-x.x.x.rpm(x为版本号)

安装.

(2).编辑文件/etc/sysconfig/netdump,添加如下行:

DEV=eth0

NETDUMPADDR=172.16.81.182

NETDUMPMACADDR=00:0C:29:79:F4:E0

172.16.81.182指 netdump服务器地址。

(3).运行下面的命令,出现提示符时输入密码:

service netdump propagate

(4).打开客户端:

chkconfig netdump on

(5).运行客户端:

service netdump start

(6).测试

为了测试netdump的配置是否正确,在netdump客户机上做下面操作:

cp/usr/share/doc/netdump-xxxxxx/crash.c.

gcc-DKERNEL-DMODULE-I/lib/modules/$(uname-r)/build/include-c crash.c

insmod./crash.o

这会造成系统崩溃,会在netdump服务器的/var/crash/<客户端IP>/目录下,看到一个核心转储。当客户机正在转储数据到服务器的时候,你会看到一个名叫“vmcore-incomplete"的文件。当转储结束后,该文件会改名成"vmcore"。"vmcore"文件的大小会变化,可能达到几个GB.在一个内存是512M的系统上,上面的测试会产生大约510M的vmcore文件。

分析linux内核崩溃信息

分析kernel比较关键的就是看三点:

1)内核会给出一个崩溃原因的猜测,这里是,CPU 0 Unable to handle kernel paging request at virtual address 00000000

2)看pc指针的值,这里是epc== 00000000

3)看调用栈Call Trace:[//可惜后面没给出来

通常是根据指针加上偏移值跟反汇编代码对照,找到出问题的指令。

这个panic的原因比较明显,应该是引用了空指针,试图执行0x00000000出的代码。

阅读剩余
THE END