无法注册BoringSSL日志调试更新

uer*_*ceg 19 logging ios11 xcode9-beta

当在安装了iOS 11 beta的iPhone上运行时调试Xcode 9 beta中的应用程序时,我在执行网络呼叫时开始注意到以下消息:

[] network_config_register_boringssl_log_debug_updates Failed to register for BoringSSL log debug updates
[BoringSSL] Function boringssl_context_get_peer_npn_data: line 1212 Peer's advertised NPN data is NULL or empty
Run Code Online (Sandbox Code Playgroud)

知道是什么导致了这个吗?

sto*_*roj 49

更新

实际上有一种非常方便的方法可以使特定模拟器的某些日志静音:

xcrun simctl spawn booted log config --subsystem com.apple.network --category boringssl --mode level:off
Run Code Online (Sandbox Code Playgroud)

还建议静默其他常见的不重要日志:

xcrun simctl spawn booted log config --subsystem com.apple.CoreBluetooth --mode level:off
xcrun simctl spawn booted log config --subsystem com.apple.CoreTelephony --mode level:off
Run Code Online (Sandbox Code Playgroud)

原始答案(背景)

这些烦人的消息来自libboringssl.dylib :: boringssl_metrics_log_event

int boringssl_metrics_log_event(...) {
  ...
  if (g_boringssl_log != nil && os_log_type_enabled(g_boringssl_log, OS_LOG_TYPE_ERROR) {
    os_log_error(g_boringssl_log, "%s(%d) Failed to log metrics", "boringssl_metrics_log_metric_block_invoke", 151);
  }
  ...
}
Run Code Online (Sandbox Code Playgroud)

消除这些消息的一个简单方法是 nullify g_boringssl_log

g_boringssl_log是一个全局变量:

os_log_t g_boringssl_log = nil;
Run Code Online (Sandbox Code Playgroud)

它在以下位置初始化boringssl_log_open

void boringssl_log_open() {
   static dispatch_token onceToken = nil;
   dispatch_once(onceToken, ^{
     g_boringssl_log = os_log_create("com.apple.network", "boringssl");
   });
}
Run Code Online (Sandbox Code Playgroud)

IMO 最简单的无效解决方案g_boring_ssl是跳过dispatch_once.

__boringssl_log_open_block_invoke这可以通过在with action中设置断点来实现thread return。由于 ,该断点将被调用一次dispatch_once,但由于立即 ,函数体不会被执行thread return。所以g_boringssl_log永远不会被初始化,并且控制台中不会有任何日志。

PS 我可能还建议为____nwlog_connection_log_block_invokefrom设置一个类似的断点libnetwork.dylib

断点示例

  • 不太清楚你在那里做了什么,你可以尝试其他解释吗? (2认同)
  • Xcode 中的@Arturo 转到菜单“调试”>“断点”>“创建符号断点”并填写以下 storoj 屏幕截图的表格 (2认同)

jos*_*ons 13

打开Xcode Scheme编辑器并添加一个新的环境变量OS_ACTIVITY_MODE并设置为disable.

在此输入图像描述

  • 该解决方案不应被接受 - 它会导致重要的诊断消息消失。 (22认同)
  • 这究竟是做什么的? (5认同)
  • 为什么这是一个公认的答案?问题是"造成这种情况的原因是什么?",而不是"如何隐藏它?" (5认同)
  • 这个答案抑制了日志,但没有解释实际的错误,也没有提到它的确切修复。 (5认同)
  • 这种方法似乎停止了所有 NSLog 日志记录,这是一个问题。有关基于上述答案但不消除所有 NSLog 日志记录的更细致的方法,请参阅 cduhn 的答案 [隐藏奇怪的不需要的 Xcode 8 日志](/sf/ask/2646055331/奇怪的不需要的 xcode-8-logs)。 (3认同)