2 votos

Archivos centrales de MacOS: ¿cómo puedo habilitarlos y puedo habilitarlos para aplicaciones específicas?

He encontrado discusiones en estos sitios sobre los archivos de núcleo de MacOS, pero las que he encontrado son antiguas y no abordan un archivo de núcleo creado por una aplicación que se lanza desde el Finder.

Me gustaría ayudar en la depuración de Emacs. Lo he construido yo mismo y lo tengo para que se lance desde el Finder. Si / cuando se vuelca el núcleo, un cuadro de diálogo Informe viene, pero que realmente no va a ayudar a mí o los desarrolladores de Emacs, pero un archivo de núcleo haría. El problema es que /cores está actualmente vacío. Veo los informes en ~/Library/Logs/DiagnosticReports/Retired/Emacs-* pero son archivos de texto probablemente lo que se envía en el diálogo "Informe".

Entiendo que los archivos de núcleo son grandes y feos y plantean dudas a los clientes, así que entiendo por qué están desactivados por defecto. Lo que me gustaría hacer es volver a activarlos. Y, si es posible, activarlo sólo para aplicaciones específicas como Emacs para evitar que /cores se llene de basura inútil.

TL; DR --

  1. ¿Cómo puedo activar los archivos centrales para las aplicaciones lanzadas desde el Finder en 12.3 Monterey?
  2. ¿Puedo activar la creación de archivos de núcleo para aplicaciones específicas?

1voto

Oskar Puntos 1242

En Monterey, puede añadir derechos para generar un núcleo por aplicación de acuerdo con lo siguiente entrada detallada de Apple Developer :

Lo he editado para que se adapte a tu caso - disculpa si meto la pata en la traducción

Desde la línea de comandos

Configure the core limit:
% ulimit -c unlimited
Make a copy of your emacs that’s failing to generate core.
% cp /path/to/emacs .
Create a dummy .entitlements with the com.apple.security.get-task-allow entitlement set:
% /usr/libexec/PlistBuddy -c "Add :com.apple.security.get-task-allow bool true" tmp.entitlements
File Doesn't Exist, Will Create: tmp.entitlements
Re-sign emacs with those entitlements:
% codesign -s - -f --entitlements tmp.entitlements ./emacs 
CrashSelf: replacing existing signature
Run that copy:
% ./emacs

1voto

JimM NH Puntos 1

@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.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X