【问题标题】:OS X: Generate core dump without bringing down the process?OS X:在不关闭进程的情况下生成核心转储?
【发布时间】:2025-11-28 18:50:01
【问题描述】:

我知道当进程崩溃时如何在 OS X 上生成核心转储,但我真正需要做的是附加到进程,生成核心转储,然后恢复该进程(不杀死它)。

很久以前(可能是一年半前)我有 C 代码可以做到这一点......它使用 OS X 内核库连接到一个进程,读取它的所有线程状态和内存,并且将其写入磁盘上的 Mach-O 文件。这很好用(这正是我正在寻找的),但现在我似乎无法为我的生活找到该代码。我似乎记得代码与 OS X 系统内部书有些相关,但这只是一个模糊的回忆。

有谁知道我正在谈论的代码并可以指出它吗?如果没有,是否有人知道最好使用一些示例代码来做这件事的好方法?

编辑:这是答案。

信息:http://osxbook.com/book/bonus/chapter8/core/

将为您完成此任务的程序:http://osxbook.com/book/bonus/chapter8/core/download/gcore-1.3.tar.gz

【问题讨论】:

    标签: c debugging macos coredump


    【解决方案1】:

    相信你在找this information

    具体来说:

    /* UNIX Third Edition, circa early 1973 */
    /* ken/sig.c */
    
    core()
    {
    int s, *ip;
    extern schar;
    
    /* u is the user area */
    u.u_error = 0;          /* reset error code to "no error" */
    u.u_dirp = "core";      /* file name to search for */
    ip = namei(&schar, 1);  /* do search; schar means it's a kernel string */
    
    if (ip == NULL) {       /* failed to find */
        if (u.u_error)      /* because of some error */
            return(0);      /* so bail out */
        ip = maknode(0666); /* didn't exist; so create it */
    }
    
    if (!access(ip, IWRITE)) { /* check "write" permission; 0 means OK */
        itrunc(ip);            /* truncate the core file */
    
        /* first we write the user area */
        u.u_offset[0] = 0;     /* offset for I/O */
        u.u_offset[1] = 0;     /* offset for I/O */
        u.u_base = &u;         /* base address for I/O (user area itself) */
        u.u_count = USIZE*64;  /* bytes remaining for I/O; USIZE=8 */
        u.u_segflg = 1;        /* specify kernel address space */
        writei(ip);            /* do the write */
    
        /*
         * u_procp points to the process structure
         * p_size is the size of the process's swappable image (x 64 bytes) */
         */
        s = u.u_procp->p_size - USIZE; /* compute size left to write */
    
        /*
         * This sets up software prototype segmentation registers to implement
         * text(=0 here), data(=s here), and stack(=0 here) sizes specified.
         */
        estabur(0, s, 0);
    
        u.u_base = 0;          /* base address for I/O (start of space) */
        u.u_count = s*64;      /* s is in units of 64 bytes, so adjust */
        u.u_segflg = 0;        /* specify user address space */
        writei(ip);            /* do the write */
    }
    iput(ip);                  /* decrement inode reference count */
    return(u.u_error==0);      /* done */
    }
    

    【讨论】:

    • 上面的代码是他将链接 gzip 中的代码与之进行比较的代码,所以这是不正确的,但链接(特别是 gcore gzip)正是我想要的。谢谢!
    最近更新 更多