核心已转储,但核心文件不在当前目录中?

2024-10-12 09:08:00
admin
原创
91
摘要:问题描述:运行 C 程序时,它显示“(核心转储)”,但我看不到当前路径下的任何文件。我已经设置并验证了ulimit:ulimit -c unlimited ulimit -a 我也尝试查找名为“core”的文件,但没有找到核心转储文件? 有什么帮助吗?我的核心文件在哪里?解决方案 1:阅读/usr/sr...

问题描述:

运行 C 程序时,它显示“(核心转储)”,但我看不到当前路径下的任何文件。

我已经设置并验证了ulimit

ulimit -c unlimited 
ulimit -a 

我也尝试查找名为“core”的文件,但没有找到核心转储文件?

有什么帮助吗?我的核心文件在哪里?


解决方案 1:

阅读/usr/src/linux/Documentation/sysctl/kernel.txt。

core_pattern 用于指定核心转储文件模式名称。

  • 如果模式的第一个字符是“|”,则内核将把模式的其余部分视为要运行的命令。核心转储将写入该程序的标准输入,而不是文件。

您的系统配置为将核心转储发送到abrt(意思是:自动错误报告工具,而不是“中止”)程序,而不是将其写入磁盘。 自动错误报告工具可能没有像它应该的那样记录在案……

无论如何,快速回答是您应该能够在 中找到您的核心文件/var/cache/abrt,该abrt文件在调用后存储在 中。同样,使用Apport的其他系统可能会将核心存储在 中/var/crash,依此类推。

解决方案 2:

在最近的 Ubuntu(我的情况是 12.04)上,可能会打印“段错误(核心转储)”,但没有在您期望的位置生成核心文件(例如,对于本地编译的程序)。

如果您的核心文件大小 ulimit 为 0(您尚未执行ulimit -c unlimited),则可能会发生这种情况——这是 Ubuntu 上的默认设置。通常,这会抑制“(核心转储)”,提示您犯了错误,但在 Ubuntu 上,核心文件通过 传输到Apport(Ubuntu 的崩溃报告系统)/proc/sys/kernel/core_pattern,这似乎会导致出现误导性消息。

如果 Apport 发现有问题的程序不是它应该报告崩溃的程序(您可以在 中看到这种情况/var/log/apport.log),它会回退到模拟默认内核行为,即在 cwd 中放置一个核心文件(这在脚本 中完成/usr/share/apport/apport)。这包括遵守 ulimit,在这种情况下它什么也不做。但(我假设)就内核而言,生成了一个核心文件(并通过管道传输到 apport),因此出现消息“分段错误(核心转储)”。

最终 PEBKAC 忘记设置 ulimit,但是这个误导性的消息让我一度以为自己要疯了,不知道是什么在吞噬我的核心文件。

(此外,一般来说,核心(5)手册页---man 5 core可以很好地参考您的核心文件的最终位置以及可能无法写入的原因。)

解决方案 3:

随着systemd的推出,还有另一种情况。默认情况下,systemd 会将核心转储存储在其日志中,可以通过systemd-coredumpctl命令访问。在 core_pattern 文件中定义:

$ cat /proc/sys/kernel/core_pattern 
|/usr/lib/systemd/systemd-coredump %p %u %g %s %t %e

检查存储的核心转储的最简单方法是通过coredumpctl list(旧的核心转储可能已被自动删除)。可以使用简单的“黑客”禁用此行为:

$ ln -s /dev/null /etc/sysctl.d/50-coredump.conf
$ sysctl -w kernel.core_pattern=core      # or just reboot

与往常一样,核心转储的大小必须等于或高于被转储的核心的大小,例如ulimit -c unlimited

解决方案 4:

在Ubuntu 16.04 LTS下获取核心转储的编写说明:

  1. 正如 @jtn 在他的回答中提到的,Ubuntu 将崩溃的显示委托给apport,而 apport 又拒绝写入转储,因为该程序不是已安装的软件包。进行更改之前

  2. 为了解决这个问题,我们需要确保apport也能为非软件包程序写入核心转储文件。为此,请创建一个名为~/.config/apport/settings 的文件,其中包含以下内容:

`[main]
unpackaged=true`

  1. 现在再次让程序崩溃,然后查看在文件夹/var/crash中生成的崩溃文件,其名称类似于.1000.crash 。请注意,这些文件不能被gdb*直接读取。做出更改后

  2. [可选]为了使转储可被 gdb 读取,请运行以下命令:

