我有一个 C++ 程序,它按预期执行,但指针肯定有问题,因为它最后崩溃并创建了核心转储。我的问题是我找不到核心文件,所以我无法调试它。
我努力了
ulimit -c unlimited
ulimit -a
现在文件的大小设置为无限,但我仍然找不到核心。我在每个文件夹中都尝试过这里但似乎仍然没有创建核心文件。
在哪里可以找到它?
答案1
在 Ubuntu 中,核心转储由阿波特并且可以位于/var/crash/
。但在稳定版本中,它默认是禁用的。
要启用 Apport,请运行:sudo systemctl enable apport.service
或sudo service apport start
。
要禁用,请运行:sudo systemctl disable apport.service
或sudo service apport stop
以返回常规核心转储方法。请参阅:如何启用或禁用 Apport?。
要永久禁用,请编辑/etc/apport/crashdb.conf
文件并注释以下行:
'problem_types': ['Bug', 'Package'],
#
在行首添加井号 ( )。
要禁用崩溃报告(恢复正常),请删除井号(与原来相同)。
您还可以检查core_pattern
内核如何处理核心转储:
$ cat /proc/sys/kernel/core_pattern
|/usr/share/apport/apport %p %s %c
因此即使核心文件被禁用ulimit
,apport
仍然会捕获崩溃。
也可以看看:
- 如何在 Linux 中生成核心转储?
- 核心已转储,但核心文件不在当前目录中?
- 对于 macOS,请参阅:如何在 Mac OS X 中生成核心转储?
答案2
以上所有对我来说都不起作用...我看了/var/log/apport.log:
cat /var/log/apport.log
我看到了文件名:
ERROR: apport (pid 3426) Mon Nov 8 14:34:07 2021: writing core dump to core._home_guest_a_out.1000.4 ...
然后我搜索整个系统
sudo find . -name "core._home_guest_a_out.1000.4..."
我发现核心转储在/var/lib/apport/coredump/
答案3
对于那些谷歌搜索的人来说:(在我的情况下 - Ubuntu 16.04和18.04以及一个自定义应用程序)/var/crash
仍然是空的,因此处理核心创建的快速方法(假设你正在使用相关的 ulimit 内置设置) 曾是
sudo sysctl -w kernel.core_pattern=core.%u.%p.%t # to enable core generation
和
systemctl restart apport # to restore default apport settings
# which, by the way, were "|/usr/share/apport/apport %p %s %c %d %P" (without quotes)
资料来源: