IOS开发笔记之七——Xcode 6.0.1下出现Thread 1: signal SIGPIPE问题的参考解决方案
2014-09-22 15:11
609 查看
1、问题描述
模拟器调试时,客户端切换到不同的开发站点,会导致应用程序进入一种无法离开的debug状态,打印堆栈结果如下:
(lldb) bt
* thread #1: tid = 0x30068, 0x07556f96 libsystem_platform.dylib`_platform_memcmp + 150, queue = 'com.apple.main-thread',stop reason = signal SIGPIPE
* frame #0: 0x07556f96 libsystem_platform.dylib`_platform_memcmp + 150
frame #1: 0x061616da CoreFoundation`__CFStringEqual + 394
frame #2: 0x061614ba CoreFoundation`CFEqual + 218
frame #3: 0x06178b2b CoreFoundation`-[__NSCFString isEqual:] + 283
frame #4: 0x0618e3ac CoreFoundation`-[__NSDictionaryM objectForKey:] + 156
frame #5: 0x0e506da8 CoreUI`-[CUIStructuredThemeStore renditionWithKey:] + 347
frame #6: 0x0e517eb9 CoreUI`-[CUINamedImage _renditionForSpecificKey:] + 194
frame #7: 0x0e517f05 CoreUI`-[CUINamedImage _rendition] + 46
frame #8: 0x0e517f2c CoreUI`-[CUINamedImage image] + 34
frame #9: 0x03ba29a2 UIKit`__98-[_UIAssetManager imageNamed:scale:idiom:subtype:cachingOptions:sizeClassPair:attachCatalogImage:]_block_invoke + 332
frame #10: 0x03ba27a5 UIKit`-[_UIAssetManager imageNamed:scale:idiom:subtype:cachingOptions:sizeClassPair:attachCatalogImage:] + 188
frame #11: 0x03cbdf83 UIKit`-[UIImageAsset imageWithTraitCollection:] + 595
frame #12: 0x035f5b35 UIKit`-[UIImageView _resolveImageForTrait:] + 308
frame #13: 0x035f59fa UIKit`-[UIImageView traitCollectionDidChange:] + 57
看原因可知,是由于SIGPIPE导致的。查阅下资料看下这个SIGPIPE到底是个什么东西。
2、问题原因:
在ios手机client请求到Server端试图建立TCP连接时,往往需要多次请求,中间会有失败的请求,所以服务器会经常去close一个连接,在TCP连接中,client会收到
一个RST响应。之前如果client已发出的数据,系统会发出SIGPIPE信号给client进程,告诉进程这个连接已经失效,不要再去写数据了。若根据默认规则,应用程
序进程会被terminate,client的进程会退出。根据测试的现象来看,IOS应用程序并没有直接退出,看来是做了SIGPIPE信号屏蔽处理,屏蔽处理让app收到SIGPIPE
信号之后不会crash。但是会在进行debug调试时触发debug中断,正如上述现象。
3、参考解决方案
要从根本上解决这个问题,需要服务端与客户端协同进行修改处理。但是在客户端别人提供了个临时解决的办法,就是在调试入口设置断点,让debug console进入
gdb或是lldb状态。我们IOS开发使用的是LLVM,所以使用process handle SIGPIPE -s false。
gdb
handle SIGPIPE nostop
lldb
process handle SIGPIPE -s false
断点设置如下:
之后形成断点如下:
4、参考资料
http://antbruce10.blog.163.com/blog/static/21541111720140844435786/
http://blog.chinaunix.net/uid-9435177-id-2002671.html
/article/7765188.html
/article/8209097.html
模拟器调试时,客户端切换到不同的开发站点,会导致应用程序进入一种无法离开的debug状态,打印堆栈结果如下:
(lldb) bt
* thread #1: tid = 0x30068, 0x07556f96 libsystem_platform.dylib`_platform_memcmp + 150, queue = 'com.apple.main-thread',stop reason = signal SIGPIPE
* frame #0: 0x07556f96 libsystem_platform.dylib`_platform_memcmp + 150
frame #1: 0x061616da CoreFoundation`__CFStringEqual + 394
frame #2: 0x061614ba CoreFoundation`CFEqual + 218
frame #3: 0x06178b2b CoreFoundation`-[__NSCFString isEqual:] + 283
frame #4: 0x0618e3ac CoreFoundation`-[__NSDictionaryM objectForKey:] + 156
frame #5: 0x0e506da8 CoreUI`-[CUIStructuredThemeStore renditionWithKey:] + 347
frame #6: 0x0e517eb9 CoreUI`-[CUINamedImage _renditionForSpecificKey:] + 194
frame #7: 0x0e517f05 CoreUI`-[CUINamedImage _rendition] + 46
frame #8: 0x0e517f2c CoreUI`-[CUINamedImage image] + 34
frame #9: 0x03ba29a2 UIKit`__98-[_UIAssetManager imageNamed:scale:idiom:subtype:cachingOptions:sizeClassPair:attachCatalogImage:]_block_invoke + 332
frame #10: 0x03ba27a5 UIKit`-[_UIAssetManager imageNamed:scale:idiom:subtype:cachingOptions:sizeClassPair:attachCatalogImage:] + 188
frame #11: 0x03cbdf83 UIKit`-[UIImageAsset imageWithTraitCollection:] + 595
frame #12: 0x035f5b35 UIKit`-[UIImageView _resolveImageForTrait:] + 308
frame #13: 0x035f59fa UIKit`-[UIImageView traitCollectionDidChange:] + 57
看原因可知,是由于SIGPIPE导致的。查阅下资料看下这个SIGPIPE到底是个什么东西。
2、问题原因:
在ios手机client请求到Server端试图建立TCP连接时,往往需要多次请求,中间会有失败的请求,所以服务器会经常去close一个连接,在TCP连接中,client会收到
一个RST响应。之前如果client已发出的数据,系统会发出SIGPIPE信号给client进程,告诉进程这个连接已经失效,不要再去写数据了。若根据默认规则,应用程
序进程会被terminate,client的进程会退出。根据测试的现象来看,IOS应用程序并没有直接退出,看来是做了SIGPIPE信号屏蔽处理,屏蔽处理让app收到SIGPIPE
信号之后不会crash。但是会在进行debug调试时触发debug中断,正如上述现象。
3、参考解决方案
要从根本上解决这个问题,需要服务端与客户端协同进行修改处理。但是在客户端别人提供了个临时解决的办法,就是在调试入口设置断点,让debug console进入
gdb或是lldb状态。我们IOS开发使用的是LLVM,所以使用process handle SIGPIPE -s false。
gdb
handle SIGPIPE nostop
lldb
process handle SIGPIPE -s false
断点设置如下:
之后形成断点如下:
4、参考资料
http://antbruce10.blog.163.com/blog/static/21541111720140844435786/
http://blog.chinaunix.net/uid-9435177-id-2002671.html
/article/7765188.html
/article/8209097.html
相关文章推荐
- IOS开发笔记之五——Xcode 6.0 Beta编译工程时可能遇到的问题及参考解决方案
- iOS开发之使用CocoaPods更新第三方出现“target overrides the `CLANG_CXX_LANGUAGE_STANDARD`……”问题解决方案
- iOS Xcode7.2开发时使用SBJson解析时 出现野指针的问题解决
- android开发录音时出现Fatal signal 11 (SIGSEGV) at 0x00000010 (code=1), thread 16909 (umu.mediarecord)的解决方案
- IOS开发笔记(七)---对iOS多视图开发的补充(针对XCode4.2开发环境,Empty Application没有XIB/Storyboard文件的问题)
- 关于IOS开发工具XCode工具出现 OS APPle LLVM 5.02 error问题
- 关于IOS开发工具XCode工具出现 OS APPle LLVM 5.02 error问题
- IOS开发笔记(七)---对iOS多视图开发的补充(针对XCode4.2开发环境,Empty Application没有XIB/Storyboard文件的问题)
- IOS开发笔记(七)---对iOS多视图开发的补充(针对XCode4.2开发环境,Empty Application没有XIB/Storyboard文件的问题)
- IOS开发学习笔记之问题集锦解决方案
- iOS开发 - Xcode7下解决使用三方库出现的warning问题
- [置顶] 【iOS开发】Xcode证书问题报错解决方案集锦
- 苹果开发 笔记(80)升级IOS 9 和 XCode 7 引起的问题记录
- iOS 开发 Xcode 8.1 插件无法失效无法使用的问题--完美解决方案
- 苹果开发 笔记(80)升级IOS 9 和 XCode 7 引起的问题记录
- [操作系统]iOS开发之使用CocoaPods更新第三方出现“target overrides the `OTHER_LDFLAGS`……”问题解决方案
- IOS开发笔记之二——Xcode 5.0 EXC_BAD_ACCESS 解决方案之一
- iOS开发参考:iOS应用开发八大问题
- 【iOS-Cocos2d游戏开发之十八】解决滚屏背景/拼接地图有黑边(缝隙)/动画播放出现毛边以及禁止游戏中自动锁屏问题!【2011年12月18日补充】
- IOS开发笔记 (4) ---第一个IOS界面程序兼谈IB在XCode4.2中的应用