localizar - ¿Alguna manera de saber si mi aplicación de iPhone se está ejecutando bajo el depurador en tiempo de ejecución?
icloud (2)
Me gustaría que mi código de manejo de errores se comportase de manera diferente si se ejecuta bajo el depurador. Específicamente, si estoy ejecutando en un teléfono, no conectado a un depurador y fallo una afirmación, deseo enviar el error a mi servidor. Cuando estoy bajo gdb, quiero entrar en el depurador.
Aunque puedo imaginar cómo Apple escribiría el código, no puedo encontrar ninguna documentación de una forma de tiempo de ejecución para probar la presencia del depurador.
¿Por qué no redefinir assert para hacer lo que quieras, cuando no se compila para la depuración?
Otra opción es crear su propia función afirmar, donde luego puede agregar un punto de interrupción al cargar en GDB.
El prototipo afirmar es
void assert (int expresión);
void assert(int expression)
{
if( !expression )
{
// enable break point here
// log to server
}
}
o agregue el punto de interrupción en el código de registro al servidor.
El método descrito aquí funcionó bien para mí
-(void)viewDidLoad
colocándolo en -(void)viewDidLoad
- (void)viewDidLoad {
[super viewDidLoad];
int mib[4];
size_t bufSize = 0;
int local_error = 0;
struct kinfo_proc kp;
mib[0] = CTL_KERN;
mib[1] = KERN_PROC;
mib[2] = KERN_PROC_PID;
mib[3] = getpid();
bufSize = sizeof (kp);
if ((local_error = sysctl(mib, 4, &kp, &bufSize, NULL, 0)) < 0) {
label.text = @"Failure calling sysctl";
return;
}
if (kp.kp_proc.p_flag & P_TRACED)
label.text = @"I am traced";
else
label.text = @"I am not traced";
}