【问题标题】:Network code stopping with SIGPIPE使用 SIGPIPE 停止网络代码
【发布时间】:2015-08-25 06:52:33
【问题描述】:

我正在使用 iOS 进行开发。

App调用库中的函数,通过wifi发送数据包。

当应用程序运行时,我按下 iPhone 5C 上的电源按钮(不是主页按钮)并再次按下以打开它。但它崩溃了......

而且它没有显示哪一行是错误的,它只显示如下图的错误:

如何通过上图分析这个崩溃日志?

提前致谢。

【问题讨论】:

  • 什么库中有什么函数?
  • 在控制台输入bt你会看到更详细的回溯
  • @siemian 对不起...你能解释更多细节吗?我应该在哪里输入bt
  • @Martin 您是否为所有异常启用了断点?
  • @Martin,xcode 底部的控制台

标签: ios objective-c iphone sigpipe


【解决方案1】:

如苹果所说,在Avoiding Common Networking Mistakes中,需要处理或禁用SIGPIPE

有效地使用 POSIX 套接字(如果有的话)。

如果您直接使用 POSIX 套接字:

  • 处理或禁用 SIGPIPE。

默认情况下,当连接关闭时,您的 进程收到SIGPIPE 信号。如果您的程序无法处理或 忽略此信号,您​​的程序将立即退出。你可以处理 这通过以下两种方式之一:

使用以下代码行全局忽略信号:

signal(SIGPIPE, SIG_IGN);

告诉套接字不要发送信号 第一个地方是下面的代码行(替换 包含您的套接字的变量代替sock):

int value = 1;
setsockopt(sock, SOL_SOCKET, SO_NOSIGPIPE, &value, sizeof(value));

为了获得最大的兼容性,您应该在每个传入的 除了设置 监听套接字本身的标志。

【讨论】:

  • 我只想提一下,尽管我的程序中有“信号(SIGPIPE,SIG_IGN)”,但我经历了与 OP 图片中的完全一样的崩溃。我认为它发生在我的应用程序被暂停之后,或者至少被置于后台,然后再次被激活。无论如何,现在我也添加了第二种技术,并且已经过了我的手指。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-25
  • 2012-07-03
  • 2018-04-29
  • 2014-04-05
  • 1970-01-01
  • 2021-01-16
相关资源
最近更新 更多