iOS开发笔记之十四——Xcode 6.0.1下出现Thread 1: signal SIGPIPE问题的参考解决方案

来源:互联网 发布:域名过期 备案信息 编辑:程序博客网 时间:2024/05/16 09:44

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

http://blog.csdn.net/onlyou930/article/details/16116553

http://blog.csdn.net/sever2012/article/details/8281163

0 0
原创粉丝点击