You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在跨Linux与macOS的C程序中强制生成段错误Core Dump?

实现触发段错误并强制生成Core Dump(兼容Linux/macOS)

要实现你的需求,核心是两步:触发段错误,以及通过进程资源限制启用core dump生成。以下是兼容Linux和macOS的具体实现方案:

1. 触发段错误的方式

最直接且跨平台的方式是解引用NULL指针,或者访问非法内存地址,比如:

*(int*)NULL = 0;

这会触发SIGSEGV信号,直接导致进程段错误崩溃。

2. 启用Core Dump生成

系统默认可能限制core文件的大小(比如ulimit -c默认是0),所以需要在程序中通过setrlimit函数调整当前进程的资源限制。这个函数是POSIX标准接口,Linux和macOS都支持。

关键逻辑

通过setrlimit修改RLIMIT_CORE资源限制,将软限制和硬限制设置为无限制(RLIM_INFINITY),确保进程崩溃时能生成完整的core文件。

3. 完整示例代码

#include <stdio.h>
#include <stdlib.h>
#include <sys/resource.h>
#include <string.h>
#include <errno.h>

int main(int argc, char *argv[]) {
    int do_segfault = 0;
    int enable_core_dump = 0;

    // 解析命令行选项
    for (int i = 1; i < argc; i++) {
        if (strcmp(argv[i], "--segfault") == 0) {
            do_segfault = 1;
        } else if (strcmp(argv[i], "--dump-core") == 0) {
            enable_core_dump = 1;
        } else {
            fprintf(stderr, "未知选项: %s\n", argv[i]);
            return EXIT_FAILURE;
        }
    }

    // 配置core dump(如果指定--dump-core)
    if (enable_core_dump) {
        struct rlimit rl;
        // 获取当前core限制
        if (getrlimit(RLIMIT_CORE, &rl) == -1) {
            perror("getrlimit 失败");
            return EXIT_FAILURE;
        }
        // 设定为无限制
        rl.rlim_cur = RLIM_INFINITY;
        rl.rlim_max = RLIM_INFINITY;
        if (setrlimit(RLIMIT_CORE, &rl) == -1) {
            perror("setrlimit 失败");
            return EXIT_FAILURE;
        }
        printf("已启用core dump生成\n");
    }

    // 触发段错误(如果指定--segfault)
    if (do_segfault) {
        printf("即将触发段错误...\n");
        *(int*)NULL = 0;
    }

    return EXIT_SUCCESS;
}

4. 注意事项

  • Linux系统:若系统配置了/proc/sys/kernel/core_pattern为管道输出(例如通过systemd收集core文件),core文件不会生成在当前目录,需检查系统相关配置。
  • macOS系统:core文件默认生成在/private/cores/目录,文件名格式为core.<进程ID>,确保进程有该目录的写入权限。
  • 编译运行:直接用GCC或Clang编译即可:
    gcc -o segfault_demo segfault_demo.c
    # 测试启用core dump并触发段错误
    ./segfault_demo --dump-core --segfault
    

内容的提问来源于stack exchange,提问作者user129393192

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 10:23:28