2010-08-05 9 views
4

Je reçois un accident intéressant que je ne semblent jamais à reproduire sur le simulateur:Comment diagnostiquer un KERN_PROTECTION_FAILURE

Exception Type: EXC_BAD_ACCESS (SIGBUS) 
Exception Codes: KERN_PROTECTION_FAILURE at 0x00000008 
Crashed Thread: 0 

Thread 0 Crashed: 
0 libobjc.A.dylib     0x3212e86c 0x3212c000 + 10348 
1 StockTwits      0x00016b06 0x1000 + 88838 
2 Foundation      0x30718422 0x306db000 + 250914 
3 Foundation      0x307183a4 0x306db000 + 250788 
4 CFNetwork      0x30933e74 0x30923000 + 69236 
5 CFNetwork      0x30927b70 0x30923000 + 19312 
6 CFNetwork      0x30927e62 0x30923000 + 20066 
7 CFNetwork      0x30927a60 0x30923000 + 19040 
8 CFNetwork      0x30927a12 0x30923000 + 18962 
9 CFNetwork      0x30927990 0x30923000 + 18832 
10 CFNetwork      0x3092790e 0x30923000 + 18702 
11 CoreFoundation     0x30352a86 0x302e1000 + 465542 
12 CoreFoundation     0x30354768 0x302e1000 + 472936 
13 CoreFoundation     0x30355504 0x302e1000 + 476420 
14 CoreFoundation     0x302fe8e4 0x302e1000 + 121060 
15 CoreFoundation     0x302fe7ec 0x302e1000 + 120812 
16 GraphicsServices    0x31a776e8 0x31a74000 + 14056 
17 GraphicsServices    0x31a77794 0x31a74000 + 14228 
18 UIKit       0x323272a0 0x00 + 25248 
19 UIKit       0x32325e10 0x00 + 19984 
20 StockTwits      0x00002fd4 0x1000 + 8148 
21 StockTwits      0x00002fa4 0x1000 + 8100 

Je NSZombies permis ainsi que l'enregistrement de la pile. Passer à travers l'analyseur statique pour s'assurer que tous les objets sont conservés et relâchés correctement, bien que j'ai le sentiment qu'il est toujours lié à conserver/relâcher.

Pensées?

+1

Ne passez-vous pas un int de valeur 8 (0x00000008) à la place d'un pointeur? – mvds

+0

Pouvez-vous expliquer un peu plus? Intéressant ... –

+1

Voir cette question pour plus d'informations: http://stackoverflow.com/questions/1282428/whats-the-difference-between-kern-invalid-address-and-kern-protection-failure – mvds

Répondre

0

Vous devez déréférencer un pointeur NULL, autre que ce blocage ne se produit pas. L'analyseur statique est un bon outil pour obtenir des conseils sur les choses que vous faites mal. Cependant, ne pas trouver une erreur ne signifie pas que votre programme est sans bug. Également allumer des zombies n'aide pas toujours. Parfois, c'est juste un simple oubli.

Le fait que le simulateur ne montre pas ce problème ne dit pas trop. En fin de compte, c'est une machine différente avec un processeur différent et une architecture différente. Il y a des occasions où le faux code fonctionne bien sur une plate-forme, mais se bloque sur l'autre. Vous devriez vous re-symboliser la trace de la pile et jeter un coup d'œil à la fonction dans laquelle elle se bloque. Si vous voulez plus d'aide, il est probablement préférable de poster une partie du code ici.

Encore un conseil: ces problèmes sont souvent répartis sur plusieurs méthodes. L'analyseur ne voit qu'une méthode à la fois. Vous devriez jeter un coup d'œil à ce qui est arrivé aux objets dans votre méthode d'écrasement AVANT qu'il ne soit entré.

+0

Comment puis-je re -symboliquer? –

+1

Le plus simple est de ne pas compiler avec des optimisations. Créez une version de configuration de débogage contenant des symboles de débogage. Pour Symbolicating vous pourriez trouver la réponse ici: http://stackoverflow.com/questions/1460892/symbolicating-iphone-app-crash-reports –

+0

Pour les futurs lecteurs, déréférencer un pointeur NULL n'est pas la seule raison pour laquelle ce crash se produit, car il est indiqué dans le document d'Apple 'Le processus a tenté d'accéder à la mémoire invalide, ou il a tenté d'accéder à la mémoire d'une manière non autorisée par le niveau de protection de la mémoire (par exemple, écrire dans la mémoire morte). : //stackoverflow.com/questions/23717889/exc-bad-access-kern-protection-failure) montre ce type d'exception en raison d'un débordement de pile. – BridgeTheGap