@bmike me dio la mayor parte de lo que necesitaba. Algunas pistas y limitaciones adicionales.
Emacs es una aplicación que vive en /Applications/Emacs.app y tiene muchas cosas dentro de ese directorio. Finalmente lo hice paso a paso. Creé un dumpme
app:
#include <unistd.h>
#include <signal.h>
int main(int argc, char *argv[])
{
pid_t pid = getpid();
kill(pid, SIGBUS);
}
y yo hice el codesign
como se sugirió y obtuve un archivo de núcleo. Tenga en cuenta que antes de la parte del código, obtendría
zsh: bus error ./dumpme
y después del codesign
Yo lo conseguiría:
zsh: bus error (core dumped) ./dumpme
Un paso preliminar en la construcción de la Emacs
La aplicación es temacs
que es un ejecutable sin estado inicial. I codesign
y también producía un núcleo cuando se iniciaba desde el Terminal
de la mano. Luego hice el codesign
para /Applications/Emacs.app/Contents/MacOS/Emacs
y recibí este desagradable mensaje:
codesign -s - -f --entitlements tmp.entitlements /Applications/Emacs.app/Contents/MacOS/Emacs
/Applications/Emacs.app/Contents/MacOS/Emacs: replacing existing signature
/Applications/Emacs.app/Contents/MacOS/Emacs: code object is not signed at all
In subcomponent: /Applications/Emacs.app/Contents/MacOS/Emacs.pdmp
Una búsqueda encontró este respuesta así que retrocedí y lo hice sudo codesign -s - -f --deep --entitlements tmp.entitlements /Applications/Emacs.app
-- (Nótese la adición de --deep
). Además, sin el sudo
Tengo problemas de permisos.
Si inicio Emacs desde el Finder
o a través de open /Applications/Emacs.app
y matarlo, lo hago no obtener un archivo de núcleo. Pero si lo inicio desde mi Terminal
puntualmente lo hago. p. ej.
% /Applications/Emacs.app/Contents/MacOS/Emacs
Sospecho que hay un arreglo cuando se inicia desde Finder
también. Supongo que tiene algo que ver con la ulimit -c unlimited
que se sugiere / requiere.
Actualización:
Quita a Finder de la ecuación. Haz que la aplicación establezca el límite por sí misma.
#include <unistd.h>
#include <signal.h>
#include <sys/resource.h>
#include <stdio.h>
int main(int argc, char *argv[])
{
pid_t pid = getpid();
struct rlimit l;
int ret = getrlimit(RLIMIT_CORE, &l);
printf("getrlimit returned %d\n", ret);
printf("rlim_cur = %llu\n", l.rlim_cur);
printf("rlim_max = %llu\n", l.rlim_max);
l.rlim_cur = l.rlim_max;
printf("setrlimit returned %d\n", setrlimit(RLIMIT_CORE, &l));
printf("Time to kill myself\n");
kill(pid, SIGBUS);
}
Un Emacs.app modificado, incluso cuando se inicia desde el Finder, produce ahora un volcado del núcleo.