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

如何测试.NET Core macOS应用的Core Dump生成?求解生成失败问题

问题分析与解决方案

你操作中的核心错误

  1. C#与C函数签名不匹配
    你的C函数trigger_crash()是无参实现,但C#的DllImport却声明了两个参数(string appName, int length),调用时还未传参。这种不匹配会导致栈损坏,引发的是未定义行为而非预期的段错误,因此.NET的崩溃捕获机制无法正确触发。

  2. 环境变量可能未生效
    通过MonoBundlingExtraArgs设置的环境变量,不一定会被打包后的应用正确继承,需要验证是否真正生效。

  3. 系统core dump限制未解除
    部分系统默认限制了core文件的生成大小,导致即使触发崩溃也无法生成dump文件。


正确的原生崩溃测试步骤

1. 修正函数签名匹配问题

  • 保持C代码无参:
    #include <stdio.h>
    
    void trigger_crash() {
        int *ptr = NULL;
        *ptr = 42; // 触发标准段错误
    }
    
  • 修正C#的DllImport声明与调用:
    public class SigHandler {
        [DllImport("handler", CallingConvention = CallingConvention.Cdecl)]
        public static extern void trigger_crash(); // 与C函数签名严格匹配
    
        public void TriggerSegfault() {
            trigger_crash(); // 正确调用无参函数
        }
    }
    

2. 确保环境变量生效

  • 验证环境变量:启动应用后,执行ps eww <pid>(Linux/macOS),检查输出中是否包含以下变量:
    COMPlus_DbgEnableMiniDump=1
    COMPlus_EnableCrashReport=1
    COMPlus_EnableDumpOnSigTerm=1
    
  • 手动设置环境变量(替代MonoBundling配置):如果上述验证未找到变量,可在启动应用前手动设置:
    export COMPlus_DbgEnableMiniDump=1
    export COMPlus_EnableCrashReport=1
    export COMPlus_EnableDumpOnSigTerm=1
    ./YourAppBundle
    

3. 解除系统core dump限制

  • Linux/macOS下,先执行以下命令解除core文件大小限制:
    ulimit -c unlimited
    
  • macOS额外检查:确认/cores目录存在且有写入权限,可通过sysctl kern.corefile查看默认core文件路径。

4. 可选:指定Dump生成路径

添加环境变量指定可写入的dump目录,避免权限问题:

export COMPlus_DbgMiniDumpPath="/tmp/dumps"
mkdir -p /tmp/dumps

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 02:33:33