Xcode LLDB: Cómo no detenerse pero pasar señales
Pregunta: ¿Cómo puedo configurar / indicar a LLDB de Xcode que no se detenga en – y pase una señal específica para una herramienta de línea de comandos?
Antecedentes:
Estamos usando código de terceros que depende de SIGUSR1.
Al ejecutar en Xcode 13, LLDB se detiene en esa señal y la suprime (es decir, no la pasa).
Nuestro objetivo es una herramienta de línea de comandos, no una NSApplication.
He encontrado esta respuesta a una pregunta muy similar (la única diferencia que veo es que es una NSApplication). Dice que se debe utilizar este comando:
process handle SIGUSR1 -n true -p true -s false
en un Punto de interrupción simbólico, estableciendo main()
como símbolo.
Pero esto nos da:
error: target no válido, cree un objetivo utilizando el comando ‘target create’
He intentado con un punto de interrupción “normal” en main()
:
Y con un Punto de interrupción simbólico, utilizando main()
como símbolo:
Ambos puntos de interrupción registran el error descrito, lo que demuestra que:
- El punto de interrupción funciona
- El comando se procesa pero causa el error
La configuración del esquema de Xcode está establecida para debug
y el ejecutable correcto:
Cuando utilizo el comando en la consola de LLDB (en lugar de Xcode), funciona correctamente, por lo que el comando parece estar bien.
Cómo reproducirlo de manera sencilla:
- En Xcode, seleccionar “nuevo proyecto” -> “Herramienta de línea de comandos”
- Nombrar como “TestLLDB” y guardar en cualquier lugar
- Establecer un punto de interrupción en la línea 13 de
main()
(NSLog…) - Editar el punto de interrupción y agregar la acción “Comando del depurador”: “process handle SIGUSR1 -n true -p true -s false”
- Ejecutar el proyecto
- Comprobar la consola para ver el error mencionado anteriormente
davy.ai
Para configurar LLDB de Xcode para que no se detenga en y pase una señal específica para una herramienta de línea de comandos, siga estos pasos:
main()
. Para hacer esto, haga clic en el ícono “+” en la esquina inferior izquierda del navegador de puntos de interrupción y seleccione “Añadir punto de interrupción simbólico…”. En la ventana emergente que aparece, escribamain
en el campo “Símbolo” y presione “Enter” para crear el punto de interrupción.process handle SIGUSR1 -n true -p true -s false
, tal como se describe en la respuesta de Stack Overflow.Ahora, cuando ejecute su herramienta de línea de comandos, LLDB no se detendrá en la señal
SIGUSR1
y la pasará a su aplicación.Tenga en cuenta que si aún recibe el mensaje de error “destino no válido”, podría ser porque su punto de interrupción no está alcanzando la función
main()
. Asegúrese de que su punto de interrupción esté alcanzando la función correcta e intente nuevamente.