va_list crash en el simulador de 64 bits

Cuando se usa el simulador de 64 bits para iOS, la function de inicio se bloquea con el error EXC_BAD_ACCESS (código = 1). ¿Alguien sabría por qué? Y cómo arreglarlo correctamente.

Para más información: 'formatear' no es nulo, y funciona bien en un simulador de 32 bits y cualquier dispositivo iPhone / iPad de 32/64 bits.

void Log (NSString * format, ...) { va_list argList; va_start(argList, format); NSLogv(format, argList); NSString* string = [[NSString alloc] initWithFormat: format arguments: argList]; va_end(argList); ... } 

llamado lo primero en AppDelegate

 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { Log(@"app options %@", launchOptions); ... } 

De alguna manera, el comentario de A-Live me dio una idea y descubrí cómo evitar el choque.

Estaba usando argList dos veces en el mismo bloque va_start / va_end

 [[NSString alloc] initWithFormat: format arguments: argList]; 

y

 NSLogv(format, argList); 

Parece que a un simulador de 64 bits de iOS no le gusta. No sé por qué funciona, solo encuentra en cualquier otra placa (y dispositivos reales también). Así que lo arreglé haciendo dos bock deferentes como ese

 va_list argList; va_start(argList, format); NSString* string = [[NSString alloc] initWithFormat: format arguments: argList]; va_end(argList); va_start(argList, format); NSLogv(format, argList); va_end(argList); 

Espero que ayude a alguien. Si alguien sabe por qué, todavía tengo curiosidad por saber sobre eso.

También me encontré con este problema anoche. He archivado un radar para esto.

Mi trabajo ahora mismo es hacer una va_copy:

  NSString *description = nil; va_list vaListCopy; va_copy(vaListCopy, arguments); if (format) { description = [[NSString alloc] initWithFormat:format arguments:vaListCopy]; } 

y luego llamo al siguiente método

  [[BKAssertRecordHandler currentHandler] recordFailureWithCondition:condition function:function file:file line:line description:format arguments:arguments backtrace:backtrace]; 

En otras palabras, uso la copy localmente. He hecho algo de experimentación. Hice una copy si va_list y luego la comparé con el original, después de que el original se usó como tal.

  description = [[NSString alloc] initWithFormat:format arguments:arguments]; 

Salida durante la comparación de bytes: falta de coincidencia en el índice 8 (orig = 0xd8 copy = 0xe0). Antes de la llamada, también hice la comparación de byte, y fueron iguales.

Entonces, por alguna razón en el simulador de 64 bits, initWithFormat: arguments y NSLogv corrompen la va_list.