OS X: générer un core dump sans interrompre le processus?

Je sais comment générer un core dump sous OS X lorsqu’un processus se bloque, mais ce que j’ai vraiment besoin de faire, c’est de l’attacher à un processus, de générer un core dump, puis de reprendre ce processus (sans le tuer).

Il y a longtemps (il y a peut-être un an et demi), j’avais le code C pour le faire. Il utilisait les bibliothèques du kernel OS X pour se connecter à un processus, lire tous ses états de thread et sa mémoire et l’écrire dans un fichier Mach-O sur le disque. Cela a très bien fonctionné (et c’est exactement ce que je cherche), mais je ne peux pas trouver ce code pour la vie. Il semble que je me souvienne que le code était quelque peu lié au livre d’internals du système OS X, mais ce n’est qu’un vague souvenir.

Est-ce que quelqu’un connaît le code dont je parle et pourrait me pointer dessus? Sinon, est-ce que quelqu’un connaît un bon moyen de le faire de préférence avec un exemple de code?

Edit: Voici la réponse.

Informations: http://osxbook.com/book/bonus/chapter8/core/

Programme qui le fera pour vous: http://osxbook.com/book/bonus/chapter8/core/download/gcore-1.3.tar.gz

Je crois que vous recherchez cette information

Plus précisément:

/* 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 ssortingng */ 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 */ }