如何在Linux上在段错误时生成核心转储?

10 浏览
0 Comments

如何在Linux上在段错误时生成核心转储?

我在Linux上有一个进程出现了分段错误。当它失败时,我该如何告诉它生成核心转储文件?

0
0 Comments

如何在Linux上通过分段错误生成核心转储?

当出现分段错误时,可以通过以下步骤来生成核心转储:

1. 首先,检查核心转储文件的生成位置,可以运行以下命令:

sysctl kernel.core_pattern

或者:

cat /proc/sys/kernel/core_pattern

其中,`%e`代表进程名,`%t`代表系统时间。可以在`/etc/sysctl.conf`中修改这个设置,并通过`sysctl -p`重新加载。

2. 如果核心转储文件没有生成(可以通过以下命令进行测试:`sleep 10 &`和`killall -SIGSEGV sleep`),可以通过以下命令检查限制:

ulimit -a

3. 如果核心转储文件大小有限制,可以运行以下命令将其设为无限制:

ulimit -c unlimited

4. 然后重新进行测试,如果核心转储成功,你会在分段错误提示后看到"(core dumped)"的字样,例如:

Segmentation fault: 11 (core dumped)

值得注意的是,对于Ubuntu系统,核心转储文件由Apport处理,可以在`/var/crash/`目录下找到。然而,在稳定版本中,默认情况下是禁用的。有关更多详情,请参考:Where do I find the core dump in Ubuntu?

对于macOS系统,请参考:How to generate core dumps in Mac OS X?

对于Ubuntu系统,要恢复到正常行为(在当前目录中生成核心文件),可以简单地停止apport服务,使用以下命令:"sudo service apport stop"。另外,请注意,如果你在Docker中运行,这个设置是在宿主系统中控制的,而不是在容器中。

而不是每次禁用apport,更持久的方法是卸载apport(忽略推荐的依赖关系),因为这个服务对开发人员没有任何价值。

0
0 Comments

如何在Linux上生成核心转储文件?

在Linux系统上出现段错误时,如何生成核心转储文件?

问题的原因是在系统中未启用核心转储文件。解决方法是启用核心转储文件。可以使用以下命令来启用核心转储文件:

ulimit -c unlimited

这将允许生成任意大小的核心转储文件。接下来,我们需要确定如何生成核心转储文件。

如果你希望为一个挂起的进程生成核心转储文件,可以使用以下命令:

gcore <pid>

如果系统上没有安装gcore命令,可以使用以下命令:

kill -ABRT <pid>

不要使用kill -SEGV命令,因为这通常会触发信号处理程序,使得诊断挂起的进程变得更加困难。

我认为使用-ABRT选项触发信号处理程序的可能性比使用-SEGV选项更大,因为中止更有可能是可以恢复的,而段错误则不太可能。通常情况下,如果处理段错误,它会在处理程序退出后立即再次触发。因此,更好的选择是使用-QUIT选项来生成核心转储文件。

0
0 Comments

如何在Linux上生成核心转储文件?

在Linux中,生成核心转储文件可以通过设置限制来实现。不同的shell对应不同的设置方式。如果你使用的是bash shell,可以使用ulimit命令来控制程序执行相关的设置,比如是否生成核心转储文件。可以通过输入以下命令来告诉bash shell允许程序生成任意大小的核心转储文件:

ulimit -c unlimited

如果你希望设置一个特定大小的核心转储文件,可以将unlimited替换为具体的大小值,例如52M。但是实际上,核心转储文件的大小通常不是一个问题,所以一般来说使用unlimited即可。

如果你使用的是tcsh shell,可以使用limit命令来设置核心转储文件的大小。输入以下命令即可将大小限制设置为无限:

limit coredumpsize unlimited

需要说明的是,默认情况下不生成核心转储文件的原因是由于该限制没有设置或者设置为0,这会阻止生成核心转储文件。通过设置为unlimited,可以确保始终可以生成核心转储文件。

在这个链接中可以找到更多关于在Linux中生成核心转储文件的选项,但是有些命令和设置没有详细解释。

在bash版本4.1.2(1)-release中,无法指定大小为52M等值,会导致出现无效数字错误消息。man页面指出,大小的单位是1024字节的倍数。

作为一个OpenGL项目开发者,我曾经遇到过一个问题,导致X服务器崩溃。当我重新登录后,发现一个17GB大小的核心转储文件(在一个25GB的分区上)。因此,限制核心转储文件的大小是一个明智的做法。

有一个问题,我不想设置为无限制,那么我如何确定应该允许多大的核心转储文件?

如果你想要确保分区不被吃掉,我建议将限制设置为1GB。这应该足够处理任何合理大小的核心转储文件,同时不会威胁到你剩余的硬盘空间。

我想强调一下设置核心转储文件大小限制的重要性,因为我刚刚清理了几百个20GB大小的核心转储文件。

需要注意的是,这个设置在用户退出登录后不会保留,至少在CentOS上是这样。如果你希望设置持久生效,需要编辑/etc/security/limits.conf文件。

另外,记得将这个设置放在.bashrc文件中,这样就不需要每次都设置了。

0