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

如何在macOS上通过编程方式触发SIGSEGV信号?

在macOS上编程触发SIGSEGV的方法

首先要明确:macOS底层基于Mach内核,EXC_BAD_ACCESS是Mach层的异常类型,系统会自动将其转换为BSD层的SIGSEGV(或SIGBUS)信号。你在调试器中看到EXC_BAD_ACCESS,是因为调试器直接捕获了底层Mach异常,但进程实际收到的是SIGSEGV信号。如果直接在终端运行程序,会看到Segmentation fault: 11的提示,这就是SIGSEGV触发的崩溃。

下面是几种直接触发SIGSEGV的编程方法:

方法一:直接调用信号触发函数

使用raise()函数直接发送SIGSEGV信号,这是最直接的方式:

#include <signal.h>
#include <stdio.h>

int main() {
    printf("Triggering SIGSEGV...\n");
    raise(SIGSEGV);
    return 0;
}

编译运行后,终端会输出Segmentation fault: 11,说明SIGSEGV已触发。

方法二:访问空指针

直接对空指针进行写操作,会触发EXC_BAD_ACCESS Mach异常,系统会将其转换为SIGSEGV信号:

#include <stdio.h>

int main() {
    int *ptr = NULL;
    *ptr = 42; // 访问空指针
    return 0;
}

调试器中会显示EXC_BAD_ACCESS,但终端运行时会提示Segmentation fault: 11,对应SIGSEGV。

方法三:写入只读内存区域

通过mmap申请一块只读内存,然后尝试写入,这种内存权限违规会触发SIGSEGV:

#include <stdio.h>
#include <sys/mman.h>
#include <stdlib.h>

int main() {
    // 申请一页只读内存
    void *addr = mmap(NULL, 4096, PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
    if (addr == MAP_FAILED) {
        perror("mmap failed");
        exit(1);
    }
    printf("Writing to read-only memory...\n");
    *(int *)addr = 0; // 写入只读内存,触发SIGSEGV
    munmap(addr, 4096);
    return 0;
}

关于你原来的代码

你之前的循环代码会不断递增指针并写入,最终访问到非法内存,触发EXC_BAD_ACCESS Mach异常,系统同样会转换为SIGSEGV信号。你看到的EXC_BAD_ACCESS是调试器的展示,而非信号本身。如果直接在终端运行该程序,会看到Segmentation fault: 11的崩溃提示,说明实际收到的是SIGSEGV。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 17:32:16