设备和模拟器上的调试工作时,临时 iPhone SIGSEGV 崩溃
Posted
技术标签:
【中文标题】设备和模拟器上的调试工作时,临时 iPhone SIGSEGV 崩溃【英文标题】:Ad Hoc iPhone SIGSEGV crash while Debug on device & simulator works 【发布时间】:2012-08-21 17:44:31 【问题描述】:应用程序在我尝试登录后立即崩溃,因此这不是看门狗内存问题
原因:_mh_execute_header 应用程序在尝试使用 ASIHTTPRequest 发出网络请求时崩溃。 请求永远不会触及服务器。 ASIHTTPRequest:我使用 -fno-objc-arc 从 ARC 中省略 ASIHTTPRequest。
我相信以下调用导致了我的问题,因为当我发出请求时,我的调用甚至从未触及服务器。任何帮助将不胜感激!
呼叫:
NSDictionary *response = [[NetworkManager sharedManager] loginWithName:name password:pwd];
方法:
- (NSDictionary *)loginWithName:(NSString *)name password:(NSString *)pwd
NSURL *url = [NSURL URLWithString:@"http://www.test.com/keys"];
NSArray *values = [NSArray arrayWithObjects:@"iphone", @"iphone@test.com", name, pwd, nil];
NSArray *keys = [NSArray arrayWithObjects:@"name", @"email", @"username", @"password", nil];
NSDictionary *response = [self startNetworkPOSTRequestWithUrl:url
postValues:values
forKeys:keys];
return response;
堆栈跟踪:
Thread: Unknown Name (Crashed)
0 libobjc.A.dylib 0x37b9ef7e objc_msgSend + 21
1 Test 0x000dcda5 _mh_execute_header + 126373
2 Test 0x000dc4b9 _mh_execute_header + 124089
3 Test 0x000cd801 _mh_execute_header + 63489
4 Test 0x000ce39d _mh_execute_header + 66461
5 Test 0x000cf561 _mh_execute_header + 71009
6 Test 0x000d3e3d _mh_execute_header + 89661
7 UIKit 0x3334ccbd -[UITextField keyboardInput:shouldInsertText:isMarkedText:] + 148
8 UIKit 0x3334cc1f -[UIFieldEditor keyboardInput:shouldInsertText:isMarkedText:] + 94
9 UIKit 0x3334cbb9 -[UIKeyboardImpl callShouldInsertText:] + 108
10 UIKit 0x3334bb5b -[UIKeyboardImpl addInputString:fromVariantKey:] + 114
11 UIKit 0x3334bae1 -[UIKeyboardImpl handleStringInput:fromVariantKey:] + 164
12 UIKit 0x3334a775 -[UIKeyboardImpl handleKeyEvent:] + 1320
13 UIKit 0x334e48a3 -[UIKeyboardLayoutStar sendStringAction:forKey:isPopupVariant:] + 486
14 UIKit 0x33348dcd -[UIKeyboardLayoutStar touchUp:] + 3196
15 UIKit 0x333480fd -[UIKeyboardLayout touchesEnded:withEvent:] + 380
16 UIKit 0x3324b92b -[UIWindow _sendTouchesForEvent:] + 318
17 UIKit 0x3324b319 -[UIWindow sendEvent:] + 380
18 UIKit 0x33231695 -[UIApplication sendEvent:] + 356
19 UIKit 0x33230f3b _UIApplicationHandleEvent + 5826
20 GraphicsServices 0x373f022b PurpleEventCallback + 882
21 CoreFoundation 0x357d1523 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 38
22 CoreFoundation 0x357d14c5 __CFRunLoopDoSource1 + 140
23 CoreFoundation 0x357d0313 __CFRunLoopRun + 1370
24 CoreFoundation 0x357534a5 CFRunLoopRunSpecific + 300
25 CoreFoundation 0x3575336d CFRunLoopRunInMode + 104
26 GraphicsServices 0x373ef439 GSEventRunModal + 136
27 UIKit 0x3325fcd5 UIApplicationMain + 1080
28 Test 0x000bfc1b _mh_execute_header + 7195
startNetworkPOSTRequestWithUrl 方法的内容:
- (NSDictionary *)startNetworkPOSTRequestWithUrl:(NSURL *)url
postValues:(NSArray *)values
forKeys:(NSArray *)keys
NSLog(@"saved user info: %@", values);
__unsafe_unretained __block ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:url];
__block NSDictionary *response;
int num = [values count];
__block BOOL success = YES;
for (int i = 0; i < num; i++)
[request setPostValue:[values objectAtIndex:i] forKey:[keys objectAtIndex:i]];
[request setDelegate:self];
[request setUseCookiePersistence:NO];
[request setCompletionBlock:^
NSString *responseString = [request responseString];
response = [responseString JSONValue];
];
[request setFailedBlock:^
NSError *error = [request error];
NSLog(@"\nError: %@", error.localizedDescription);
NSString *responseString = [request responseString];
NSLog(@"\nError Response: %@", responseString);
NSLog(@"\nurl: %@",url);
success = NO;
];
[request startSynchronous];
if (success == NO)
return nil;
if (![(NSString *)[response valueForKey:@"status"] isEqualToString:@"success"])
NSLog(@"response: %@",response);
return nil;
return (NSDictionary *)[response valueForKey:@"response"];
【问题讨论】:
这种情况是否只发生在 Ad-Hoc 构建中?我们可以看到 startNetworkPOSTRequestWithUrl 调用吗? 【参考方案1】:我发现另一个奇怪的解决方法可以解决我的一些问题:
在 Target > Build Settings > Apple LLVM compiler 4.0 - Code Generation > Optimization Level
下,我将 Ad Hoc Optimization 更改为 None
- 远离默认的 Fastest, Smallest [-Os]
,这使我可以创建一个有效的 ipa。
虽然这确实提供了一种解决方法,但考虑到我不进行优化可能会导致其他后果,它并不理想。
但我确实认为这暗示我的一些潜在问题与记忆有关 - 任何人都可以对此提供任何见解吗?
【讨论】:
除了 ASIHTTPRequest 库之外,您正在使用 ARC,对吗?我觉得这可能是原因,因为这在我看来就像你正在释放一个已经被释放的对象。编辑:澄清一下,你不要在 AHR 上使用 ARC,因为他们自己处理。 是的,我从 ARC 中排除了 ASIHTTPRequest。此外,即使我将优化级别更改为“快速”,它仍然会崩溃。 我提出了一个关于优化问题的新问题:***.com/questions/12101362/…【参考方案2】:您正在执行同步请求,因此您不需要失败块或完成块。这将摆脱所有 __block 的东西,并使其在内存方面不那么奇怪。
- (IBAction)grabURL:(id)sender
NSURL *url = [NSURL URLWithString:@"http://allseeing-i.com"];
ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url];
[request startSynchronous];
NSError *error = [request error];
if (!error)
NSString *response = [request responseString];
我是从http://allseeing-i.com/ASIHTTPRequest/How-to-use 顶部得到的
【讨论】:
查看 Horak 的回答以了解您的回答。【参考方案3】:谢谢兰德尔。 startSynchronous 可能有点用词不当。这是方法定义:
- (void)startSynchronous
#if DEBUG_REQUEST_STATUS || DEBUG_THROTTLING
ASI_DEBUG_LOG(@"[STATUS] Starting synchronous request %@",self);
#endif
[self setSynchronous:YES];
[self setRunLoopMode:ASIHTTPRequestRunLoopMode];
[self setInProgress:YES];
if (![self isCancelled] && ![self complete])
[self main];
while (!complete)
[[NSRunLoop currentRunLoop] runMode:[self runLoopMode] beforeDate:[NSDate distantFuture]];
[self setInProgress:NO];
【讨论】:
startSynchronous 阻塞直到请求完成。您需要的所有信息将在完成时提供。 啊,很好 - 我已经将该调用切换到 [request startAsynchronous]。然而我的响应返回null。知道为什么会这样吗? 我认为您误解了 ASIHTTPRequest 的工作原理。这是一个试图更好地解释它的要点。 gist.github.com/9f4fd7c1749b3ffe8d6e 所以我发现当我使用 startSynchronous 时一切正常,而我的问题出在其他地方(请参阅我的其他答案 - 甚至在实现你的要点之前 - 顺便感谢一下)。如何更改我的 loginWithName 和 startNetworkPOSTRequest 以支持 startAsynchronous?我已经阅读了文档,看起来他们正在以与我相同的方式使用块。不过,我相信,问题在于我的 return 语句超出了块的范围——我该如何解决? 我知道你不使用返回,你会想要块中的回调函数。我不知道该怎么做。 @Randall 你能加点颜色吗?以上是关于设备和模拟器上的调试工作时,临时 iPhone SIGSEGV 崩溃的主要内容,如果未能解决你的问题,请参考以下文章
iPhone SDK:可以通过iPad设备访问Localhost吗? (调试时)