Objective-C: cómo forzar la baja memory en el simulador de iOS

Tengo un error que algunos usuarios tienen de EXC_BAD_ACCESS cuando su dispositivo tiene poca memory. La traza de la stack apunta a la siguiente línea if , y creo que es debido a la UTF8String que se está desasignando y aún se está utilizando:

 dispatch_sync(dbQueue, ^{ if (sqlite3_bind_text(sql_stmt, 1, pid.UTF8String, -1, SQLITE_STATIC) != SQLITE_OK) { ... 

Estoy teniendo dificultades para reproducir el problema en mi final, ¿cómo puedo forzar o simular poca memory en el simulador o en un dispositivo?

Actualizar:

Intenté agregar un punto de interrupción a la línea de arriba y luego usar la opción Simulator -> Simulate Memory Warning, pero todavía no puedo reproducir el error EXC_BAD_ACCESS.

En el simulador hay un elemento de menu: Hardware: simular advertencia de memory

o

command de cambio M

En el menu del simulador: Hardware-> Simular advertencia de memory .

Actualizar

Si está seguro de que su aplicación se bloqueó en sqlite3_bind_text, supongo que el problema más potencial podría ser que pid.UTF8String sea NULL a veces, en cuyo caso causa un locking. Además, no es probable que pid o pid.UTF8String se desasigne cuando se utiliza, puede verificar el informe de lockings (si tiene alguno) y comprobar la dirección de la memory que provocó el EXC_BAD_ACCESS, por ejemplo, si tiene EXC_BAD_ACCESS CODE=2 ADDRESS=0x00000000 , significa pid.UTF8String es de hecho un puntero NULL, si la dirección no es 0x0, entonces, es otro problema (muy poco probable en su caso).

Como sugerencia, agregue nil check a su código:

 if (pid) { if (sqlite3_bind_text(sql_stmt, 1, pid.UTF8String, -1, SQLITE_STATIC) != SQLITE_OK){ // do your stuff } } else { sqlite3_bind_null(sql_stmt,1); } 

En el lado izquierdo de su pantalla XCode, puede ver un button para abrir Debug Navigator, allí puede ver la cantidad de memory que está usando actualmente su aplicación y la cantidad que es gratuita.

Si lo analiza, se dará count de que la memory disponible para su simulador es la misma que la de su computadora, por lo que sugiero que ejecute alguna aplicación que use mucha memory simultáneamente con el simulador.

Si tiene un iPad disponible, podría ser más fácil, lo que suelo hacer es ir a este website y copyr tanto de la tabla Unicode como sea posible, para que se almacene en el Tablero de Cartón

Muchas veces, este tipo de errores son el resultado de una "tormenta perfecta" de circunstancias (es decir, condiciones de la carrera, tareas infrecuentes que se ejecutan en el momento "correcto", etc.) y, a menudo, el tipo de circunstancias que simplemente no puede anticipar; si supieras cómo reproducirlo de manera confiable, probablemente también sabrás cómo solucionarlo. Lo mejor que puede esperar es tratar de boost sus probabilidades statistics de reproducirlo en un entorno (el depurador) donde, con suerte, podría dar sentido a lo que está sucediendo.

Vea esta publicación: Desarrollo de iOS: ¿Cómo puedo inducir advertencias de poca memory en el dispositivo? . Al simular las advertencias de memory mediante progtwigción, puede (por ejemplo) utilizar un timer de repetición para causar una advertencia de memory 1 / segundo (mucho más rápido que eso y puede encontrarse con otros problemas, lo que hará que persiga su queue más que resolver su problema original ), eliminando la necesidad de hacerlo a mano repetidamente.

Antes de ejecutar la testing, también puede establecer puntos de interrupción en las siguientes ubicaciones:

 Symbol Module ====== ====== objc_exception_throw libobjc.A.dylib -[NSException raise] CoreFoundation 

Además, establezca puntos de interrupción en todas las excepciones de Objective-C. Establecer un punto de interrupción le permitirá inspeccionar el contenido de la memory antes de que la exception realmente sea lanzada por el time de ejecución, lo que le brindará una oportunidad mucho mejor de comprender el problema cuando ocurra. Cuando capture (y si) el choque, inspeccione pid , pid.UTF8String y sql_stmt , ya que parecen los culpables más probables.

Ejecute su aplicación e inicie la activación del timer. Esto no causará necesariamente o directamente el locking que está buscando, pero probablemente sea mucho más probable que ocurra con el time sin tener que retenerlo manualmente; puede disparar el timer y esperar (es decir, hacer algo más productivo) hasta que vea el choque.