英文:
Dumping core on segmentation faults
问题
我正在编写一个C程序(作为练习),其中可以通过选项--segfault
来指定程序触发段错误。另外,我还要有一个选项--dump-core
,在段错误时会将核心转储。我无法找到关于如何通过C强制进行核心转储的信息。如何实现这一点?
我希望它可以在MacOS和Linux上运行。
英文:
I am writing a C program (as an exercise), where you can specify the program to segfault with an option --segfault
. Additionally, I am to have an option --dump-core
where you dump core on segmentation faults. I've been unable to find information on how to force a core dump via C. How can one do this?
I'd like it to port to MacOS and Linux.
答案1
得分: 3
关于在段错误时程序是否会转储核心,实际上并不应该由程序本身决定,而应由用户和/或系统管理员决定。所以在我看来,这不是一个程序应该提供的明智选项。
尽管如此,控制是否生成核心转储的最常见方法是通过核心文件大小的资源限制(rlimit)。如果设置为零,将不会生成核心转储。通常用户会在其shell中使用ulimit -c XXX
或类似的方式来设置这个值。但是,您的程序也可以尝试使用setrlimit(2)
系统调用来设置它。例如,您可以执行以下操作:
struct rlimit r;
getrlimit(RLIMIT_CORE, &r);
r.rlim_cur = r.rlim_max;
setrlimit(RLIMIT_CORE, &r);
以将限制设置为其最大允许值。但是,最大允许值可能是0(由您的进程的某个祖先设置),在这种情况下,您无法增加它。
还有其他可能会影响是否可能生成核心转储的系统设置,您可能没有足够的权限来修改这些设置。Linux的core(5)
手册页解释了必要的条件。
英文:
[tag:linux]
Whether a program dumps core on segfault is not really supposed to be left up to the program itself, but rather up to the user and/or sysadmin. So in my opinion, this isn't really a sensible option for a program to provide.
Having said that, the most common way to control whether a core dump is produced is via the rlimit for core file size. If it is zero, no core dumps are produced. Normally the user would set this with ulimit -c XXX
or equivalent in their shell. However your program can also attempt to set it with the setrlimit(2)
system call. For instance you might do
struct rlimit r;
getrlimit(RLIMIT_CORE, &r);
r.rlim_cur = r.rlim_max;
setrlimit(RLIMIT_CORE, &r);
to set the limit equal to its maximum allowed value. However, that maximum allowed value might be 0 (set by some ancestor of your process) in which case you cannot increase it.
There are other system settings that might affect whether core dumps are possible, which you may or may not have enough privileges to modify. The Linux core(5)
man page explains the necessary conditions.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论