apport-unpack <location_of_report> <target_directory>

参考资料:
Core_dump – Oracle VM VirtualBox

解决方案 5:

我在以下位置找到了我的 Ubuntu 20.04 系统的核心文件;

/var/lib/apport/coredump 

解决方案 6:

我能想到以下两种可能性:

  1. 正如其他人已经指出的那样,该程序可能chdir()。运行该程序的用户是否被允许写入它所chdir()要的目录?如果没有,它就无法创建核心转储。

  2. 由于某些奇怪的原因,核心转储没有命名。core.*您可以检查/proc/sys/kernel/core_pattern一下。此外,您命名的 find 命令找不到典型的核心转储。您应该使用find / -name "*core.*",因为核心转储的典型名称是core.$PID

解决方案 7:

在 Ubuntu18.04 中,获取核心文件最简单的方法是输入下面的命令来停止 apport 服务。

sudo service apport stop

然后重新运行该应用程序,您将在当前目录中获得转储文件。

解决方案 8:

RHEL如果你在使用时缺少二进制文件的核心转储abrt,请确保/etc/abrt/abrt-action-save-package-data.conf

包含

ProcessUnpackaged = yes

这样就可以为不属于已安装软件包(例如本地构建)的二进制文件创建崩溃报告(包括核心转储)。

解决方案 9:

对于 fedora25,我可以在以下位置找到核心文件

/var/spool/abrt/ccpp-2017-02-16-16:36:51-2974/coredump

按照ccpp-2017-02-16-16:36:51-2974" is pattern "%s %c %p %u %g %t %P %“/proc/sys/kernel/core_pattern”

解决方案 10:

我使用的是 Linux Mint 19(基于 Ubuntu 18)。我想将coredump文件放在当前文件夹中。我必须做两件事:

  1. 改变/proc/sys/kernel/core_pattern(通过# echo "core.%p.%s.%c.%d.%P > /proc/sys/kernel/core_pattern或通过# sysctl -w kernel.core_pattern=core.%p.%s.%c.%d.%P)

  2. 将核心文件大小限制提高$ ulimit -c unlimited

这在答案中已经写过了,但我写下来是为了简洁地总结一下。有趣的是,更改限制不需要 root 权限(根据https://askubuntu.com/questions/162229/how-do-i-increase-the-open-files-limit-for-a-non-root-user,非 root 只能降低限制,所以这是意料之外的 - 欢迎对此发表评论)。

解决方案 11:

我在 WSL 的努力没有成功。

对于在 Windows Subsystem for Linux (WSL) 上运行的用户,目前似乎存在缺少核心转储文件的未解决的问题。

评论表明

这是一个我们已经知道的问题,我们正在调查。

Github 问题

Windows 开发人员反馈

解决方案 12:

就我而言,原因是 ulimit 命令仅影响当前终端。

如果我ulimit -c unlimited在第一个终端上设置。然后我启动一个新终端来运行该程序。核心转储时它不会生成核心文件。

您必须确认运行您的程序的终端的核心大小。

以下步骤适用于 ubuntu 20.04 和 ubuntu 21.04:

  1. 停止授权服务

sudo service apport stop
  1. 设置准备运行程序的终端的核心大小

ulimit -c unlimited

解决方案 13:

ulimit -c unlimited在“核心转储”之后,使核心文件正确出现在当前目录中。

解决方案 14:

如果您使用 Fedora,为了在二进制文件的同一目录中生成核心转储文件:

echo "core.%e.%p" > /proc/sys/kernel/core_pattern

ulimit -c unlimited

解决方案 15:

我发现开始调试核心转储的最简单方法是使用 coredumpctl(有关更多信息,请参阅 man coredumpctl)。

要使用最新的分段错误启动调试会话,只需输入

$ coredumpctl debug

查找和提取核心转储文件也很有用。

解决方案 16:

获取最新核心转储路径的一行代码:

ls -t $(cat /proc/sys/kernel/core_pattern | awk -F% '{print $1"*"}') 2>/dev/null | head -1

当然,您可以修改-1该行的最后一行,例如-4获取最后 4 个核心转储。

注意:例如,如果路径模式在最后一个变量之前使用变量 ,或者当该目录中没有核心转储文件时,这不会起作用。/

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用