Linux 在/var/crash中没有堆芯转储
我试图了解一点核心转储是如何工作的 我使用test.c文件生成核心转储:Linux 在/var/crash中没有堆芯转储,linux,coredump,Linux,Coredump,我试图了解一点核心转储是如何工作的 我使用test.c文件生成核心转储: #include <stdio.h> void foo() {
#include <stdio.h>
void foo()
{
int *ptr = 0;
*ptr = 7;
}
int main()
{
foo();
return 0;
}
当我运行/test时,它会给我以下消息
Segmentation fault (core dumped)
我的档案
/proc/sys/kernel/core_pattern
包含:
|/usr/share/apport/apport %p %s %c %d %P
我检查了我是否有写入目录的权限
/var/crash/
但在核心转储之后,此文件夹中没有任何内容(/var/crash/)。
我使用的是Linux 17.04版。
你知道这里会出什么问题吗
编辑
我忘了提到我设置了以下限制:
ulimit -c unlimited
那么
ulimit -c
内容如下:
unlimited
我甚至试着按照他们在“如何启用apport”一节中说的做,所以我在前面添加了一个哈希符号
'problem_types': ['Bug', 'Package']
但是在所有这些情况下,在/var/cash中找不到核心转储文件,您在计算机中为核心转储文件设置了什么文件大小限制? 您可以使用
$ ulimit -c
如果设置为0,则不会生成CoreDump-这是大多数发行版的默认设置
您可以通过将coredumps设置为“unlimited”或使用特定的文件大小限制来启用它
$ ulimit -c unlimited
该链接包含一个关于为什么不生成coredump的检查表。添加下面的列表,以防将来无法访问链接
- 堆芯将大于当前的限制
- 您没有转储核心(目录和文件)所需的权限。请注意,核心转储放在转储进程的当前目录中,该目录可能与父进程不同
- 验证文件系统是否可写,是否有足够的可用空间
- 如果工作目录中存在名为core的子目录,则不会转储core
- 如果名为core的文件已经存在,但有多个硬链接,内核将不会转储core
- 验证可执行文件的权限,如果可执行文件启用了suid或sgid位,则默认情况下将禁用核心转储。如果您对该文件具有执行权限,但没有读取权限,则情况也是如此
- 验证进程是否未更改工作目录、内核大小限制或可转储标志
- 某些内核版本无法转储具有共享地址空间(又名线程)的进程。较新的内核版本可以转储此类进程,但会将pid附加到文件名
- 可执行文件可以是不支持核心转储的非标准格式。每个可执行格式必须实现一个核心转储例程
- 分段错误实际上可能是内核Oops,请检查系统日志中是否有Oops消息
- 应用程序调用exit()而不是使用核心转储处理程序
在终端上,应该返回“unlimited”,并生成核心转储。您还应该记住ulimit-c是特定于会话的。因此,如果更改一次并终止会话,则需要再次运行该命令。另外,解决方案不会在所有的外壳上都起作用。我已经试过了。我在编辑中添加了它。我看不出你是如何从“pipe to
apport”变为对一个不相关目录的权限/var/crash/
我在互联网上读到apport将核心转储放在/var/crash目录中的
$ ulimit -c unlimited
root - core unlimited
* - core unlimited
ulimit -c